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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:57:28