DolphinDB中透视矩阵按日期轴行方向前向填充的实现方法
问题描述
处理因子数据时,原始长表结构为ticker + date + factor_val,部分标的在特定日期存在数据缺失(如停牌)。将其通过pivot by转为行是标的、列是日期的宽矩阵后,需要按行独立向右前向填充NULL值(即沿用该行最后一个有效值)。
示例场景:
填充前宽表:
ticker | 2024.01.02 | 2024.01.03 AAPL | 0.01 | 0.02 MSFT | -0.01 | NULL GOOG | 0.03 | -0.02
预期填充后:
ticker | 2024.01.02 | 2024.01.03 AAPL | 0.01 | 0.02 MSFT | -0.01 | -0.01 GOOG | 0.03 | -0.02
最小复现代码:
t = table( `AAPL`AAPL`MSFT`GOOG`GOOG as ticker, 2024.01.02 2024.01.03 2024.01.02 2024.01.02 2024.01.03 as date, [0.01, 0.02, -0.01, 0.03, -0.02] as factor_val ) wide = exec factor_val from t pivot by ticker, date // wide中MSFT/2024.01.03位置为NULL
直接调用ffill(wide)会按列填充(沿日期列向下),导致MSFT的缺失值被填充为GOOG同期的-0.02,不符合需求。
解决方法
方法一:转置矩阵后填充(针对已生成的宽表)
利用transpose转置矩阵,让原行变为列,此时ffill会按列(原行方向)填充,完成后再转置回原结构:
filled = transpose(ffill(transpose(wide)))
验证结果:filled[MSFT, 2024.01.03]会返回-0.01,符合预期。
方法二:长表阶段提前填充(更高效推荐)
相比宽表处理,在长表阶段按ticker分组、date排序后直接填充,再转宽表,内存效率更高(尤其当标的或日期数量庞大时):
// 长表按标的分组,按日期排序后前向填充因子值 t_filled = select ticker, date, ffill(factor_val) as factor_val from t context by ticker order by date // 转宽表 wide_filled = exec factor_val from t_filled pivot by ticker, date
此方法避免了宽表转置的额外开销,且逻辑更直观。
内容的提问来源于stack exchange,提问作者haru
相关产品推荐
相关产品推荐

