在 KDB/Q 中按时滑动窗口

Posted

技术标签:

【中文标题】在 KDB/Q 中按时滑动窗口【英文标题】:Sliding window on time in KDB/Q 【发布时间】:2017-03-02 17:45:26 【问题描述】:

Q/KDB 中有一些函数可以让我们在滑动窗口上进行聚合(msum、mavg 等)。但这些函数会考虑之前的行数。

我想要一个可以在滑动窗口上聚合但随着时间而不是行数的函数。例如最后 5 分钟。

这样的功能存在吗?如果没有,我该如何设计它?我不想使用 while 循环,因为数据量很大,它会大大降低我的程序速度。

感谢您的帮助

【问题讨论】:

【参考方案1】:

你想聚合到固定时间桶byxbar是你的朋友:http://code.kx.com/q/ref/arith-integer/#xbar

trade: ([] time:`time$(10:00 10:01 10:03 10:07 10:09); price:`float$(12.1 12.6 12.4 12.4 12.9); size:`int$(5 6 10 34 2))
select last price, sum size by 5 xbar time.minute from trade
minute| price size
------| ----------
10:00 | 12.4  21  
10:05 | 12.9  36

如果您想为每一行返回 5 分钟的时间,那么您正在寻找一个窗口连接:http://code.kx.com/q/ref/joins/#wj-wj1-window-join

w:-300000 0+\:trade.time
wj1[w;`time;trade;(trade;(last;`price);(sum;`size))]
time         price size
-----------------------
10:00:00.000 12.1  5   
10:01:00.000 12.6  11  
10:03:00.000 12.4  21  
10:07:00.000 12.4  44  
10:09:00.000 12.9  36    

【讨论】:

谢谢。你能解释一下这条线是做什么的吗:w:-300000 0+\:trade.time 是的。它为每一行创建滑动窗口。这表示当前交易时间减去 300000 毫秒到 0/- 0 毫秒(这是交易时间)。将 w 打印到控制台,你就会明白了。 trade.time 不起作用。我有以下错误:nyi。可能此错误是指尚未实施 - 表明您要执行的操作是有意义的,但尚未实施。和trade[`time]一样吗? 您的列表类型是什么?运行类型 tradeWithDV01[`time] timespan 具有纳秒精度。时间只有毫秒。所以你需要添加几个零。 w:-300000000000 0+\:tradeWithDV01[`时间]

以上是关于在 KDB/Q 中按时滑动窗口的主要内容,如果未能解决你的问题,请参考以下文章

滑动窗口9:239. 滑动窗口最大值和480滑动窗口中位数

LeetCode-滑动窗口滑动窗口最大值

算法总结之滑动窗口

精读《算法 - 滑动窗口》

滑动窗口

从一道Hard学习滑动窗口