Скользящий временной ряд с заданными c (отфильтрованными) рабочими днями в pandas - PullRequest
1 голос
/ 19 февраля 2020

У меня есть 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

Но для больших временных рядов это очень долго. Можно ли сделать это с помощью функции прокатки на всей серии?

...