Pandas скользящее среднее по группам с различным размером окна - скользящее среднее с другим периодом - PullRequest
0 голосов
/ 23 марта 2020

Постановка задачи: Попытка вычислить простое скользящее среднее с Pandas groupby, используя разные периоды для каждой группы.

Пример: у меня есть непрерывные контракты S & P E-mini, пытающиеся найти простое скользящее среднее, но хочу использовать другой период. В приведенном ниже примере я хочу рассчитать 5-дневную SMA для C1, 7-дневную SMA для C2, 10-дневную SMA для C3 и т. Д. c. Я получаю значения периода из конфигурации.

Date          |Contract| Close       | Period| SMA 
3/23/2020     | C1     | 2210.50     | 5     | 2335.58 
3/22/2020     | C1     | 2191.50     | 5     | 2374.73 
3/20/2020     | C1     | 2389.00     | 5     | 2473.21 
3/19/2020     | C1     | 2401.40     | 5     | 2489.19 
3/18/2020     | C1     | 2485.50     | 5     | 2502.69 
3/17/2020     | C1     | 2406.25     | 5     | 2553.65 
3/16/2020     | C1     | 2683.90     | 5     |
3/15/2020     | C1     | 2468.90     | 5     |
3/13/2020     | C1     | 2468.90     | 5     |
3/12/2020     | C1     | 2740.30     | 5     |
…..
3/23/2020     | C2     | 2219.45     | 7     | 2403.69
3/22/2020     | C2     | 2199.30     | 7     | 2440.39
3/20/2020     | C2     | 2396.50     | 7     | 2480.07
3/19/2020     | C2     | 2410.20     | 7     | 2530.51
3/18/2020     | C2     | 2493.90     | 7     |
3/17/2020     | C2     | 2413.90     | 7     |
3/16/2020     | C2     | 2692.60     | 7     |
3/15/2020     | C2     | 2476.35     | 7     |
3/13/2020     | C2     | 2477.05     | 7     |
3/12/2020     | C2     | 2749.55     | 7     |

Я пытался использовать скользящее окно, но не смог использовать период динамического / настраиваемого окна.

df['sma'] = df.groupby('Contract')['Close'].rolling(<<period - not able to use>>).mean().reset_index(0,drop=True)

Есть ли способ использовать настраиваемый параметр для параметра window?

1 Ответ

0 голосов
/ 23 марта 2020

Если вы хотите сохранить контракт

dict_periods = {"C1": 5, "C2":7, "C3": 10}
period = lambda z: dict_periods[z['Contract'].iloc[0]]
ma = lambda df: df['Close'].rolling(period(df)).mean()
df.groupby('Contract', as_index=False).apply(ma)

В противном случае вернитесь к вашему reset_index(0, drop=True)

...