如何在DataFrame中实现带同店前一行残差的行级预测计算?
同Store下累积前一行残差的预测计算实现
嘿,这个需求其实核心就是按门店分组后,在组内传递前一行的残差,我给你整理了最优的实现方案,完全贴合你的要求:
需求回顾
你想要的计算逻辑很明确:
- 当当前行的
store和前一行相同时,预测值 =Forecast * Lag+ 前一行的小数残差 - 当
store不同时(包括组内第一行),直接用Forecast * Lag作为预测值 - 残差始终是预测值的小数部分(即
预测值 - 整数部分)
最优实现代码
我们可以用pandas的groupby结合自定义函数来实现,既保证逻辑清晰,又兼顾效率:
import pandas as pd import numpy as np def calculate_with_residue(group): # 初始化存储预测值和残差的数组 predict = np.zeros(len(group)) residue = np.zeros(len(group)) # 处理组内第一行:直接计算初始预测值和残差 predict[0] = group['Forecast'].iloc[0] * group['Lag'].iloc[0] residue[0] = predict[0] - np.fix(predict[0]) # 从第二行开始迭代,累积前一行的残差 for i in range(1, len(group)): predict[i] = group['Forecast'].iloc[i] * group['Lag'].iloc[i] + residue[i-1] residue[i] = predict[i] - np.fix(predict[i]) # 将计算结果赋值回分组数据 group['predict'] = predict group['residue'] = residue return group # 你的原始数据 data = [{'store':100, 'Forecast':11, 'Lag':0.7} , {'store':100,'Forecast':9, 'Lag':0.2} , {'store':200,'Forecast':6, 'Lag':1.2}] df = pd.DataFrame(data) # 按store分组处理,group_keys=False避免保留分组索引 df = df.groupby('store', group_keys=False).apply(calculate_with_residue) print(df)
运行结果
执行后你会得到完全符合预期的输出:
store Forecast Lag predict residue 0 100 11 0.7 7.7 0.7 1 100 9 0.2 2.5 0.5 2 200 6 1.2 7.2 0.2
方案优势
- 逻辑精准:通过
groupby严格隔离不同门店的数据,确保残差只在同门店的行之间传递 - 效率较高:组内迭代是线性时间复杂度O(n),比全局遍历
iterrows更高效,尤其适合中大型数据集 - 可读性强:自定义函数的逻辑完全对应你的需求,后续修改或扩展都很方便
额外提示
如果你的原始数据集不是按store连续排序的,建议先执行排序,保证同门店的行是连续的:
df = df.sort_values(['store']).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Tobp
相关产品推荐
相关产品推荐

