KDB:选择某些事件“大约”时间的数据Part2

时间:2014-08-19 15:08:29

标签: intervals kdb q-lang

跟进此问题...... KDB:selecting data "around" time of certain events

考虑一个巨大的市场数据表T.我对Status =`SSS。

的行特别感兴趣

但是,除了给出的行(从T中选择Status =`SSS)之外,我还想选择在该事件周围的某个短时间间隔内的记录(与之前的问题相反,我们选择了围绕事件的固定数量的记录。请注意,在某些情况下,这些间隔可能会重叠。有效的方法是什么?

1 个答案:

答案 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

然后剩下的就是直接......