Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算熊猫中稀疏/不规则时间序列上的EWMA_Python_Numpy_Pandas_Signal Processing - Fatal编程技术网

Python 计算熊猫中稀疏/不规则时间序列上的EWMA

Python 计算熊猫中稀疏/不规则时间序列上的EWMA,python,numpy,pandas,signal-processing,Python,Numpy,Pandas,Signal Processing,鉴于以下高频但稀疏的时间序列: #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)) 我可以使

鉴于以下高频但稀疏的时间序列:

#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))
我可以使用熊猫函数计算半寿命为5ms的指数加权移动平均值,如下所示:

ema = pd.ewma(ts, halflife=5, freq='ms')
但是,在引擎盖下,该函数以1毫秒的间隔对我的时间序列重新采样(这是我提供的“频率”)。这导致输出中包含数千个额外的数据点

In [118]: len(ts)
Out[118]: 20
In [119]: len(ema)
Out[119]: 10010
这是不可伸缩的,因为我的real Timeseries包含数十万个相隔几分钟或几小时的高频观测

是否有一种无需重新采样就可以计算稀疏时间序列的EMA的Pandas/numpy方法?类似于此:


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

您可以使用
reindex
ewma
结果与原始序列对齐

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或更多。根据链接,公式只需几行。如果我是你的话,我会把它编出来——可能是一个numba函数,因为它看起来不容易矢量化。虽然如果你能用cumsum/cumprod写下这个公式,它会相当快吗?我不知道,在numba应该很简单,否则我想cython也是一个不错的选择。