KDB, сравнивающий значения, полученные двумя разными системами за определенный период времени.

У меня есть две разные системы, помещающие данные в таблицу kdb. Они обусловлены потоком цен. Я хотел бы сравнить полученные значения, чтобы в конечном итоге отметить большие различия. Я очень новичок в kdb, и мне трудно даже разработать запрос отправной точки.

В конечном итоге я хотел бы взять период времени (вероятно, минуту), найти строку для каждой системы в течение этого периода времени, где цена вождения одинакова, и сравнить полученные значения.

Однако хорошей отправной точкой для меня было бы понять, как захватить первую строку в течение периода времени для каждой системы и сравнить/объединить.

Спасибо.

Упрощенные примеры данных

Пример: -

System             | Time    | driver | result1 | result2
systemA.instrument1| 11:59:59| 101.4  | 3.4     | 4.6
systemA.instrument1| 12:00:01| 101.5  | 3.8     | 4.8
systemA.instrument1| 12:00:02| 101.6  | 3.3     | 2.3
systemA.instrument2| 12:00:02| 106.6  | 11.1    | 11.3
systemA.instrument1| 12:00:05| 101.7  | 3.9     | 5.6
systemB.instrument1| 12:00:09| 101.1  | 3.2     | 7.8
systemB.instrument1| 12:00:14| 101.2  | 3.9     | 3.4
systemB.instrument1| 12:00:17| 101.3  | 3.1     | 8.9
systemB.instrument2| 12:00:19| 106.5  | 11.2    | 11.4
systemB.instrument1| 12:00:58| 101.7  | 3.9     | 9.3
systemB.instrument1| 12:00:59| 101.7  | 3.3     | 3.4
systemB.instrument1| 12:01:03| 101.4  | 3.1     | 5.6

Мне нужны данные только с 12:00:00 до 12:00:59

Единственный соответствующий драйвер между SystemA и SystemB Instrument1 — 101.7. Я бы хотел, чтобы они использовались, и разница между показанными результатами. Для инструмента 2 драйвер никогда не совпадает, поэтому я хочу использовать цены драйверов, наиболее близкие между системами.

results      | driver | driver diff | result1diff | result2diff
instrument1  | 101.7  | 0           | 0           | 3.7
instrument2  |        | 0.1         | 0.1         | 0.1

person user1417230    schedule 08.05.2014    source источник
comment
Можете ли вы привести конкретные примеры ваших текущих данных, их формат и результат, который вы ожидаете?   -  person John at TimeStored    schedule 08.05.2014


Ответы (1)


Сначала разделите столбец System на составные части:

table:(flip exec `System`Instrument!flip ` vs/: System from table)
    ,'delete System from table

Ответ на ваш первый вопрос (получите первую строку для каждого инструмента и системы):

q)table:(flip exec `System`Instrument!flip ` vs/: System from table),'delete System from table
Instrument  System | Time     driver result1 result2
-------------------| -------------------------------
instrument1 systemA| 11:59:59 101.4  3.4     4.6    
instrument1 systemB| 12:00:09 101.1  3.2     7.8    
instrument2 systemA| 12:00:02 106.6  11.1    11.3   
instrument2 systemB| 12:00:19 106.5  11.2    11.4   

Кстати, в q чаще используется запрос последней строки, и этого легче достичь:

q)select by Instrument,System from table

Определите функцию для поиска индексов ближайших значений в двух числовых векторах:

q)closest:{a:a?min a:abs(-) ./: x cross y;(a div count y;a mod count y)}

Результат запроса1, где находятся ближайшие водители:

q)select result1:result1(value group System)@'closest . value driver group System by Instrument from table

Instrument | result1  
-----------| ---------
instrument1| 3.4  3.1 
instrument2| 11.1 11.2
person mollmerx    schedule 10.05.2014