大熊猫有效地计算滚动功能

时间:2018-05-05 06:31:31

标签: python pandas

我需要使用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。 Pandas rolling().mean()始终计算所有系列数据

这是一个简单的例子,但在我的实际项目中,范围超过1,000,000系列,每个滚动计算耗费大量时间

有没有办法在熊猫中解决这个问题?

1 个答案:

答案 0 :(得分:1)

正如Anton vBR在他的评论中写道,在你追加行后,你可以用

计算最后一个值
ser.tail(20).mean

花费时间独立于系列长度(在您的示例中为1000000)。

如果经常进行此操作,则可以更有效地计算它。附加行后的平均值为:

  • 倒数第二行的平均值的20倍
  • 加上最新的附加值
  • 减去最后一个索引的值
  • 除以20

但实施起来比较复杂。

相关问题