2014-12-10 3 views
2

Я хочу resample a DataFrame, содержащий внутридневные данные по объему рынка и рыночным ценам с использованием внешнего Series с datetime в нем.Pandas: resample with a external Серия

Образец моего DataFrame называется df будет выглядеть примерно так:

(EDIT: исправлены ошибки в образце набора данных)

Datetime    Volume Price 
2013-04-15 21:45:00  100  50.00 
2013-04-15 21:47:00  25  50.03 
2013-04-15 21:52:00  15  50.05 
2013-04-15 22:03:00  4  50.07 
2013-04-15 22:04:00  145  50.38 
2013-04-15 22:07:00  68  50.04 
2013-04-15 22:12:00  157  49.93 
2013-04-15 22:13:00  27  50.02 
2013-04-15 22:19:00  37  49.91 

Series называется beginpoints (это являются beginpoints из каждый интервал) и выглядит так:

0  2013-04-15 21:45:00 
1  2013-04-15 22:04:00 
2  2013-04-15 22:13:00 

Учитывая, что я заинтересован Ted в сумме объема и цены открытия интервала я в конечном счете хочу иметь следующее решение:

Datetime    Volume  Price 
2013-04-15 21:45:00  144  50.00 
2013-04-15 22:04:00  370  50.38 
2013-04-15 22:13:00  64   50.02 

Я знаю, что стандарт передискретизации идет что-то вроде df.resample(‘5min’, how={‘Volume’:sum, ‘Price’:first}) для, например, 5-минутные интервалы. Однако, когда я пытаюсь изменить это на свой конкретный сценарий и, следовательно, использую df.resample(beginpoints, how={‘Volume’:sum, ‘Price’:first}), я получаю ValueError. Это кажется довольно простым, но я не могу понять, что я делаю неправильно. Кто-нибудь понял, как решить эту проблему? Благодаря!

+0

Там дублируются datetim e в 'df', как 22:08:00. Действительно ли они действительны? –

+0

Вы совершенно правы, я сделал глупую ошибку в составлении какой-то даты, слишком быстро. Теперь это исправлено. Спасибо, что указали это. – Pilik

ответ

2

Я предложу подход. Прежде всего, я возвращаю индекс beginpoints и делаю beginpoints в качестве индекса.

После этого колонка index извлекается как серия для картирования Datetime колонка в df. Имеются значения Datetime, которые не входят в состав beginpoints, что соответствует point Н/Д. Но так как Datetime сортируется, мы можем использовать ffill, чтобы заполнить эти N/A.

s = pd.Series(["2013-04-15 21:45:00", "2013-04-15 22:04:00","2013-04-15 22:13:00"], name="beginpoints") 

t = s.reset_index().set_index("beginpoints") 
ts = t['index'] 

df['point'] = df['Datetime'].map(ts).fillna(method="ffill") 

Результат:

   Datetime Volume Price point 
0 2013-04-15 21:45:00  100 50.00  0 
1 2013-04-15 21:47:00  25 50.03  0 
2 2013-04-15 21:52:00  15 50.05  0 
3 2013-04-15 22:03:00  4 50.07  0 
4 2013-04-15 22:04:00  145 50.38  1 
5 2013-04-15 22:07:00  68 50.04  1 
6 2013-04-15 22:12:00  157 49.93  1 
7 2013-04-15 22:13:00  27 50.02  2 
8 2013-04-15 22:19:00  37 49.91  2 

Наконец, просто использовать groupby для расчета резюме на основе point: Результат

group= df.groupby(['point']) 

df2 = pd.DataFrame() 
df2['Datetime'] = group[['Datetime']].first() 
df2['Volume'] = group[['Volume']].sum() 
df2['Price'] = group[['Price']].first() 

:

   Datetime Volume Price 
0 2013-04-15 21:45:00  144 50.00 
1 2013-04-15 22:04:00  370 50.38 
2 2013-04-15 22:13:00  64 50.02 
+0

Спасибо, умное решение, сочетающее 'reset_index',' set_index' и 'map'. Работает отлично! – Pilik