You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中高效计算字典列表各键指数加权平均值的方法

字典列表各键的指数加权平均值计算方法

给定按时间顺序排列的同结构字典列表,结构示例如下:

[{'apple':2, 'banana':3, 'orange':4}, 
 {'apple':3, 'banana':15, 'orange':3},
 {'apple':4, 'banana':9, 'orange':1},
 {'apple':5, 'banana':11, 'orange':10}, ...]

需要输出每个键对应指数加权平均值的单字典,格式如下:

{'apple':x, 'banana':y, 'orange':z}

已有的简单平均值实现逻辑:

def dict_mean(dict_list):
    mean_dict = {}
    for key in dict_list[0].keys():
        mean_dict[key] = sum(d[key] for d in dict_list) / len(dict_list)
    return mean_dict

实现方案

指数加权平均(EWMA)的核心是给越新的数据分配越高的权重,权重随历史跨度呈指数衰减,计算时只需指定0~1之间的平滑系数alpha,alpha越大,近期数据对结果的影响越强。

纯Python实现(无依赖、性能最优)

利用EWMA的递推特性,仅需单次遍历列表即可完成计算,时间复杂度和简单平均完全一致,内存占用极低,适合大数据量场景:

def dict_ewma(dict_list, alpha=0.3):
    # 初始化值取最早一条数据的各键值
    ewma_res = dict_list[0].copy()
    # 从第二条数据开始递推计算
    for curr_dict in dict_list[1:]:
        for k in ewma_res:
            ewma_res[k] = alpha * curr_dict[k] + (1 - alpha) * ewma_res[k]
    return ewma_res

注意:传入的dict_list必须按时间先后排序,越早的历史数据放在列表越靠前的位置,最新数据放在末尾,否则权重对应关系会出错。

如果需要等效于N个周期滑动窗口的加权效果,可以按公式alpha = 2/(N+1)换算alpha值,比如要近似10个周期的窗口效果,alpha取2/(10+1)≈0.18即可。

Pandas实现(适合已有pandas处理流程的场景)

如果日常数据处理已经在用pandas,可以直接调用内置的EWMA接口,代码更简洁:

import pandas as pd

def dict_ewma_pd(dict_list, alpha=0.3):
    return pd.DataFrame(dict_list).ewm(alpha=alpha).mean().iloc[-1].to_dict()

内容的提问来源于stack exchange,提问作者am3487

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:31:08