我希望你能帮助我,因为我对python相对较新。 我的数据框如下所示:
现在,我想计算一个数量的总和,条件是:
日期,交货,买/卖,交易员
作为最低限度的例子(仅考虑一个条件)我尝试了以下内容:
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。 可能下一列如下所示:
然后在第3行,第4行,应该计算19号交付Beg 02:15所做的所有卖出交易的总和,即第5,6行中的(-15,9)所有买入交易在19日交付在02:30和第7行中,所有买入交易都是在19日完成,交货时间为02:45。
这意味着我的条件会逐行变化。
我希望现在更清楚了。函数应该根据每行的变化条件计算sumif。
基本理念:我想知道谁(交易员)买入和卖出(买入/卖出)哪个季度(交割量)的交易量(数量之和) 谢谢!
答案 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)
。