python pandas - sumf如果滚动参数

时间:2014-11-28 11:30:18

标签: python pandas sum apply

我希望你能帮助我,因为我对python相对较新。 我的数据框如下所示:

enter image description here

现在,我想计算一个数量的总和,条件是:

日期,交货,买/卖,交易员

作为最低限度的例子(仅考虑一个条件)我尝试了以下内容:

 deals["Accumulated Buy"]=deals.apply(lambda x: x["Quantity"] if  x["Delivery Beg"]==x["Delivery   Beg"] else 0, axis=1)

当然只给出了这一特定行的数量,而不是条件适用的所有数量的总和。问题是我的条件正在滚动,即首先代码应该总结19/11年完成的所有交易的数量与交付Beg 02:00。之后,应对第2行或第n行的条件进行相同的操作。我尝试过类似的东西:

for i in deals.index:
deals["Accumulated Buy"]=deals.apply(lambda x: x["Quantity"] if  x["Delivery Beg"]==x["Delivery Beg"].iloc[i] else 0, axis=1)

但是,我得到了:

AttributeError: ("'datetime.time' object has no attribute 'iloc'", 'occurred at index 0')   

有人可以帮我这个吗?

TX !!

编辑:好的,我希望在19.11.2014完成所有卖出交易的数量总和,交货时间为02:00:00,在上表中这将是-3,6 + - 2,5 = -6,1。 可能下一列如下所示:

enter image description here

然后在第3行,第4行,应该计算19号交付Beg 02:15所做的所有卖出交易的总和,即第5,6行中的(-15,9)所有买入交易在19日交付在02:30和第7行中,所有买入交易都是在19日完成,交货时间为02:45。

这意味着我的条件会逐行变化。

我希望现在更清楚了。函数应该根据每行的变化条件计算sumif。

基本理念:我想知道谁(交易员)买入和卖出(买入/卖出)哪个季度(交割量)的交易量(数量之和) 谢谢!

2 个答案:

答案 0 :(得分:0)

我不确定你是否需要滚动总和。可能那么简单deals.groupby就足够了吗?像这样:

df.groupby(['Date', 'Trader', 'Buy/Sell', 'Delivery Beg'])['Quantity'].sum()

如果你想得到滚动总和,你可以使用cumsum()函数。

>>> df = pd.read_clipboard(sep=';')
>>> df
         Date Delivery Beg Buy/Sell  Quantity Trader
0  19.11.2014     02:00:00        S      -3.6   TRD1
1  19.11.2014     02:00:00        S      -2.5   TRD1
2  19.11.2014     02:15:00        S      -2.3   TRD1
3  19.11.2014     02:15:00        S     -13.6   TRD1
4  19.11.2014     02:30:00        B       9.1   TRD1
5  19.11.2014     02:30:00        B       0.1   TRD1
6  19.11.2014     02:45:00        S      19.9   TRD1
>>> df.groupby(['Date', 'Trader', 'Buy/Sell', 'Delivery Beg'])['Quantity'].sum()
Date        Trader  Buy/Sell  Delivery Beg
19.11.2014  TRD1    B         02:30:00         9.2
                    S         02:00:00        -6.1
                              02:15:00       -15.9
                              02:45:00        19.9

或者,如果您想将数据作为列而不是索引:

>>> df.groupby(['Date', 'Trader', 'Buy/Sell', 'Delivery Beg'])['Quantity'].sum().reset_index()
         Date Trader Buy/Sell Delivery Beg  Quantity
0  19.11.2014   TRD1        B     02:30:00       9.2
1  19.11.2014   TRD1        S     02:00:00      -6.1
2  19.11.2014   TRD1        S     02:15:00     -15.9
3  19.11.2014   TRD1        S     02:45:00      19.9

答案 1 :(得分:0)

我不是100%肯定你的意思,但我想你在列Date,Delivery Beg,Buy / Sell和Trader上有一些条件。让我们分别称这些条件为a,b,c,d和e。当他们满足时,你想总结数量。如果是这样,我的建议就是

df.Quantity[(df['Date']==a) & (df['Delivery Beg']==b) & (and so on)].cumsum()

如果某些条件是列表,并且只有一个元素必须满足使用,例如df['Date'].isin(YourListOfConditions)