跟进这个问题...... KDB:在某些事件的“左右”时间选择数据
考虑一个巨大的市场数据表 T。我对 Status=`SSS 的行特别感兴趣。
但是,除了 (select from T where Status=`SSS) 给出的行之外,我还想选择该事件周围某个短时间间隔内的记录(与前面的问题相反,我们选择了一个围绕事件的固定数量的记录)。请注意,在某些情况下,这些间隔可能会重叠。什么是有效的方法来做到这一点?
跟进这个问题...... KDB:在某些事件的“左右”时间选择数据
考虑一个巨大的市场数据表 T。我对 Status=`SSS 的行特别感兴趣。
但是,除了 (select from T where Status=`SSS) 给出的行之外,我还想选择该事件周围某个短时间间隔内的记录(与前面的问题相反,我们选择了一个围绕事件的固定数量的记录)。请注意,在某些情况下,这些间隔可能会重叠。什么是有效的方法来做到这一点?
我们有一个想法可能对您有所帮助:
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
那么剩下的就是直截了当......
另一种方法是使用窗口连接,wj1
它允许您每次传入自定义窗口并对该窗口内的数据执行聚合。语法的简化解释是:
wj[window pairs;common columns;table 1;(table 2;(function;column))]
以下表为例:
q)trade / simplified trade table
time sym
---------
09:00 a
09:30 a
10:00 a
q)quote / simplified quote table
time sym px
------------------
09:12 a 9.420396
09:29 a 6.416515
10:07 a 8.53406
为了对每个时间quote
任一侧的 20 分钟窗口内的所有价格求和,我们使用以下方法。首先为窗口创建一对开始和结束时间:trade
sym
q)show window:-20 20+\:x`time
08:40 09:10 09:40
09:20 09:50 10:20
其中每个列表的长度与trade
表格相同。然后将其与价格wj
的聚合函数一起传递给:sum
px
q)wj1[window;`sym`time;x;(y;(sum;`px))]
time sym px
------------------
09:00 a 9.420396
09:30 a 15.83691
10:00 a 8.53406
要调查在每个窗口中聚合的值,我们可以使用 null 函数::
:
q)wj1[window;`sym`time;x;(y;(::;`px))]
time sym px
---------------------------
09:00 a ,9.420396
09:30 a 9.420396 6.416515
10:00 a ,8.53406
应该注意的是,wj1
仅考虑窗口内的值,而wj
将流行值视为窗口的一部分。