2017-08-13 124 views
1

的股票累计总和考虑仓库库存在不同的日子大熊猫仓库

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()和未成功,它

+0

在你的'b假设它是基于总和的74。对?? – Dark

回答

3

使用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,前进补缺失值,最后用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 

最终结果替换NaN小号

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 
+0

不错的解决方案+1。 – Dark

+0

Upvoted。解决了我的问题。为读者起见:为了避免日子重复(针对另一种产品) - 即在同一天发生不同产品的两种不同交易,则用dff.action和df.day替换df.action与dff.day以解决重复行问题。 –

0

没关系,没看到标签。这只是普通的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!

需要注意的是它给比你贴,因为你错误计算了不同的结果。