KDB + \ q:如何填充规则间隔的时间序列?

Bra*_*rad 4 kdb

我想实现.ml.filltab []位于这里就经常由时间序列数据的表格相互间隔时间聚集即:

second     |  amount price 
-----------|----------------
02:46:01   |  54     9953.5
02:46:04   |  150          
02:46:05   |         9954.5
Run Code Online (Sandbox Code Playgroud)

应用.ml.filltab []函数不会更新索引,因此该表将错误地填充没有适当索引的值。即

second     |  amount price 
-----------|----------------
02:46:01   |  54     9953.5
02:46:04   |  150    9953.5    
02:46:05   |  150    9953.5
Run Code Online (Sandbox Code Playgroud)

与正确填写索引相反,如下所示:

second     |  amount price 
-----------|----------------
02:46:01   |  54     9953.5
02:46:02   |  54     9953.5
02:46:03   |  54     9953.5
02:46:04   |  150    9953.5    
02:46:05   |  150    9954.5
Run Code Online (Sandbox Code Playgroud)

除上述内容外,它还需要一个用于对数据进行分组的列,即“ sym列”,仅在汇总单个序列时就不需要。

一个人如何在一张表上执行一次补正操作以解决丢失的索引?谢谢

小智 6

一种方法是使用相同的架构创建一个辅助空表,其中第二列具有所有缺少的时间点。为此,请创建一个您感兴趣的所有时间的列表。一种方法是获取第一个和最后一个元素,然后执行以下操作:

q)f:exec first second from t
q)f
02:46:01
q)l:exec last second from t
q)l
02:46:05
q)s:f+`second$til 1+`long$l-f
q)s
02:46:01 02:46:02 02:46:03 02:46:04 02:46:05
Run Code Online (Sandbox Code Playgroud)

请注意,第二个类型需要转换为long类型才能使用til函数,然后再转换回第二个类型。此外,我们加1以确保02:46:05不会错过最后一次()。

我们可以通过执行以下操作来创建具有相同架构的空表:

q)et:select by second:s from 0#t
q)et
second  | amount price
--------| ------------
02:46:01|
02:46:02|
02:46:03|
02:46:04|
02:46:05|
Run Code Online (Sandbox Code Playgroud)

0#是创建具有与原始表相同架构的空表的快速方法t。现在,可以使用lj将两个表合并在一起,然后填充将向前填充任何空值:

q)et lj t
second  | amount price
--------| -------------
02:46:01| 54     9953.5
02:46:02|
02:46:03|
02:46:04| 150
02:46:05|        9954.5
q)fills et lj t
second  | amount price
--------| -------------
02:46:01| 54     9953.5
02:46:02| 54     9953.5
02:46:03| 54     9953.5
02:46:04| 150    9953.5
02:46:05| 150    9954.5
Run Code Online (Sandbox Code Playgroud)