在Pandas中计算稀疏/不规则时间序列的EWMA

3

考虑以下高频但稀疏的时间序列:

#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函数计算半衰期为5ms的指数加权移动平均值,具体操作如下:

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

然而,在实现过程中,该函数使用1毫秒的间隔(即我提供的'freq')重新采样我的时间序列。这会导致输出中包含成千上万个额外的数据点。

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也是一个不错的选择。 - JohnE
1个回答

0

您可以使用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甚至更多。 - nickos556

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接