我正在尝试使用pandas计算EWMA,但结果并非我的预期。我认为第4个元素应该是13.179但是熊猫给出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
答案 0 :(得分:1)
由于文档说
a = com/(1 + com)
紧随其后
com = a/(1.0-a)
(对于0 <= a <1)。
此外,还对在开始时段"to account for imbalance in relative weightings"期间计算的值进行了调整。 确认公式
让我们关闭调整:
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)