KDB:选择与两个更新列对应的行

时间:2014-08-11 15:20:36

标签: kdb

考虑财务报价数据,其中出价和要价不会同时得到更新。我想只选择出价和询价反映新市场水平的行。在下表中,这将对应于选择行t1,t5,t7,t9。这样做有什么优雅的方式吗? (或者,我想排除行t2,t3,t4,这些行对应于仅更新了一个bid / ask的时间)。

time bid ask
t1 12 13
t2 12 14
t3 12 14
t4 12 14
t5 13 14
t6 13 14
t7 14 15
t8 14 15
t9 13 14

2 个答案:

答案 0 :(得分:1)

这应该做的伎俩(没有大量测试)

tab:([] time:`t1`t2`t3`t4`t5`t6`t7`t8`t9;bid:12 12 12 12 13 13 14 14 13;ask:13 14 14 14 14 14 15 15 14)

q)select from tab where differ {$[all x<y;y;x]}\[flip sums each differ each (bid;ask)]
time bid ask
------------
t1   12  13 
t5   13  14 
t7   14  15 
t9   13  14 

Another example which contains more edge cases:

tab:([] time:`g`b`b`b`b`g`b`b`g`b`g`g`b`g;bid:12 12 12 12 12 13 13 14 13 13 14 13 14 14;ask:13 13 14 15 14 14 14 14 15 16 16 15 15 16)

q)select from tab where differ {$[all x<y;y;x]}\[flip sums each differ each (bid;ask)]
time bid ask
------------
g    12  13 
g    13  14 
g    13  15 
g    14  16 
g    13  15 
g    14  16 

这可能会有一种稍微简洁的方法,但我现在会测试这种方法。

编辑:在总和之后更有效地进行翻转 - 在上面改变了。

我看过的先前方法只使用了每列不同的布尔值。这种方法可以工作(也可能更直观),但在时间和内存方面效率都较低,所以我会坚持上述第一种方法。

scanner:{if[all x;x:not x];$[(y&z)|(x[0]&z)|x[1]&y;11b;x|(y;z)]}

q)select from tab where all each scanner\[00b;differ bid;differ ask]
time bid ask
------------
t1   12  13
t5   13  14
t7   14  15
t9   13  14

答案 1 :(得分:0)

我尝试了其他方法,花费的时间更少但内存更多。它如下:

第1步:计算一个包含行的表格,其中包含&#39; ask&#39;变化。然后从此中间表中删除bid = previous bid。

的行

第2步:计算一个包含&#39; bid&#39;行的表格。变化。然后从此中间表中删除ask = previous ask。{(从不同的标签中选择,bid&lt;&gt; prev bid)}

第3步:加入表1和2

我使用了@terrylench示例中的表格。我使用了实际时间值,因为我需要该列进行排序。

     q)tab:([] time:.z.T+til 14;bid:12 12 12 12 12 13 13 14 13 13 14 13 14 14;ask:13 13 14 15 14 14 14 14 15 16 16 15 15 16)
     q)`time xasc distinct (select from tab where differ ask,bid<>prev bid) upsert (select from tab where differ bid,ask<>prev ask)

time         bid ask
--------------------
10:45:02.530 12  13
10:45:02.535 13  14
10:45:02.538 13  15
10:45:02.540 14  16
10:45:02.541 13  15
10:45:02.543 14  16