kdb - 如何以 dynamic/fast 方式增加缺少日期的 table

kdb - how to augment table with missing dates in a dynamic/fast way

我在内存中有一个 table 列(日期、符号、符号类型、因子、权重)。

在某些情况下,这个内存中的 table 一旦查询了特定的日期范围,就会丢失整个日期。可能是今天的数据,或者如果我们要查询多个日期,可能是中间的一天,也可能是多天,或者最后一天,或者开始。

我怎样才能想出一个查询,用到那时为止的最大日期来填充那些缺失的日期?

所以如果我们有如下数据: 示例:

.z.D 
.z.D-2
.z.D-3
.z.D-6
.z.D-7

我希望 table 看起来像这样:

.z.D -> .z.D
.z.D-1 -> copy of .z.D-2
.z.D-2 -> .z.D-2
.z.D-3 -> .z.D-3
.z.D-4 -> copy of .z.D-6
.z.D-5 -> copy .z.d-6
.z.D-6 -> .z.D-6
.z.D-7 -> .z.D-7

如果您的查询中缺少今天,请使用以前可用的日期作为今天。 如果在您的查询中最后一天是昨天并且它丢失了,请使用前一个可用日期作为昨天,依此类推。 如果您的最后一个(最小日期)丢失,请向上使用下一个可用日期。

我可以通过识别缺失日期并逐日检查缺失日期来手动执行此操作,但我想知道是否有更好的方法来执行此操作。

aj 可以通过构造一个 ([] date: listofdesireddates) cross ([] sym: listofsyms) cross ([] sectors: symtype) 来处理中间的日期,然后用 table 但它并不能解决所有情况,例如,如果缺失的一天是今天或开始时。

快速猜测,但对结果使用 xgroup 的阶梯函数似乎可行。

res:getFromTab[dates];
f:{`date xcols:update date:x from y@x};
xgrp:`s#`date xasc `date xgroup res;
raze f[;xgrp] each dates

性能可能很糟糕...

你能想出一个可重现的例子来说明为什么 aj 不起作用吗?正常 aj 用法应该可以解决这个问题:

t1:([]date:.z.D-til 8;sym:`ABC);
t2:`date xasc([]date:.z.D-0 2 3 6 7;sym:`ABC;data:"I"$ssr[;".";""]each string .z.D-0 2 3 6 7);

q)aj[`sym`date;t1;t2]
date       sym data
-----------------------
2020.07.20 ABC 20200720
2020.07.19 ABC 20200718
2020.07.18 ABC 20200718
2020.07.17 ABC 20200717
2020.07.16 ABC 20200714
2020.07.15 ABC 20200714
2020.07.14 ABC 20200714
2020.07.13 ABC 20200713

/If you need your last date to fill "upwards" then use fills:

update fills data by sym from aj[`sym`date;([]date:.z.D-til 9;sym:`ABC);t2]