2015-01-20 2 views
0

У меня есть файл csv с некоторыми данными о ценах на высокочастотные данные, и я бы хотел получить во второй ценовой информации из таблицы.Заполните, во-вторых, данные от Q KDB +

В каждом файле есть столбцы с именем date, time, symbol, price, volume и т.д.

Есть несколько секунд без какой-либо торговли, так что отсутствуют данные в нескольких секундах.

Мне интересно, как я могу заполнить недостающие данные в Q, чтобы получить во втором случае данные с 9:30 до 16:00? Если цена отсутствует, просто используйте последнюю цену в качестве цены за эту секунду.

Я планирую написать какой-то цикл, но я не знаю, как именно к этому.

+0

Можете ли вы добавить пример любого кода, который у вас уже есть, а также код, в котором вы сейчас извлекаете данные? Прочтите https://stackoverflow.com/help/mcve для получения информации о том, как написать хороший вопрос. –

+0

Я решил проблему, используя aj. спасибо в любом случае – Demi

ответ

1

Упрощая немного, я предполагаю, что у вас есть какие-то случайные временные метки в наборе данных, как это:

time       price 
-------------------------------------- 
2015.01.20D22:42:34.776607000 7 
2015.01.20D22:42:34.886607000 3 
2015.01.20D22:42:36.776607000 4 
2015.01.20D22:42:37.776607000 8 
2015.01.20D22:42:37.886607000 7 
2015.01.20D22:42:39.776607000 9 
2015.01.20D22:42:40.776607000 4 
2015.01.20D22:42:41.776607000 9 

поэтому некоторые недостающие секунды там. Я собираюсь назвать эту таблицу t. Так что если вы делаете на секунду типа запроса, очевидно, секунданты, которые отсутствуют по-прежнему отсутствуют:

q)select max price by time.second from t 
second | price 
--------| ----- 
22:42:34| 7 
22:42:36| 4 
22:42:37| 8 
22:42:39| 9 
22:42:40| 4 
22:42:41| 9 

Чтобы получить недостающие секунды, вы должны присоединиться списком нулей. В этом случае мы знаем, что данные идут от 22:42:34 до 22:42:41, но на самом деле вам нужно будет найти минимальное/максимальное время и использовать это для создания временной таблицы «null» для объединения:

q)([] second:22:42:34 + til 1+`int$22:42:41-22:42:34 ; price:(1+`int$22:42:41-22:42:34)#0N) 
second price 
-------------- 
22:42:34 
22:42:35 
22:42:36 
22:42:37 
22:42:38 
22:42:39 
22:42:40 
22:42:41 

Затем покинул присоединиться:

q)([] second:22:42:34 + til 1+`int$22:42:41-22:42:34 ; price:(1+`int$22:42:41-22:42:34)#0N) lj select max price by time.second from t 
second price 
-------------- 
22:42:34 7 
22:42:35 
22:42:36 4 
22:42:37 8 
22:42:38 
22:42:39 9 
22:42:40 4 
22:42:41 9 

Вы можете использовать fills или любой ваша любимая начинку эвристики после этого.

q)fills `second xasc asc ([] second:22:42:34 + til 1+`int$22:42:41-22:42:34 ; price:(1+`int$22:42:41-22:42:34)#0N) lj select max price by time.second from t 
second price 
-------------- 
22:42:34 7 
22:42:35 7 
22:42:36 4 
22:42:37 8 
22:42:38 8 
22:42:39 9 
22:42:40 4 
22:42:41 9 

(Обратите внимание на то на second перед fills!)

Кстати для больших таблиц это будет гораздо быстрее, чем цикл. Циклы в q - это, как правило, плохая идея.

EDIT

Вы можете использовать запятую присоединиться тоже обе таблицы должна быть сконструирована на second колонки

t,t1 

(где t1 является нулевой заполненной таблица ключа на second)

Я не тестировал его, но я подозреваю, что он будет немного быстрее, чем версия lj.

+0

Спасибо большое! Я решил проблему с помощью aj – Demi

+1

. Aj также будет работать - убедитесь, что таблица отсортирована, потому что она выполняет поиск в двоичном порядке, чтобы найти ближайшее совпадение.Это будет намного медленнее, чем мое решение тоже :-) –