You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:17:26