如何解决为组保留python的价值
country item week stock FCST
A 1 1 105 3
A 1 2 105 6
A 1 3 105 9
A 1 4 105 4
A 1 5 105 7
A 1 6 105 4
A 1 7 105 7
我要执行的任务是将本周的期末存货分配为下周的期初存货。在上表中,我的库存数量在开始时为105,根据预测(fcst列),该数量正在减少并分配为同一周的结束库存。现在,期末库存应成为下周的期初库存。
我已经在使用SAS保留语句的SAS中做了同样的事情。我不知道如何在python中复制相同内容。
还要记下要对每个国家/地区组合执行的操作。 (由于新项目可能具有不同的当前库存,所以我们不能总是将价值作为初始库存转移)。
有人可以帮我吗?
我的输出应如下表所示。
country item week stock FCST opening_STOCK CLOSING_STK
A 1 1 105 3 105 102
A 1 2 105 6 102 96
A 1 3 105 9 96 87
A 1 4 105 4 87 83
A 1 5 105 7 83 76
A 1 6 105 4 76 72
A 1 7 105 7 72 65
谢谢。
解决方法
现在可以使用了。 Combine_first用于填补df.opening中的空白
import pandas as pd
df = pd.DataFrame({
'country': {0: 'A',1: 'A',2: 'A',3: 'A',4: 'A',5: 'A',6: 'A',7: 'A',8: 'A',9: 'A',10: 'A',11: 'A',12: 'A',13: 'B',14: 'B',15: 'B',16: 'B',17: 'B',18: 'B',19: 'B',20: 'B',21: 'B',22: 'B'},'item': {0: 1,1: 1,2: 1,3: 1,4: 1,5: 1,6: 1,7: 2,8: 1,9: 2,10: 2,11: 1,12: 1,13: 1,14: 1,15: 1,16: 2,17: 3,18: 2,19: 1,20: 2,21: 1,22: 3},'week': {0: 1,1: 2,2: 3,3: 4,4: 5,5: 6,6: 7,7: 7,8: 8,9: 8,10: 9,11: 9,12: 10,14: 2,15: 3,16: 3,18: 4,19: 4,20: 5,21: 5,22: 5},'stock': {0: 105,1: 105,2: 105,3: 105,4: 105,5: 105,6: 105,7: 94,8: 105,9: 94,10: 94,11: 105,12: 105,13: 100,14: 100,15: 100,16: 200,17: 300,18: 200,19: 100,20: 200,21: 100,22: 300},'FCST': {0: 3,1: 6,2: 9,4: 7,5: 4,9: -5,11: 8,12: 6,13: 2,14: 6,15: 8,17: 7,18: 8,19: 9,20: 3,22: 6}
})
df_new = pd.DataFrame(columns=df.columns)
groups = df.groupby(["country","item"])
df["closing"] = df.stock - groups.FCST.cumsum()
df["opening"] = groups.closing.shift(1)
df["opening"] = df["opening"].combine_first(df.stock)
输出:
country item week stock FCST closing opening
0 A 1 1 105 3 102 105.0
1 A 1 2 105 6 96 102.0
2 A 1 3 105 9 87 96.0
3 A 1 4 105 4 83 87.0
4 A 1 5 105 7 76 83.0
5 A 1 6 105 4 72 76.0
6 A 1 7 105 7 65 72.0
7 A 2 7 94 2 92 94.0
8 A 1 8 105 1 64 65.0
9 A 2 8 94 -5 97 92.0
10 A 2 9 94 2 95 97.0
11 A 1 9 105 8 56 64.0
12 A 1 10 105 6 50 56.0
13 B 1 1 100 2 98 100.0
14 B 1 2 100 6 92 98.0
15 B 1 3 100 8 84 92.0
16 B 2 3 200 3 197 200.0
17 B 3 3 300 7 293 300.0
18 B 2 4 200 8 189 197.0
19 B 1 4 100 9 75 84.0
20 B 2 5 200 3 186 189.0
21 B 1 5 100 5 70 75.0
22 B 3 5 300 6 287 293.0
,
我用来解决该问题的代码粘贴在下面。
df.sort_values(by=['ITM_CD','Country','WEEK'],inplace=True)
df['CONCAT']=df['Country']+df['ITM_CD']
#CALCULATE BEGINING STOCK EVERY WEEK
df['TMP1']=1
grouper = (df["CONCAT"]!= df["CONCAT"].shift()).cumsum()
df["WEEK_NO"] = df.groupby(grouper)['TMP1'].cumsum()
df["FCST1"] = df.groupby(grouper)['FCST'].cumsum()
result = df.CURR_STCK_TOT - df.FCST1
df["CLOSING"] = result
df["CLOSING"] = np.where(df["CLOSING"]<0,df["CLOSING"])
df["OPENING"] = np.where(df["WEEK_NO"]==1,df["STOCK"],result.shift(1))
df["OPENING"] = np.where(df["OPENING"]<0,df["OPENING"])
我还做了一些额外的操作,例如将所有负值设为0。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。