我正在尝试使用Pandas ewm function来计算指数加权移动平均值。但是我注意到,信息似乎贯穿了整个时间序列。这意味着每个数据点的MA都依赖于不同数量的先前数据点。因此,每个数据点的ewm函数在数学上是不同的。

我认为这里有些人也有类似的问题

Does Pandas calculate ewm wrong?

但是我确实尝试了他们的方法,但是我没有得到我想要的功能。

 def EMA(arr, window):
     sma = arr.rolling(window=window, min_periods=window).mean()[:window]
     rest = arr[window:]
     return pd.concat([sma, rest]).ewm(com=window, adjust=False).mean()


 a = pd.DataFrame([x for x in range(100)])
 print(list(EMA(a, 10)[0])[-1])
 print(list(EMA(a[50:], 10)[0])[-1])


在此示例中,我有一个1到100的数组。我在该数组和50-100的数组上计算移动平均值。最后的移动平均值应该是相同的,因为我仅使用10的窗口。但是当我运行此代码时,我得到两个不同的值,这表明ewm确实取决于整个序列。

最佳答案

IIUC,您要在滚动窗口中要求ewm,这意味着每10行返回一个数字。如果是这样,那么我们可以使用跨步技巧:

编辑:更新功能仅适用于系列

def EMA(arr, window=10, alpha=0.5):
    ret = pd.Series(index=arr.index, name=arr.name)

    arr=np.array(arr)
    l = len(arr)
    stride = arr.strides[0]

    ret.iloc[window-1:] = (pd.DataFrame(np.lib.stride_tricks.as_strided(arr,
                                                                       (l-window+1,window),
                                                                       (stride,stride)))
                          .T.ewm(alpha)
                          .mean()
                          .iloc[-1]
                          .values
                           )
    return ret


测试:

a = pd.Series([x for x in range(100)])

EMA(a).tail(2)
# 98    97.500169
# 99    98.500169
# Name: 9, dtype: float64

EMA(a[:50]).tail(2)
# 98    97.500169
# 99    98.500169
# Name: 9, dtype: float64

EMA(a, 2).tail(2)
98    97.75
99    98.75
dtype: float64


测试随机数据:

a = pd.Series(np.random.uniform(0,1,10000))
fig, ax = plt.subplots(figsize=(12,6))
a.plot(ax=ax)
EMA(a,alpha=0.99, window=2).plot(ax=ax)
EMA(a,alpha=0.99, window=1500).plot(ax=ax)

plt.show()


输出:我们可以看到,较大的窗口(绿色)比较小的窗口(橙色)易挥发。

python - 有没有办法让Pandas ewm在固定窗口上运行?-LMLPHP

关于python - 有没有办法让Pandas ewm在固定窗口上运行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58012189/

10-09 08:51