跟进此问题...... KDB:selecting data "around" time of certain events
考虑一个巨大的市场数据表T.我对Status =`SSS。
的行特别感兴趣但是,除了给出的行(从T中选择Status =`SSS)之外,我还想选择在该事件周围的某个短时间间隔内的记录(与之前的问题相反,我们选择了围绕事件的固定数量的记录。请注意,在某些情况下,这些间隔可能会重叠。有效的方法是什么?
答案 0 :(得分:1)
我们在这里有一个可能对您有帮助的想法:
q)n:10000000;
q)T:([]time:asc n?1D0;sym:n?3;price:n?100f;status:@[n?`3;-100000?n;:;`SSS])
q)f:{[t;x;d]t where 0<sums sum @[c#0;;+;]'[(-1+c:count t)&t[`time]binr/:x+/:-1 1*d;1 -1]}
q)f[T;exec time from T where status=`SSS;0D00:00:00.01]
time sym price status
-----------------------------------------
0D00:00:01.169838756 2 77.1118 lbh
0D00:00:01.175813376 2 24.94157 emk
0D00:00:01.176316291 2 68.49994 SSS
0D00:00:01.180037856 1 81.54316 hhi
0D00:00:01.183518022 1 0.6516971 hni
0D00:00:01.291926205 2 51.94651 kjf
0D00:00:01.300173997 0 14.67675 SSS
0D00:00:01.309709250 1 82.77418 oji
这里的想法是提取事件的时间并使用binr
来找到您需要的所有时间窗口:
t1 t2 t3 t4 t5 t6 t7 t8 t9 t10
`a `b `c `S `d `e `S `f `g `h
说t3,t5和t6,t8符合时间窗口,我们在它们周围放置一个标记
t1 t2 t3 t4 t5 t6 t7 t8 t9 t10
`a `b `c `S `d `e `S `f `g `h
0 0 1 0 0 1 0 0 0 0
0 0 0 0 0 -1 0 0 -1 0
sums sum
将突出显示您需要的所有记录:
t1 t2 t3 t4 t5 t6 t7 t8 t9 t10
`a `b `c `S `d `e `S `f `g `h
0 0 1 1 1 1 1 1 0 0
然后剩下的就是直接......