求与Python pandas ewma功能等价的Julia实现方法
在Julia中实现与Pandas ewma等价的指数加权移动平均
你需要的是和Pandas中ewm().mean()行为完全一致的Julia实现——从序列第一个元素开始计算,返回与原序列长度相同的结果,而非MarketTechnicals.ema()那种截断初始值的输出。以下是两种可行方案:
方案1:直接使用Pandas.jl调用Pandas原生功能
Pandas.jl可以让你在Julia中无缝调用Pandas的API,完全复现Python端的计算结果:
- 首先安装Pandas.jl:
using Pkg Pkg.add("Pandas")
- 编写代码复现你的示例:
using Pandas # 创建测试数据 data = Dict("val" => [1, 2, 3, 4, 5, 6]) df = pd.DataFrame(data) # 计算对应你Python示例中m=3的指数加权移动平均 ewma_result = df.val.ewm(com=3).mean() # 输出结果 println(ewma_result)
运行后会得到和Python完全一致的输出:
0 1.000000 1 1.571429 2 2.189189 3 2.851429 4 3.555698 5 4.299079 Name: val, dtype: float64
注:若需要对应Pandas旧版
ewma()的span参数,只需将com=3替换为span=3即可,具体参数映射可参考Pandas官方规则。
方案2:纯Julia实现(不依赖Python)
如果不想引入Pandas依赖,可以自己实现Pandas ewm(adjust=True)的默认计算逻辑:
function pandas_ewma(x; com) α = 1.0 / (com + 1.0) # 对应Pandas com参数的衰减系数 n = length(x) result = similar(x, Float64) # 初始化第一个值 result[1] = x[1] sum_weights = 1.0 sum_weighted = x[1] # 迭代计算后续值 for t in 2:n sum_weights = sum_weights * (1 - α) + 1.0 sum_weighted = sum_weighted * (1 - α) + x[t] result[t] = sum_weighted / sum_weights end return result end # 测试示例 data = [1, 2, 3, 4, 5, 6] result = pandas_ewma(data; com=3) println(result)
输出结果:
[1.0, 1.5714285714285714, 2.189189189189189, 2.8514285714285716, 3.555698324022346, 4.299078341013825]
这个函数通过累积权重和与加权值和的比值,逐步计算每个位置的指数加权平均,确保从第一个元素开始输出完整长度的结果,完全匹配Pandas的计算逻辑。
内容的提问来源于stack exchange,提问作者dhairyashil
相关产品推荐
相关产品推荐

