pandas.DataFrame.ewm计算结果不符,是工具问题还是我的错误?
问题根源:参数传递错误
你调用ewm时未指定参数名,导致把alpha=0.5传给了位置参数com,而非你期望的关键字参数alpha,这是结果不符的核心原因。
具体解释
pandas的ewm函数第一个位置参数是com(中心移动平均的跨度),而非alpha。你的代码df['col1'].ewm(alpha, adjust=False).mean()等价于df['col1'].ewm(com=0.5, adjust=False).mean(),而非ewm(alpha=0.5, adjust=False)。
当com=0.5时,对应的实际平滑因子alpha为:
alpha = 1 / (1 + com) = 1 / 1.5 = 2/3 ≈ 0.6667
代入递归公式计算:
- y0 = 1
- y1 = (1-2/3)*1 + (2/3)*1 = 1
- y2 = (1-2/3)*1 + (2/3)*2 = 5/3 ≈1.666667
- y3 = (1-2/3)*(5/3) + (2/3)*3 =23/9≈2.555556
这完全匹配pandas给出的结果。
修正后的代码
显式指定alpha关键字参数即可:
import pandas as pd df = pd.DataFrame({'col1':[1, 1, 2, 3, 3, 5, 8, 9], }) alpha=0.5 df['ewm'] = df['col1'].ewm(alpha=alpha, adjust=False).mean()
运行结果将与你的手动计算一致:
col1 ewm 0 1 1.000000 1 1 1.000000 2 2 1.500000 3 3 2.250000 4 3 2.625000 5 5 3.812500 6 8 5.906250 7 9 7.453125
注意事项
pandas的ewm函数参数较多,建议始终使用关键字参数指定参数,避免位置参数导致的误解。
内容的提问来源于stack exchange,提问作者Laurent B.
相关产品推荐
相关产品推荐

