我编写了一个Pyhton脚本,根据实际库存,在过去365天内从今天开始重新计算特定SKU。为此,我使用了Python Pandas Dataframe,如下所示:
Index DATE SUM_IN SUM_OUT
0 5/12/18 500 0
1 5/13/18 0 -403
2 5/14/18 0 -58
3 5/15/18 0 -39
4 5/16/18 100 0
5 5/17/18 0 -98
6 5/18/18 276 0
7 5/19/18 0 -139
8 5/20/18 0 -59
9 5/21/18 0 -70
数据框显示仓库的数量IN和OUT的总和,按日期分组。我的目的是添加一个名为" STOCK"的列。表示所代表日的SKU的库存水平。为此,我所拥有的是实际库存水平(指数9)。所以我需要的是在所有日期系列中逐日重新计算所有级别(从索引9到索引0)。
在Excel中很容易。我可以将实际级别放在最后一行,只是扩展计算直到我到达索引0的行。如图所示(列E是公式,列G是所需的输出):
有人可以帮我实现这个结果吗?
我已经拥有最后一天的库存水平(即5/21/2018等于10)。我需要的是将数字10放在索引9中并计算其他过去几天的库存水平,从索引8到0。
所需的输出应为:
Index DATE TRANSACTION_IN TRANSACTION_OUT SUM_IN SUM_OUT STOCK
0 5/12/18 1 0 500 0 500
1 5/13/18 0 90 0 -403 97
2 5/14/18 0 11 0 -58 39
3 5/15/18 0 11 0 -39 0
4 5/16/18 1 0 100 0 100
5 5/17/18 0 17 0 -98 2
6 5/18/18 1 0 276 0 278
7 5/19/18 0 12 0 -139 139
8 5/20/18 0 4 0 -59 80
9 5/21/18 0 7 0 -70 10
答案 0 :(得分:2)
(更新)
last_stock = 10 # You should try another value
a = (df.SUM_IN + df.SUM_OUT).cumsum()
df["STOCK"] = a - (a.iloc[-1] - last_stock)
答案 1 :(得分:1)
使用cumsum
为groupby
创建密钥,然后我们再次使用cumsum
df['SUM_IN'].replace(0,np.nan).ffill()+df.groupby(df['SUM_IN'].gt(0).cumsum()).SUM_OUT.cumsum()
Out[292]:
0 500.0
1 97.0
2 39.0
3 0.0
4 100.0
5 2.0
6 276.0
7 137.0
8 78.0
9 8.0
dtype: float64
更新
s=df['SUM_IN'].replace(0,np.nan).ffill()+df.groupby(df['SUM_IN'].gt(0).cumsum()).SUM_OUT.cumsum()-df.STOCK
df['SUM_IN'].replace(0,np.nan).ffill()+df.groupby(df['SUM_IN'].gt(0).cumsum()).SUM_OUT.cumsum()-s.groupby(df['SUM_IN'].gt(0).cumsum()).bfill().fillna(0)
Out[318]:
0 500.0
1 97.0
2 39.0
3 0.0
4 100.0
5 2.0
6 278.0
7 139.0
8 80.0
9 10.0
dtype: float64