问题如图:原始数据表A有所有股票的全部有效交易数据(也就是说没有股票停牌日期的数据),有什么方法可以通过与交易日期的关联,将停牌期间的数据补回来,缺失值用0填充。
现在有效的办法是通过对所有股票代码进行循环遍历,在循环内对交易日期与股票依次做lj,最后汇总所有结果。
问题:有没有更加高效优雅的写法来实现这个功能(也就是不用循环实现)。
先用 interval 把所有缺失的天填上,再过滤掉不在 marketDay 的数据
st = take(`a, 7) join take(`b, 6)
date = 2023.08.01 + 0 1 3 6 7 8 9 0 1 2 3 8 9
val = 35 34 35.79 33.26 32.88 33.73 31 25 24 22 25.79 21 31
t = table(st, date, val)
marketDay = 2023.08.01 + 0 1 2 3 6 7 8 9
re = select last(val) from t group by st, interval(date, 1d, 0) as date
re1 = select * from re where date in marketDay
resample 函数支持交易日历。所以可以考虑,先将 t 展成宽表,再对宽表使用 resample 函数补充停牌日期数据。最后将宽表转成窄表。参考脚本如下:
// 模拟数据 code = take(`a, 7) join take(`b, 6) date = 2023.08.01 + 0 1 3 6 7 8 9 0 1 2 3 8 9 val = 35 34 35.79 33.26 32.88 33.73 31 25 24 22 25.79 21 31 t = table(code, date, val) // 交易日 marketDay = getMarketCalendar("SSE", 2023.08.01, 2023.08.10) // 代码实现 tmp = panel(t.date, t.code, t.val).resample("SSE", last).nullFill(0) res = unpivot(table(tmp.rowNames() as date, tmp), `date, tmp.colNames()).rename!(`date`code`val)