Pandas caculation функции прокатки эффективно - PullRequest
0 голосов
/ 05 мая 2018

Мне нужно рассчитать скользящее среднее, используя pandas.

ser = pd.Series(np.random.randn(100), 
                index=pd.date_range('1/1/2000', periods=100, freq='1min'))

ser.rolling(window=20).mean().tail(5)

[Out]
2000-01-01 01:35:00    0.390383
2000-01-01 01:36:00    0.279308
2000-01-01 01:37:00    0.173532
2000-01-01 01:38:00    0.194097
2000-01-01 01:39:00    0.194743
Freq: T, dtype: float64

Но после добавления новой строки, как это,

new_row = pd.Series([1.0], index=[pd.to_datetime("2000-01-01 01:40:00")])
ser = ser.append(new_row)

Я должен пересчитать все движущиеся данные, как это,

ser.rolling(window=20).mean().tail(5)

[Out]
2000-01-01 01:36:00    0.279308
2000-01-01 01:37:00    0.173532
2000-01-01 01:38:00    0.194097
2000-01-01 01:39:00    0.194743
2000-01-01 01:40:00    0.201918
dtype: float64

Я думаю, мне просто нужно вычислить последние данные 2000-01-01 01:40:00 0.201918, но я не могу найти pandas api, который вычисляет только значение последней добавленной строки. Панды rolling().mean() всегда рассчитывают все данные серии

Это простой пример, но в моем реальном проекте диапазон составляет более 1 000 000 серий, и каждый скользящий расчет занимает много времени

Есть ли способ решить эту проблему в пандах?

1 Ответ

0 голосов
/ 05 мая 2018

Как написал Антон ВБР в своем комментарии, после добавления строки вы можете вычислить последнее значение с помощью

ser.tail(20).mean

, что занимает время, не зависящее от длины серии (в вашем примере 1000000).

Если вы часто выполняете эту операцию, вы можете вычислить ее более эффективно. Среднее значение после добавления строки:

  • в 20 раз больше среднего значения предпоследнего ряда
  • плюс последнее добавленное значение
  • минус значение в 21 последнем индексе
  • делится на 20

Однако это сложнее реализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...