Python KDB和x2B;像pandas中timeseries数据的asof join?
kdb+有一个函数,通常用于沿时间列连接表 这里是一个例子,我有交易和报价表,我得到了每一笔交易的现行报价Python KDB和x2B;像pandas中timeseries数据的asof join?,python,join,time-series,pandas,kdb,Python,Join,Time Series,Pandas,Kdb,kdb+有一个函数,通常用于沿时间列连接表 这里是一个例子,我有交易和报价表,我得到了每一笔交易的现行报价 q)5# t time sym price size ----------------------------- 09:30:00.439 NVDA 13.42 60511 09:30:00.439 NVDA 13.42 60511 09:30:02.332 NVDA 13.42 100 09:30:02.332 NVDA 13.42 100 09:30:02.
q)5# t
time sym price size
-----------------------------
09:30:00.439 NVDA 13.42 60511
09:30:00.439 NVDA 13.42 60511
09:30:02.332 NVDA 13.42 100
09:30:02.332 NVDA 13.42 100
09:30:02.333 NVDA 13.41 100
q)5# q
time sym bid ask bsize asize
-----------------------------------------
09:30:00.026 NVDA 13.34 13.44 3 16
09:30:00.043 NVDA 13.34 13.44 3 17
09:30:00.121 NVDA 13.36 13.65 1 10
09:30:00.386 NVDA 13.36 13.52 21 1
09:30:00.440 NVDA 13.4 13.44 15 17
q)5# aj[`time; t; q]
time sym price size bid ask bsize asize
-----------------------------------------------------
09:30:00.439 NVDA 13.42 60511 13.36 13.52 21 1
09:30:00.439 NVDA 13.42 60511 13.36 13.52 21 1
09:30:02.332 NVDA 13.42 100 13.34 13.61 1 1
09:30:02.332 NVDA 13.42 100 13.34 13.61 1 1
09:30:02.333 NVDA 13.41 100 13.34 13.51 1 1
如何使用熊猫执行相同的操作?我正在使用索引为datetime64的交易和报价数据帧
In [55]: quotes.head()
Out[55]:
bid ask bsize asize
2012-09-06 09:30:00.026000 13.34 13.44 3 16
2012-09-06 09:30:00.043000 13.34 13.44 3 17
2012-09-06 09:30:00.121000 13.36 13.65 1 10
2012-09-06 09:30:00.386000 13.36 13.52 21 1
2012-09-06 09:30:00.440000 13.40 13.44 15 17
In [56]: trades.head()
Out[56]:
price size
2012-09-06 09:30:00.439000 13.42 60511
2012-09-06 09:30:00.439000 13.42 60511
2012-09-06 09:30:02.332000 13.42 100
2012-09-06 09:30:02.332000 13.42 100
2012-09-06 09:30:02.333000 13.41 100
我看到pandas有一个asof函数,但它没有在DataFrame上定义,只在Series对象上定义。我想我们可以循环浏览每个系列并逐个对齐它们,但我想知道是否有更好的方法?正如您在问题中提到的,循环浏览每个列应该适合您:
df1.apply(lambda x: x.asof(df2.index))
我们可以创建一个更快的DataFrame.asof版本,一次完成所有列。但就目前而言,我认为这是最简单的方法。不久前,我写了一个广告下的
ordered\u merge
函数:
In [27]: quotes
Out[27]:
time bid ask bsize asize
0 2012-09-06 09:30:00.026000 13.34 13.44 3 16
1 2012-09-06 09:30:00.043000 13.34 13.44 3 17
2 2012-09-06 09:30:00.121000 13.36 13.65 1 10
3 2012-09-06 09:30:00.386000 13.36 13.52 21 1
4 2012-09-06 09:30:00.440000 13.40 13.44 15 17
In [28]: trades
Out[28]:
time price size
0 2012-09-06 09:30:00.439000 13.42 60511
1 2012-09-06 09:30:00.439000 13.42 60511
2 2012-09-06 09:30:02.332000 13.42 100
3 2012-09-06 09:30:02.332000 13.42 100
4 2012-09-06 09:30:02.333000 13.41 100
In [29]: ordered_merge(quotes, trades)
Out[29]:
time bid ask bsize asize price size
0 2012-09-06 09:30:00.026000 13.34 13.44 3 16 NaN NaN
1 2012-09-06 09:30:00.043000 13.34 13.44 3 17 NaN NaN
2 2012-09-06 09:30:00.121000 13.36 13.65 1 10 NaN NaN
3 2012-09-06 09:30:00.386000 13.36 13.52 21 1 NaN NaN
4 2012-09-06 09:30:00.439000 NaN NaN NaN NaN 13.42 60511
5 2012-09-06 09:30:00.439000 NaN NaN NaN NaN 13.42 60511
6 2012-09-06 09:30:00.440000 13.40 13.44 15 17 NaN NaN
7 2012-09-06 09:30:02.332000 NaN NaN NaN NaN 13.42 100
8 2012-09-06 09:30:02.332000 NaN NaN NaN NaN 13.42 100
9 2012-09-06 09:30:02.333000 NaN NaN NaN NaN 13.41 100
In [32]: ordered_merge(quotes, trades, fill_method='ffill')
Out[32]:
time bid ask bsize asize price size
0 2012-09-06 09:30:00.026000 13.34 13.44 3 16 NaN NaN
1 2012-09-06 09:30:00.043000 13.34 13.44 3 17 NaN NaN
2 2012-09-06 09:30:00.121000 13.36 13.65 1 10 NaN NaN
3 2012-09-06 09:30:00.386000 13.36 13.52 21 1 NaN NaN
4 2012-09-06 09:30:00.439000 13.36 13.52 21 1 13.42 60511
5 2012-09-06 09:30:00.439000 13.36 13.52 21 1 13.42 60511
6 2012-09-06 09:30:00.440000 13.40 13.44 15 17 13.42 60511
7 2012-09-06 09:30:02.332000 13.40 13.44 15 17 13.42 100
8 2012-09-06 09:30:02.332000 13.40 13.44 15 17 13.42 100
9 2012-09-06 09:30:02.333000 13.40 13.44 15 17 13.41 100
它可以很容易地(对于熟悉代码的人来说)扩展为模仿KDB的“左连接”。我意识到在这种情况下,提前填写交易数据是不合适的;仅演示功能。:
语义与q/kdb+中的功能非常相似。谢谢。我现在正在采取这种方法。但是一个天真的版本将是非常受欢迎的!谢谢,很高兴知道。这本质上就是KDB!中的uj()!。对于aj功能,我将使用Chang的方法,但我计划稍后对代码进行一次认真的尝试。这是否可以推广到dataframe包含多个系列的情况,例如,如果数据除了时间戳之外,还包含一个stock ID列?(因此,我们可能有数千个组,每个组都是一个系列)。我想我们需要一个混合的
groupby()
和ordered\u merge
,但我正在绞尽脑汁想怎么做。。。当然,简单地对数据帧的整体顺序进行ffill
是错误的(我不希望一个组由于前向填充而溢出到下一个组中)。这也称为滚动连接
pd.merge_asof(trades, quotes, on='time')