python - 是否有与 Python 的 pandas.merge_asof 等效的 R 语言?

标签 python r pandas

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/

相关文章:

sql-server - 从 UDF 访问 Sql Server CLR 文件系统

regex - 如何在通过 R 中的正则表达式匹配找到字母后将其替换为小写字母

xml - 使用 XML/RCurl R 包解析 HTML 表,而不使用 readHTMLTable 函数

python - 如何使用 MultiIndex 在 DataFrame 的单个级别上迭代和应用函数?

python - 如何计算 Python 中所有列的异常值?

python - 从多个词典提取到 csv

python - 将 HSV 转换为灰度以应用 Hough 变换

python - GEKKO 中的非线性输入(操纵变量)

python - 比较两列中以逗号分隔的项目

python - 使用 pd.melt() 反转多索引数据帧