2016-10-20 3 views
3

В Q/KDB есть некоторые функции, которые позволяют нам заполнить скользящее окно (msum, mavg и т. Д.). Но эти функции учитывают количество предыдущих строк.Скользящее окно во времени в KDB/Q

Мне нужна функция, которая будет агрегироваться в скользящем окне, но со временем вместо количества строк. Например, за последние 5 минут.

Существуют ли такие функции? Если нет, как я могу его создать? Я не хочу использовать цикл while, поскольку он слишком сильно замедлит мою программу из-за огромного объема данных.

Спасибо за вашу помощь

ответ

5

вы хотите агрегировать в фиксированное время ведер by и xbar ваш друг: 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  
+0

Спасибо. Не могли бы вы объяснить, что это за линия: w: -300000 0 + \: trade.time – MarinD

+1

Да. он создает скользящее окно для каждой строки. в котором указано текущее время торговли минус 300000 миллисекунд до 0/- 0 миллисекунд (это время торговли). Распечатайте w на консоль, и вы получите представление. – hellomichibye

+0

торговля.time не работает. У меня есть следующая ошибка: nyi. Возможно, эта ошибка относится к еще не реализованной - предполагает, что операция, которую вы связываете, имеет смысл, но она еще не реализована. Это то же самое, что торговля ['time]? – MarinD

Смежные вопросы