Python 数据帧中基于列比较的条件累积和
我对熊猫还比较陌生,我相信有一个简单的解决办法,但我自己无法解决。我有一个事务数据框架,如下所示:Python 数据帧中基于列比较的条件累积和,python,pandas,finance,Python,Pandas,Finance,我对熊猫还比较陌生,我相信有一个简单的解决办法,但我自己无法解决。我有一个事务数据框架,如下所示: OrderId Size Price Side TimeSecO TimeUSecO TimeSecOT TimeUSecOT AmountBuy AmountSell 10 100 41.44000000 BUY 1403200077 47720 1403200100 640070 11 1
OrderId Size Price Side TimeSecO TimeUSecO TimeSecOT TimeUSecOT AmountBuy AmountSell
10 100 41.44000000 BUY 1403200077 47720 1403200100 640070
11 100 41.43000000 BUY 1403200077 47979 1403200112 43383
12 100 41.45000000 SELL 1403200077 48311 1403200090 61100
14 100 41.45000000 BUY 1403200092 253793 1403200092 374767
17 100 41.44000000 SELL 1403200103 24382 1403200125 929563
20 100 41.43000000 SELL 1403200116 208057 1403200116 226762
31 100 41.46000000 SELL 1403200214 874124 1403200259 751002
37 100 41.46000000 BUY 1403200278 494827 1403200300 729545
42 100 41.45000000 BUY 1403200335 601039 1403200361 925384
42 100 41.45000000 BUY 1403200335 601039 1403200361 925415
45 500 15.54000000 SELL 1403200365 997248 1403200741 26216
49 100 41.45000000 SELL 1403200375 419253 1403200402 959968
53 100 42.61000000 SELL 1403200377 403525 1403200377 403680
54 100 42.61000000 BUY 1403200377 501636 1403200377 501770
我想计算每个OrderId的滚动累积和,并将它们放入两个新列中,分别对应于边列CumAmountBuy和CumAmountSell,其中TimeSecO>TimeSecOT
例如,对于上述数据帧,OrderId 10、OrderId 11和OrderId 12的正确累计和应为CumAmountBuy=0和CumAmountSell=0,因为在1403200077>TimeUSecOT的数据帧中没有记录
对于OrderID14,CumAmountBuy=0,CumAmountSell=100,因为OrderID12此时已经发生了,它是一个Side=SELL,并且满足了TimeSecO>TimeSecOT(140320092>1403200900)的要求。我可以想出一个肮脏的把戏,但是当数据帧变得巨大时,我认为它没有效率
In [42]: df['flag'] = df.TimeSecO.map(lambda sec: (sec > df.TimeSecOT).values)
In [43]: df['CumAmountBuy'] = df.flag.map(lambda f: np.dot(f,df['Size']*(df['Side']=='BUY')))
In [44]: df['CumAmountSell'] = df.flag.map(lambda f: np.dot(f,df['Size']*(df['Side']=='SELL')))
In [45]: df[['CumAmountBuy','CumAmountSell']]
Out[45]:
CumAmountBuy CumAmountSell
OrderId
10 0 0
11 0 0
12 0 0
14 0 100
17 200 100
20 300 100
31 300 300
37 300 400
42 400 400
42 400 400
45 600 400
49 600 400
53 600 400
54 600 400
你能详细解释一下“数据帧”是什么意思吗?这是一个类似tsv的文件,还是您正在查询数据库以获取“数据帧”?它必须是那种格式,或者可以转换成csv格式,在这种情况下,你可以使用这种格式:在某种程度上。我说的dataframe是指熊猫dataframe,一种二维标记的数据结构,请看这里:order 11不是有(TimeSecO+TimeUSecO)>(TimeSecOT+TimeUSecOT)?@user3561400你写了什么Python代码来实现这一点,如果有的话?另外,很抱歉,我刚刚注意到您有一个Python标记。需要更多的信息。对DSM来说:不是真的,因为两个时间戳的第二部分都是微秒。但是,我可以看到人们可能会混淆的地方,所以我编辑了这个问题来简化它,谢谢。谢谢,黑客是有效的,但我同意这在非常大的数据帧上是无效的。但这是目前为止最好的方法,我一直在尝试使用cumsum()、where()和布尔掩码,但到目前为止没有成功。我们会继续努力,也许我们会同时改进,这是一个有趣的问题。