2017-08-13 101 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!

需要注意的是它給比你貼,因爲你錯誤計算了不同的結果。