У меня есть pandas DataFrame с индексом временного ряда и некоторыми значениями. Также вычисляется день недели для каждой даты.
df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4,5,7,4,3,9]},
index = [pd.Timestamp('20130101'),
pd.Timestamp('20130102'),
pd.Timestamp('20130103'),
pd.Timestamp('20130104'),
pd.Timestamp('20130105'),
pd.Timestamp('20130106'),
pd.Timestamp('20130107'),
pd.Timestamp('20130108'),
pd.Timestamp('20130109'),
pd.Timestamp('20130110')])
df['wd'] = df.index.weekday
print(df)
Output:
B wd
2013-01-01 0.0 1
2013-01-02 1.0 2
2013-01-03 2.0 3
2013-01-04 NaN 4
2013-01-05 4.0 5
2013-01-06 5.0 6
2013-01-07 7.0 0
2013-01-08 4.0 1
2013-01-09 3.0 2
2013-01-10 9.0 3
Мне нужно рассчитать скользящие средние значения для указанного c дня недели. Например, для (index == '2013-01-09') и (wd == 1) результат должен быть похож на np.mean ([4,0]) = 2. Стандартная pandas функция прокатки занимает все окно, не отфильтрованное.
Это можно сделать с помощью индексации индекса вручную:
df['wd'] = df.index.weekday
df = df.reset_index().set_index(['index','wd']).sort_index()
dt = pd.to_datetime('2013-01-09')
rolling_wd = 1
val = df.loc[pd.IndexSlice[:dt, rolling_wd], :]['B'].mean()
print(val)
2.0
Но для больших временных рядов это очень долго. Можно ли сделать это с помощью функции прокатки на всей серии?