У меня есть многомерные временные ряды/данные панели в следующем упрощенном формате:
id,date,event_ind
1,2014-01-01,0
1,2014-01-02,1
1,2014-01-03,1
2,2014-01-01,1
2,2014-01-02,1
2,2014-01-03,1
3,2014-01-01,0
3,2014-01-02,0
3,2014-01-03,1
Для этого упрощенного примера я хотел бы, чтобы будущая 2-дневная сумма event_ind сгруппирована по id
По какой-то причине адаптация этого примера по-прежнему дает мне "индекс не является монотонной ошибкой": как сделать форвардную текущую сумму в пандах?
Вот мой подход, который иначе работал для прошлой прокатки по группе, прежде чем я ее адаптировал:
df.sort_values(['id','date'], ascending=[True,True], inplace=True)
df.reset_index(drop=True, inplace=True)
df['date'] = pd.DatetimeIndex(df['date'])
df.set_index(['date'], drop=True, inplace=True)
rolling_forward_2_day = lambda x: x.iloc[::-1].rolling('2D').sum().shift(1).iloc[::-1]
df['future_2_day_total'] = df.groupby(['id'], sort=False)['event_ind'].transform(rolling_forward_2_day)
df.reset_index(drop=False, inplace=True)
Вот ожидаемый результат:
id date event_ind future_2_day_total
0 1 2014-01-01 0 2
1 1 2014-01-02 1 1
2 1 2014-01-03 1 0
3 2 2014-01-01 1 2
4 2 2014-01-02 1 1
5 2 2014-01-03 1 0
6 3 2014-01-01 0 1
7 3 2014-01-02 0 1
8 3 2014-01-03 1 0
Любые советы о том, что я могу делать неправильно или высокопроизводительные альтернативы, были бы замечательными!
РЕДАКТИРОВАТЬ:
Одно быстрое разъяснение. Этот пример упрощен, и действительные решения должны иметь возможность обрабатывать неравномерно разнесенные/нерегулярные временные ряды, поэтому используется кастинг с использованием индекса времени.
Вы все еще можете использовать rolling
здесь, но использовать его с флагом win_type='boxcar'
и перенести данные вокруг до и после того, как вам сумму:
df['future_day_2_total'] = (
df.groupby('id').event_ind.shift(-1)
.fillna(0).groupby(df.id).rolling(2, win_type='boxcar')
.sum().shift(-1).fillna(0)
)
id date event_ind future_day_2_total
0 1 2014-01-01 0 2.0
1 1 2014-01-02 1 1.0
2 1 2014-01-03 1 0.0
3 2 2014-01-01 1 2.0
4 2 2014-01-02 1 1.0
5 2 2014-01-03 1 0.0
6 3 2014-01-01 0 1.0
7 3 2014-01-02 0 1.0
8 3 2014-01-03 1 0.0