Можете ли вы рассчитать временной интервал между двумя заданными c значениями столбца в KDB + (Q)? - PullRequest
1 голос
/ 03 августа 2020

У меня есть таблица с двумя столбцами: время, разделение. Моя цель - вычислить средние временные интервалы, через которые происходит неотрицательное разделение по таблице; поэтому, если разделение некоторое время является положительным, а затем переключается на отрицательное, я хочу, чтобы время, в течение которого разделение оставалось положительным, было сохранено в другой таблице (и наоборот). С таблицей, полностью построенной только из временных интервалов, в которых разделение переключает знаки, мне нужно вычислить среднее значение.

Я также хотел бы иметь возможность хранить среднее значение разделения сверх заданного c интервал времени в таблицу и введите его длину. значение разделения в этом интервале (что-то вроде +0,0014).

Итак, как я могу захватить временной диапазон, в котором столбец разделения равен + или -, и сопоставить его со средним значением разделения за этот период ?

1 Ответ

2 голосов
/ 03 августа 2020

Следующий небольшой фрагмент примерной таблицы, используемой для расчета среднего разделения за период положительного разделения:

q)show tab:([]time:asc 20?03:00:00;sep:(20?1 -1)*20?1f)
time     sep
-------------------
00:18:02 0.6425202
00:30:59 0.5666474
00:43:05 0.2966318
...

Следующая функция имеет 2 шага, сначала нужно получить разницу во времени между тиками, а затем суммировать время и получить среднее разделение групп непрерывных строк с положительным или отрицательным разделением (первое утверждение). Таким образом, вывод может быть отфильтрован, чтобы получить только те строки, которые имеют положительное разделение.

q)f:{t:select sum time,avg sep by sums differ sep>0 from update deltas time from x;select time,sep from t where sep>0}
q)f tab
time     sep
-------------------
00:12:06 0.5019331
00:00:23 0.04909149
00:07:14 0.9275499
00:08:45 0.4221353
00:07:05 0.7766876

Чтобы повторить для отрицательного результата, вы можете заменить >0 на <0. Я не был уверен, как вы хотите обрабатывать нули, поэтому я использовал >0 вместо signum.

...