pandas.merge_asof 合并两个数据帧,执行左连接,除非它匹配最近的键而不是相等的键。
示例(从 documentation 窃取):
>>> quotes
time ticker bid ask
0 2016-05-25 13:30:00.023 GOOG 720.50 720.93
1 2016-05-25 13:30:00.023 MSFT 51.95 51.96
2 2016-05-25 13:30:00.030 MSFT 51.97 51.98
3 2016-05-25 13:30:00.041 MSFT 51.99 52.00
4 2016-05-25 13:30:00.048 GOOG 720.50 720.93
5 2016-05-25 13:30:00.049 AAPL 97.99 98.01
6 2016-05-25 13:30:00.072 GOOG 720.50 720.88
7 2016-05-25 13:30:00.075 MSFT 52.01 52.03
>>> trades
time ticker price quantity
0 2016-05-25 13:30:00.023 MSFT 51.95 75
1 2016-05-25 13:30:00.038 MSFT 51.95 155
2 2016-05-25 13:30:00.048 GOOG 720.77 100
3 2016-05-25 13:30:00.048 GOOG 720.92 100
4 2016-05-25 13:30:00.048 AAPL 98.00 100
>>> pd.merge_asof(trades, quotes,
... on='time',
... by='ticker')
time ticker price quantity bid ask
0 2016-05-25 13:30:00.023 MSFT 51.95 75 51.95 51.96
1 2016-05-25 13:30:00.038 MSFT 51.95 155 51.97 51.98
2 2016-05-25 13:30:00.048 GOOG 720.77 100 720.50 720.93
3 2016-05-25 13:30:00.048 GOOG 720.92 100 720.50 720.93
4 2016-05-25 13:30:00.048 AAPL 98.00 100 NaN NaN
在上面的示例中,pd.merge_asof 将每行交易与具有相同代码和最接近时间的报价行进行匹配。
我发现这个操作在我的工作流程中非常不可或缺,我一直在绞尽脑汁地思考如何在 R 中完成这个操作。当然我可以只在 python 中执行操作并在 R 中读回数据帧,但是我的部分动机是学习 R。
最佳答案
您可以使用data.table
包进行滚动连接:
trades[quotes, on=.(ticker, time), roll=-Inf, c("bid","ask") := .(bid, ask)]
输出:
time ticker price quantity bid ask
1: 2016-05-25 13:30:00 MSFT 51.95 75 51.95 51.96
2: 2016-05-25 13:30:00 MSFT 51.95 155 51.97 51.98
3: 2016-05-25 13:30:00 GOOG 720.77 100 720.50 720.93
4: 2016-05-25 13:30:00 GOOG 720.92 100 720.50 720.93
5: 2016-05-25 13:30:00 AAPL 98.00 100 NA NA
数据:
library(data.table)
quotes <- fread("time ticker bid ask
2016-05-25_13:30:00.023 GOOG 720.50 720.93
2016-05-25_13:30:00.023 MSFT 51.95 51.96
2016-05-25_13:30:00.030 MSFT 51.97 51.98
2016-05-25_13:30:00.041 MSFT 51.99 52.00
2016-05-25_13:30:00.048 GOOG 720.50 720.93
2016-05-25_13:30:00.049 AAPL 97.99 98.01
2016-05-25_13:30:00.072 GOOG 720.50 720.88
2016-05-25_13:30:00.075 MSFT 52.01 52.03")
trades <- fread("time ticker price quantity
2016-05-25_13:30:00.023 MSFT 51.95 75
2016-05-25_13:30:00.038 MSFT 51.95 155
2016-05-25_13:30:00.048 GOOG 720.77 100
2016-05-25_13:30:00.048 GOOG 720.92 100
2016-05-25_13:30:00.048 AAPL 98.00 100")
quotes[, time := as.POSIXct(time, format="%Y-%m-%d_%H:%M:%OS")]
trades[, time := as.POSIXct(time, format="%Y-%m-%d_%H:%M:%OS")]
关于python - 是否有与 Python 的 pandas.merge_asof 等效的 R 语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58538114/