我使用pandas.ewma
来计算时间序列的指数移动平均值。当新数据附加到时间序列时,我还需要更新其指数移动平均数组。如何在不重新计算时间序列开头的指数移动平均值的情况下执行此操作。
这是我的示例代码
ema = pd.ewma(ts, span = 10)
ts = np.append(ts, [25], 0)
# I would not like to do this to update ema since all of the ema except the last one have already been computed:
ema = pd.ewma(ts, span = 10)
答案 0 :(得分:1)
代数地,显然可以做到这一点。
时间的EWMA m can be shown to be
Σ i = 1 m [α m - i y i ]
假设您对 m 之前的所有值都有此功能(您可以这样做)。对于任何n≥m,EWMA
Σ i = 1 n [α n - i y i ] =Σ< sub> i = 1 m [α n - i y i ] +Σ i = m + 1 < / sub> n [α n - i y i ] 。
对于右手边的第一个词,我们有
Σ i = 1 m [α n - i y i ] =α< sup> n - m Σ i = 1 m [α m - i y i ] ,
正是α n - m 乘以第一个 m 元素上EWMA的最后一个元素。我们称之为 Y m 。
对于右手边的第二个词,我们有
Σ i = m + 1 n [α n - i y i ] = Σ i - m = 1 n - m [α n - m - (i - m) y i - m + m ] = Σ j = 1 n - m [α n - m - j y j + m ]
结合两种简化,我们有
Σ i = 1 n [α n - i y i ] = Σ j = 1 n - m [α n - m - j y j + m ] + < sup> n - m + 1 (Y m /α n - m + 1 )。
这正是 n - m + 1 EWMA的计算,起始元素 Y m /α n - m + 1 < / SUP> 的。因此,没有必要从一开始就计算一切。
我将其留给任何感兴趣的人,最后的技术任务是将其调整为pd.ewma
,例如,通过halflife
间接定义α。 (例如,答案的下注者已经解决了这种结束的问题。)