我正在尝试在由定期间隔的时间集合(即:
)组成的时间序列数据表上实现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列”,当仅汇总单个序列时就不需要。
一个人如何对占索引缺失的表进行填充操作? 谢谢
答案 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
当表中包含多种乐器时,您可以轻松地扩展此方法以生成这样的时间序列。