Скользящая сумма с указанием даты и времени в Пандах

1

У меня есть многомерные временные ряды/данные панели в следующем упрощенном формате:

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

Любые советы о том, что я могу делать неправильно или высокопроизводительные альтернативы, были бы замечательными!

РЕДАКТИРОВАТЬ:

Одно быстрое разъяснение. Этот пример упрощен, и действительные решения должны иметь возможность обрабатывать неравномерно разнесенные/нерегулярные временные ряды, поэтому используется кастинг с использованием индекса времени.

Теги:
pandas

1 ответ

1

Вы все еще можете использовать 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
  • 0
    "Вагон" Отлично. У вас есть хороший ресурс, который точно объясняет, что такое wincar-тип boxcar и, возможно, другие win_types? +1
  • 0
    Спасибо за ваш вклад! К сожалению, это умное использование shift () будет работать только для этого упрощенного примера, но не для моей реальной задачи. В моей реальной задаче я буду кататься 365 дней в будущем.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню