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
相关产品推荐
相关产品推荐

