python - 考虑到具有多个 ID 的最后一条记录的数据的累积和问题
问题描述
我有一个包含多个 ID 和日期的数据集,我在其中为 python 中的累积供应创建了一个列。
我的数据如下
SKU Date Demand Supply Cum_Supply
1 20160207 6 2 2
1 20160214 5 0 2
1 20160221 1 0 2
1 20160228 6 0 2
1 20160306 1 0 2
1 20160313 101 0 2
1 20160320 1 0 2
1 20160327 1 0 2
2 20160207 0 0 0
2 20160214 0 0 0
2 20160221 2 0 0
2 20160228 2 0 0
2 20160306 2 0 0
2 20160313 1 0 0
2 20160320 1 0 0
2 20160327 1 0 0
Cum_supply 的计算公式为
idx = pd.MultiIndex.from_product([np.unique(data.Date), data.SKU.unique()])
data2 = data.set_index(['Date', 'SKU']).reindex(idx).fillna(0)
data2 = pd.concat([data2, data2.groupby(level=1).cumsum().add_prefix('Cum_')],1).sort_index(level=1).reset_index()
我想创建一个列“True_Demand”,它是截至该日期 max(Demand-Supply) + Cum_supply 的最大未满足需求。
所以我的输出是这样的:
SKU Date Demand Supply Cum_Supply True_Demand
1 20160207 6 2 2 6
1 20160214 5 0 2 7
1 20160221 1 0 2 7
1 20160228 6 0 2 8
1 20160306 1 0 2 8
1 20160313 101 0 2 103
1 20160320 1 0 2 103
1 20160327 1 0 2 103
2 20160207 0 0 0 0
2 20160214 0 0 0 0
2 20160221 2 0 0 2
2 20160228 2 0 0 2
2 20160306 2 0 0 2
2 20160313 1 0 0 2
2 20160320 1 0 0 2
2 20160327 1 0 0 2
因此,对于第三条记录(20160221),20160221 之前的最大未满足需求为 5。因此,尽管该日期的未满足需求为 1+2,但真实需求为 5+2 = 7。
数据框的代码
data = pd.DataFrame({'SKU':[1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2],
'Date':[20160207,20160214,20160221,20160228,20160306,20160313,20160320,20160327,20160207,20160214,20160221,20160228,20160306,20160313,20160320,20160327],
'Demand':[6,5,1,6,1,101,1,1,0,0,2,2,2,1,1,1],
'Supply':[2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
,columns=['Date', 'SKU', 'Demand', 'Supply'])
解决方案
你会尝试这个非常有趣的单线吗?
(data.groupby('SKU',
as_index=False,
group_keys=False)
.apply(lambda x:
x.assign(Cum_Supply=x.Supply.cumsum())
.pipe(lambda x:
x.assign(True_Demand = (x.Demand - x.Supply + x.Cum_Supply).cummax()))))
输出:
Date SKU Demand Supply Cum_Supply True_Demand
0 20160207 1 6 2 2 6
1 20160214 1 5 0 2 7
2 20160221 1 1 0 2 7
3 20160228 1 6 0 2 8
4 20160306 1 1 0 2 8
5 20160313 1 101 0 2 103
6 20160320 1 1 0 2 103
7 20160327 1 1 0 2 103
8 20160207 2 0 0 0 0
9 20160214 2 0 0 0 0
10 20160221 2 2 0 0 2
11 20160228 2 2 0 0 2
12 20160306 2 2 0 0 2
13 20160313 2 1 0 0 2
14 20160320 2 1 0 0 2
15 20160327 2 1 0 0 2
推荐阅读
- python - 在python上打开多个文件目录
- typescript - 如何根据数组中的值创建带有键的接口
- regex - 带有可选字符/类/组的正则表达式似乎不起作用
- c - 以编程方式配置网络计划
- c - 如何使用 zlib 正确打开和关闭已打开的 gzip 文件?
- reactjs - 在 API 响应中存储值后,字符串 useState 值为空
- python - SHAP 将图形保存为空白/白色,但 Matplotlib 可以很好地保存图形
- wso2 - 使用 REST API 将用户添加到租户
- php - 如果有多个可用值,则用逗号分隔产品属性项
- node.js - 在运行的 Firebase 函数中获取 functionName 和 executionId