【问题标题】:Compute EWMA over sparse/irregular TimeSeries in Pandas在 Pandas 中计算稀疏/不规则时间序列的 EWMA
【发布时间】:2015-10-24 11:35:48
【问题描述】:

给定以下高频但稀疏的时间序列:

#Sparse Timeseries
dti1 = pd.date_range(start=datetime(2015,8,1,9,0,0),periods=10,freq='ms')
dti2 = pd.date_range(start=datetime(2015,8,1,9,0,10),periods=10,freq='ms')
dti = dti1 + dti2

ts = pd.Series(index=dti, data=range(20))

我可以使用 pandas 函数计算半衰期为 5 毫秒的指数加权移动平均值,如下所示:

ema = pd.ewma(ts, halflife=5, freq='ms')

但是,在后台,该函数以 1 毫秒的间隔重新采样我的时间序列(这是我提供的“频率”)。这会导致输出中包含数千个额外的数据点。

In [118]: len(ts)
Out[118]: 20
In [119]: len(ema)
Out[119]: 10010

这是不可扩展的,因为我的真实时间序列包含数十万个间隔几分钟或几小时的高频观察。

是否有 Pandas/numpy 的方法来计算稀疏时间序列的 EMA 而无需重新采样?类似的东西:http://oroboro.com/irregular-ema/

或者,我必须自己写吗?谢谢!

【问题讨论】:

  • 根据链接,公式只有几行。如果我是你,我只会把它编码——可能是一个 numba 函数,因为它看起来不容易矢量化。虽然也许如果你可以用 cumsum/cumprod 编写公式,它会相当快吗?我不知道,在 numba 中应该很简单,或者我猜 cython 也是一个不错的选择。

标签: python numpy pandas signal-processing


【解决方案1】:

您可以使用reindexewma 结果与您的原始系列对齐。

pd.ewma(ts, halflife=5, freq='ms').reindex(ts.index)

2015-08-01 09:00:00.000     0.0000
2015-08-01 09:00:00.001     0.5346
2015-08-01 09:00:00.002     1.0921
2015-08-01 09:00:00.003     1.6724
2015-08-01 09:00:00.004     2.2750
2015-08-01 09:00:00.005     2.8996
2015-08-01 09:00:00.006     3.5458
2015-08-01 09:00:00.007     4.2131
2015-08-01 09:00:00.008     4.9008
2015-08-01 09:00:00.009     5.6083
2015-08-01 09:00:10.000    10.0000
2015-08-01 09:00:10.001    10.5346
2015-08-01 09:00:10.002    11.0921
2015-08-01 09:00:10.003    11.6724
2015-08-01 09:00:10.004    12.2750
2015-08-01 09:00:10.005    12.8996
2015-08-01 09:00:10.006    13.5458
2015-08-01 09:00:10.007    14.2131
2015-08-01 09:00:10.008    14.9008
2015-08-01 09:00:10.009    15.6083
dtype: float64

【讨论】:

  • 感谢您的建议。是的,我知道这是可能的,但是,这并不能解决可伸缩性问题,因为 pd.ewma() 仍在后台重新采样。例如,想象一下使用 1gb 的输入数据执行此操作 - 当重新采样时,它可能会增长到数百 gb 或更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 2023-01-20
  • 2022-01-03
  • 2013-10-10
  • 1970-01-01
相关资源
最近更新 更多