考虑财务报价数据,其中出价和要价不会同时得到更新。我想只选择出价和询价反映新市场水平的行。在下表中,这将对应于选择行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
答案 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