支持多次余额覆盖的库存累积求和算法优化求助
解决方案:支持多次库存余额重置的pandas实现
以下代码基于cumsum的简洁性,实现了同一品类多次余额重置的需求:
import pandas as pd # 测试数据(包含多次重置场景) df = pd.DataFrame({ 'cat': ['a', 'a', 'b', 'b', 'a', 'a', 'a', 'a', 'a', 'b'], 'time': [1, 2, 1, 2, 4, 5, 6, 7, 8, 9], 'in': [None, 10, None, None, None, 20, 11, 9, 10, None], 'out': [10, None, None, 20, 10, 5, None, 30, None, None], 'bal': [None, None, None, None, 50, None, None, 30, None, None] }) # 1. 按品类和时间排序,确保计算顺序正确 df = df.sort_values(by=['cat', 'time']).reset_index(drop=True) # 2. 计算每行的出入库差值(空值视为0) df['inout'] = df['in'].fillna(0) - df['out'].fillna(0) # 3. 计算不考虑重置的原始累积余额 df['raw_cumsum'] = df.groupby('cat')['inout'].cumsum() # 4. 计算每个重置点的修正量:目标余额与当前原始累积的差值,非重置点修正量为0 df['delta'] = df.apply(lambda row: row['bal'] - row['raw_cumsum'] if pd.notna(row['bal']) else 0, axis=1) # 5. 按品类累积修正量,自动继承之前所有重置的偏移效果 df['cum_delta'] = df.groupby('cat')['delta'].cumsum() # 6. 最终库存余额 = 原始累积 + 累积修正量 df['final_balance'] = df['raw_cumsum'] + df['cum_delta'] print(df)
关键逻辑说明
- 排序:必须按
cat和time分组排序,保证同一品类的行严格按时间顺序处理,确保cumsum的计算逻辑正确。 - 原始累积计算:
raw_cumsum是常规的出入库累积和,作为后续修正的基础值。 - 重置修正量:每个重置点的
delta是目标余额bal与当前原始累积的差值,代表需要将余额偏移多少才能达到指定值。 - 累积修正量:
cum_delta按品类累积所有重置点的delta,后续行自动叠加之前所有重置的偏移效果,实现多次重置的连续计算。 - 最终余额:原始累积加上累积修正量,得到符合多次重置要求的库存余额。
验证结果
运行代码后,品类a的关键行结果符合预期:
- time=4:
final_balance为50(重置值) - time=7:
final_balance为30(第二次重置值) - time=8:
final_balance为40(30 + 10入库)
内容的提问来源于stack exchange,提问作者orange
相关产品推荐
相关产品推荐

