簡體   English   中英

逐行計算列的聚合值

[英]Calculate aggregate value of column row by row

我為模糊的標題道歉,用書面語言翻譯我想要的東西很復雜。

我正在嘗試構建一個填充折線圖,其中 x 軸上的日期和 y 軸上的總交易時間

我的數據

object 是 pandas dataframe。

date         | symbol | type | qty |   total
----------------------------------------------
2020-09-10    ABC       Buy     5      10     
2020-10-18    ABC       Buy     2      20      
2020-09-19    ABC       Sell    3      15    
2020-11-05    XYZ       Buy     10     8       
2020-12-03    XYZ       Buy     10     9      
2020-12-05    ABC       Buy     2      5     

我想要什么

date         | symbol | type | qty |   total  | aggregate_total
------------------------------------------------------------
2020-09-10    ABC       Buy     5      10          10
2020-10-18    ABC       Buy     2      20         10+20 = 30
2020-09-19    ABC       Sell    3      15        10+20-15 = 15
2020-11-05    XYZ       Buy     10     8         8
2020-12-03    XYZ       Buy     10     9         8+9 = 17
2020-12-05    ABC       Buy     2      5          10+20-15+5 = 20

我現在在哪里

我正在使用 2 個嵌套的 for 循環:一個用於迭代符號,一個用於迭代每一行。 我將臨時結果存儲在列表中。 我仍然不確定如何將結果添加到最終的 dataframe。 我可以按符號和日期對 dataframe 重新排序,然后將 append 每個臨時列表放在一起,最后將該臨時列表分配給一個新列。

下面的代碼只是行上的內部循環。

af = df.loc[df['symbol'] == 'ABC']


 for i in (range(0,af.shape[0])):
       # print(af.iloc[0:i,[2,4]])

        # if type is a buy, we add the last operation to the aggregate
        if af.iloc[i,2] == "BUY":
            temp_agg_total.append(temp_agg_total[i] + af.iloc[i,4])
            temp_agg_qty.append(temp_agg_qty[i] + af.iloc[i, 3])

        else:
            temp_agg_total.append(temp_agg_total[i] - af.iloc[i,4])
            temp_agg_qty.append(temp_agg_qty[i] - af.iloc[i, 3])

        # Remove first element of list (0)
        temp_agg_total.pop(0)
        temp_agg_qty.pop(0)

    af = af.assign(agg_total = temp_agg_total,
              agg_qty = temp_agg_qty)

我的問題

pandasnumpy中是否有更好的方法來做到這一點? 對於相對簡單的事情,感覺真的很沉重。

Buy/Sell操作類型的存在使事情變得復雜。

問候

# negate qty of Sells
df.loc[df['type']=='Sell', 'total'] *=-1
# cumulative sum of the qty based on symbol
df['aggregate_total'] = df.groupby('symbol')['total'].cumsum()

這是你要找的嗎?

df['Agg'] = 1
df.loc[df['type'] == 'Sell', 'Agg'] = -1
df['Agg'] = df['Agg']*df['total']
df['Agg'].cumsum()
df["Type_num"] = df["type"].map({"Buy":1,"Sell":-1})
df["Num"] = df.Type_num*df.total
df.groupby(["symbol"],as_index=False)["Num"].cumsum()
pd.concat([df,df.groupby(["symbol"],as_index=False)["Num"].cumsum()],axis=1)

        date    symbol  type    qty   total Type_num    Num CumNum
0   2020-09-10   ABC     Buy     5     10      1        10   10
1   2020-10-18   ABC     Buy     2     20      1        20   30
2   2020-09-19   ABC     Sell    3     15     -1       -15   15
3   2020-11-05   XYZ     Buy     10    8       1        8    8
4   2020-12-03   XYZ     Buy     10    9       1        9    17
5   2020-12-05   ABC     Buy     2     5       1        5    20

這里最重要的是累積和。 重新組合用於確保只對每種不同的symbol執行累積和。 列的重命名和刪除對您來說應該很容易。

訣竅是我做了{sell; buy} {sell; buy} {1,-1}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM