【问题标题】:pandas cumulative sum of stock in warehousepandas 累计入库总和
【发布时间】:2018-01-21 07:54:49
【问题描述】:

考虑不同日期的仓库库存

day action  quantity symbol
0   1         40      a
1   1         53      b
2   -1        21      a
3   1         21      b
4   -1         2      a
5   1         42      b

这里,day 代表时间序列,action 代表特定产品的buy/sell (symbol) 和quantity
对于此数据框,我如何计算每种产品的每日累计总和。
基本上,结果数据框如下:

days    a   b
0       40  0
1       40  53
2       19  53
3       19  64
4       17  64
5       17  106

我已经用 groupby 尝试了 cumsum() 并且没有成功

【问题讨论】:

  • 在您的 b 中,根据 sum 假设为 74。对吧??

标签: python pandas dataframe


【解决方案1】:

使用pivot_table

In [920]: dff = df.pivot_table(
                   index=['day', 'action'], columns='symbol',
                   values='quantity').reset_index()
In [921]: dff
Out[921]:
symbol  day  action     a     b
0         0       1  40.0   NaN
1         1       1   NaN  53.0
2         2      -1  21.0   NaN
3         3       1   NaN  21.0
4         4      -1   2.0   NaN
5         5       1   NaN  42.0

然后,mul动作,取cumsum,前向填充缺失值,最后将NaNs替换为0

In [922]: dff[['a', 'b']].mul(df.action, 0).cumsum().ffill().fillna(0)
Out[922]:
symbol     a      b
0       40.0    0.0
1       40.0   53.0
2       19.0   53.0
3       19.0   74.0
4       17.0   74.0
5       17.0  116.0

最终结果

In [926]: dff[['a', 'b']].mul(df.action, 0).cumsum().ffill().fillna(0).join(df.day)
Out[926]:
      a      b  day
0  40.0    0.0    0
1  40.0   53.0    1
2  19.0   53.0    2
3  19.0   74.0    3
4  17.0   74.0    4
5  17.0  116.0    5

【讨论】:

  • 不错的解决方案 +1。
  • 赞成。解决了我的问题。为读者着想的信息:如果一天重复(对于另一个产品) - 即在同一天发生不同产品的两个不同交易,然后将 df.action 替换为 dff.action 并将 df.day 替换为 dff.day 以解决重复行问题。
【解决方案2】:

没关系,没有看到 标签。这只是普通的 Python。

试试这个:

sums = []

currentsums = {'a': 0, 'b': 0}

for i in data:
    currentsums[i['symbol']] += i['action'] * i['quantity']
    sums.append({'a': currentsums['a'], 'b': currentsums['b']})

Try it online!

请注意,它给出的结果与您发布的结果不同,因为您计算错误。

【讨论】:

    猜你喜欢
    • 2014-05-04
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多