2015-05-20 2 views
0

Что у меня есть:панды rolling_max с GroupBy

Sym Date close 
A 1-Jan 45 
A 2-Jan 15 
A 3-Jan 55 
B 1-Jan 41 
B 2-Jan 87 
B 3-Jan 82 
C 1-Jan 33 
C 2-Jan 15 
C 3-Jan 46 

Что мне нужно

Sym Date close rolling_max_2day 
A 1-Jan 45 NaN 
A 2-Jan 15 45 
A 3-Jan 55 55 
B 1-Jan 41 NaN 
B 2-Jan 87 87 
B 3-Jan 82 87 
C 1-Jan 33 NaN 
C 2-Jan 15 33 
C 3-Jan 46 46 

dataframe df это с многократным индексом (Sym, Дата)

Я попытался, как это:

df['rolling_max_2day'] = df.groupby(level=['sym']).apply(lambda x:pd.rolling_max(x['close'].values,2)) 

не возвращает никаких ошибок, но также возвращает все нулевое значение в столбце rolling_max_2day

Однако, если только этот код не добавляется к df, я могу получить правильную серию.

df.groupby(level=['sym']).apply(lambda x:pd.rolling_max(x['close'].values,2)) 

Спасибо!

ответ

1

Вы можете применить на df.groupby('Sym')['close'] с помощью pd.rolling_max(x, 2) вместо

In [124]: df['rolling_max_2day'] = (df.groupby('Sym')['close'] 
             .apply(lambda x:pd.rolling_max(x, 2))) 

In [125]: df 
Out[125]: 
    Sym Date close rolling_max_2day 
0 A 1-Jan  45    NaN 
1 A 2-Jan  15    45 
2 A 3-Jan  55    55 
3 B 1-Jan  41    NaN 
4 B 2-Jan  87    87 
5 B 3-Jan  82    87 
6 C 1-Jan  33    NaN 
7 C 2-Jan  15    33 
8 C 3-Jan  46    46 
+0

Это работает! Однако, почему мой mothod не является правильным? – seizetheday

Смежные вопросы