【问题标题】:Pandas caculating rolling functions efficiently熊猫有效地计算滚动功能
【发布时间】:2018-05-05 15:13:20
【问题描述】:

我需要使用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 个系列,每次滚动计算都消耗大量时间

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

【问题讨论】:

  • 选择最后 20 个值(例如使用 tail(20))并执行 .mean() ?

标签: python pandas


【解决方案1】:

正如 Anton vBR 在他的评论中所写,在附加行后,您可以计算最后一个值

ser.tail(20).mean

这需要与系列长度无关的时间(在您的示例中为 1000000)。

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

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

不过,这实现起来更复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-23
    • 2019-04-26
    • 2018-03-10
    • 2019-11-19
    • 2018-07-10
    • 2017-09-21
    • 1970-01-01
    • 2021-08-20
    相关资源
    最近更新 更多