Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧中基于列比较的条件累积和_Python_Pandas_Finance - Fatal编程技术网

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()和布尔掩码,但到目前为止没有成功。我们会继续努力,也许我们会同时改进,这是一个有趣的问题。