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

支持多次余额覆盖的库存累积求和算法优化求助

解决方案:支持多次库存余额重置的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)

关键逻辑说明

  1. 排序:必须按cat和time分组排序,保证同一品类的行严格按时间顺序处理,确保cumsum的计算逻辑正确。
  2. 原始累积计算:raw_cumsum是常规的出入库累积和,作为后续修正的基础值。
  3. 重置修正量:每个重置点的delta是目标余额bal与当前原始累积的差值,代表需要将余额偏移多少才能达到指定值。
  4. 累积修正量:cum_delta按品类累积所有重置点的delta,后续行自动叠加之前所有重置的偏移效果,实现多次重置的连续计算。
  5. 最终余额:原始累积加上累积修正量,得到符合多次重置要求的库存余额。

验证结果

运行代码后,品类a的关键行结果符合预期:

  • time=4:final_balance为50(重置值)
  • time=7:final_balance为30(第二次重置值)
  • time=8:final_balance为40(30 + 10入库)

内容的提问来源于stack exchange,提问作者orange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:04:56