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

时间:2019-09-03 00:54:08

标签: kdb

我正在尝试在由定期间隔的时间集合(即:

)组成的时间序列数据表上实现here上的.ml.filltab []
second     |  amount price 
-----------|----------------
02:46:01   |  54     9953.5
02:46:04   |  150          
02:46:05   |         9954.5

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

second     |  amount price 
-----------|----------------
02:46:01   |  54     9953.5
02:46:04   |  150    9953.5    
02:46:05   |  150    9953.5

与按如下正确填写索引相反:

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

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

一个人如何对占索引缺失的表进行填充操作? 谢谢

2 个答案:

答案 0 :(得分: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

请注意,第二个类型需要转换为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|

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

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

答案 1 :(得分:4)

这里确实有两个单独的步骤:在表中填充空值,并从表中以规则的间隔生成时间序列。

您已经可以填写空值。要生成时间序列,可以使用as-of join函数。

给出您的(已经填写好的)表格

q)show t:([second:02:46:01 02:46:04 02:46:05]amount:45 150 150;price:9953.5 9953.5 9954.5)
second  | amount price
--------| -------------
02:46:01| 45     9953.5
02:46:04| 150    9953.5
02:46:05| 150    9954.5

您可以通过首先定义具有所需采样时间的辅助表来生成时间序列

q)show ts:([]second:02:46:01+til 5)
second
--------
02:46:01
02:46:02
02:46:03
02:46:04
02:46:05

然后联接这两个表

q)aj[`second;ts;t]
second   amount price
----------------------
02:46:01 45     9953.5
02:46:02 45     9953.5
02:46:03 45     9953.5
02:46:04 150    9953.5
02:46:05 150    9954.5

当表中包含多种乐器时,您可以轻松地扩展此方法以生成这样的时间序列。