Python如何使用Pandas对分组对象计算各月WMAPE
按月份分组计算分月WMAPE的实现方法
核心逻辑说明
WMAPE本质是在单个独立计算范围内输出的标量结果:全局计算时,整个数据集作为一个计算范围,输出一个总WMAPE值;当你按月份把数据集拆成多个子集后,每个月份的子集就是独立的计算单元,每个单元执行相同的WMAPE计算公式,自然就会输出对应月份的WMAPE标量值,最终的结果是一个以月份为索引的Series,不存在“WMAPE只能输出全局单个值”的限制。
你之前的全局WMAPE计算逻辑是:对全量数据求和——分子是所有行的abs(actual - forecast)之和,分母是所有行的abs(actual)之和。按月份分组计算时,公式的计算逻辑完全不变,只是把求和范围从全局缩小到每个月份的分组内部。
性能最优的实现方案
这种写法完全基于pandas向量化计算,没有逐行循环的性能损耗,数据量较大时运行速度远高于groupby.apply方案,且计算结果和你原有的全局计算逻辑完全对齐:
# 1. 向量化计算逐行的两个核心统计量 revenue['abs_error'] = abs(revenue['actual'] - revenue['forecast']) revenue['abs_actual'] = abs(revenue['actual']) # 2. 按月份分组,对两个统计量分别做组内求和 monthly_stat = revenue.groupby('month')[['abs_error', 'abs_actual']].sum() # 3. 逐组计算WMAPE,得到分月结果 monthly_wmape = monthly_stat['abs_error'] / monthly_stat['abs_actual']
逻辑一致性校验:将所有月份分组的
abs_error总和、abs_actual总和相加后再做除法,得到的结果和你之前计算的全局WMAPE值(0.12206572769953052)完全一致,不存在计算偏差。
可选的自定义函数写法
如果希望直接在分组对象上套用计算逻辑,也可以编写自定义函数通过apply方法完成计算,这种写法逻辑更直观,但在百万行以上的大表上运行效率会低于上述向量化方案:
# 定义单组WMAPE计算函数 def calc_group_wmape(group_df): numerator = abs(group_df['actual'] - group_df['forecast']).sum() denominator = abs(group_df['actual']).sum() return numerator / denominator # 对月份分组应用函数,得到分月WMAPE结果 monthly_wmape = revenue.groupby('month').apply(calc_group_wmape)
内容的提问来源于stack exchange,提问作者Iterator516
相关产品推荐
相关产品推荐

