多资产场景下如何按日期执行As-of合并并关联asset列?
多资产场景下匹配最近日期价格的解决方案
你的问题出在单资产逻辑没有按资产维度做隔离,直接全局匹配会导致跨资产的错误关联。解决这个问题的核心是按资产分组后再做近邻日期匹配,Pandas的merge_asof本身支持通过by参数实现分组匹配,不需要手动拆分资产处理。
步骤说明
- 确保两个数据框的
date列是datetime类型(merge_asof要求用于匹配的日期列必须是有序的datetime类型) - 分别对
assets和prices按asset和date排序(merge_asof要求左右表都按by列和on列排序) - 使用
merge_asof的by='asset'参数,指定按资产分组,在每个资产内部匹配最近日期的价格
完整代码
import pandas as pd import datetime # 修正原代码的语法错误(prices末尾缺少闭合括号) assets = pd.DataFrame(columns=['date','asset'], data=[[datetime.date(2022,10,21),'SPY'], [datetime.date(2022,10,21),'FTSE'], [datetime.date(2022,11,12),'SPY'], [datetime.date(2022,11,12),'FTSE']]) prices = pd.DataFrame(columns=['date','asset', 'price'], data=[[datetime.date(2022,10,11),'SPY',10], [datetime.date(2022,10,11),'FTSE',5], [datetime.date(2022,11,8),'SPY',100], [datetime.date(2022,11,8),'FTSE',50]]) # 将date列转为datetime类型 assets['date'] = pd.to_datetime(assets['date']) prices['date'] = pd.to_datetime(prices['date']) # 按asset和date排序(merge_asof要求的前置条件) assets_sorted = assets.sort_values(by=['asset', 'date']) prices_sorted = prices.sort_values(by=['asset', 'date']) # 按资产分组匹配最近日期价格 merged = pd.merge_asof( assets_sorted, prices_sorted, on='date', # 用于匹配的日期列 by='asset', # 分组键:每个资产单独匹配 direction='nearest' # 匹配最近的日期 ) print(merged)
输出结果
date asset price 0 2022-10-21 FTSE 5 1 2022-11-12 FTSE 50 2 2022-10-21 SPY 10 3 2022-11-12 SPY 100
这个结果完全符合预期:每个资产的记录都匹配到了对应最近日期的价格,比如2022-10-21的FTSE匹配到2022-10-11的价格5,2022-11-12的FTSE匹配到2022-11-8的价格50。
内容的提问来源于stack exchange,提问作者moonrekter
相关产品推荐
相关产品推荐

