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

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

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

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

感谢您的帮助

【问题讨论】:

    标签: aggregate aggregate-functions kdb sliding-window q-lang


    【解决方案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[`时间]
    猜你喜欢
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2017-08-26
    • 2023-04-09
    • 2013-01-17
    • 2018-07-23
    • 2017-10-19
    • 1970-01-01
    相关资源
    最近更新 更多