python - Pandas EWMA 未按预期工作

标签 python pandas

我正在尝试使用 pandas 计算 EWMA,但结果不是我所期望的。我认为第 4 个元素应该是 13.179,但 pandas 给出了 13.121。我通过 documentation 中指定的公式将衰减因子 (a) 转换为质心.我是不是误会了什么?

In[222]: y
Out[222]: 
0          NaN
1          NaN
2    13.192161
3    13.109292
4    12.623850
5    12.150520
Name: data, dtype: float64

In[223]: pd.ewma(y, com = 1.0 / a - 1)
Out[223]: 
0          NaN
1          NaN
2    13.192161
3    13.120667
4    12.701206
5    12.237839
dtype: float64

In[224]: a
Out[224]: 0.8408964152537145

In[225]: a * 13.192161 + (1 - a) * 13.109292
Out[225]: 13.17897624503566

最佳答案

因为文档说

a = com/(1 + com)

由此可见

com = a/(1.0-a)

(对于 0 <= a < 1)。


此外,对开始期间计算的值进行了调整 "to account for imbalance in relative weightings" . 确认公式

enter image description here

让我们关闭该调整:

z = pd.ewma(x, com=a/(1.0-a), adjust=False)
print(z)

然后打印

0         NaN
1         NaN
2    2.098920
3    3.850710
4    5.246548
5    6.344995

这个结果可以通过计算来模拟

import pandas as pd
import numpy as np
import numpy.testing.utils as NTU

nan = np.nan
x = pd.Series([nan, nan, nan, 13.109292, 12.623850, 12.150520])
a = 0.8408964152537145
z = pd.ewma(x, com=a/(1.0-a), adjust=False)

def nanzero(x):
    return 0 if np.isnan(x) else x

x.ffill(inplace=True)
y = [x[0]]
for xt in x[1:]:
    yt1 = y[-1]
    if np.isnan(yt1) and np.isnan(xt):
        yt = nan
    else:
        yt1 = nanzero(yt1)
        xt = nanzero(xt)
        yt = a*yt1 + (1-a)*xt
        # yt = (1-a)*yt1 + a*xt
    y.append(yt)
y = pd.Series(y)

NTU.assert_allclose(y,z)

关于python - Pandas EWMA 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17954314/

相关文章:

python - 如何更改 matplotlib 图的日期时间刻度标签频率

python - 在 Python 中对选定的日期数据进行子集化

python - 在数据框列中抑制科学格式

Python - Multiprocessing.processes 从可执行文件运行时成为主进程的副本

Python pandas to_csv zip 格式

python - 错误: the label [0] is not in the [index]

python - 更新 PyTorch 中的 register_buffer?

python - Tensorflow 抛出分布式函数错误

python - 如何禁用(灰色)Tkinter 中的 Checkbutton?

python - Pandas GroupBy 每个月然后根据列中的字符串进行小计计数