Разница между строками в KDB/Q

Я новичок в KDB/Q, и у меня есть вопрос, как получить разницу между двумя (не обязательно соседними) строками.

У меня есть только одна таблица, которая выглядит следующим образом:

q)tickers:`ibm`bac`dis`gs`ibm`gs`dis`bac
q)pxs:100 50 30 250 110 240 45 48
q)dates:2013.05.01 2013.01.05 2013.02.03 2013.02.11 2013.06.17 2013.06.21 2013.04.24 2013.01.06

q)trades:([tickers;dates];pxs)
q)trades
tickers dates     | pxs
------------------| ---
ibm     2013.05.01| 100
bac     2013.01.05| 50
dis     2013.02.03| 30
gs      2013.02.11| 250
ibm     2013.06.17| 110
gs      2013.06.21| 240
dis     2013.04.24| 45
bac     2013.01.06| 48

Я хотел бы иметь в таблице либо еще один столбец, в котором хранится разница между текущей и предыдущей ценой, либо другую структуру, аналогичную по структуре. Ключевой вопрос, на который необходимо ответить в результате, заключается в следующем: «Насколько изменились акции по сравнению с предыдущим временем, когда была зафиксирована цена?»

До сих пор я пробовал что-то вроде:

select tickers, dates, pxs - pxs(dates bin (exec dates from trades where tickers = trades.tickers)) from trades

что на самом деле не работает (вообще). Определенно из-за попыток выполнять SQL-подобные запросы и мышления, ориентированного на строки.

Ниже приведен пример искомого ответа:

q)trades: do magic with trades
q)trades
tickers dates     | pxs | delta
------------------| --- | -----
ibm     2013.05.01| 100 | 0
bac     2013.01.05| 50  | 0
dis     2013.02.03| 30  | 0
gs      2013.02.11| 250 | 0
ibm     2013.06.17| 110 | 10
gs      2013.06.21| 240 | -10
dis     2013.04.24| 45  | 15
bac     2013.01.06| 48  | -2

Спасибо за помощь, Дэн


kdb
person user1158959    schedule 09.01.2014    source источник


Ответы (4)


если вы сделаете:

select pxs by dates,tickers from table

у вас будет сложный столбец (pxs), который представляет собой список цен на конкретную дату и тикер. Затем вы можете применить дельты:

select deltas pxs by dates,tickers from table

Что даст вам бегущую разницу. Первое значение — это исходные пиксели, поэтому вам нужно обновить первое значение до 0.

РЕДАКТИРОВАТЬ

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

person Manish Patel    schedule 09.01.2014
comment
Спасибо за Ваш ответ - person user1158959; 11.01.2014

даты обновления, пиксели, дельта:(0N,(-1_ пиксели) - 1_ пиксели) по тикерам из сделок

Посмотрите, как это работает: выбор пикселей по билетам из сделок создает таблицу, строки которой содержат: билет и список пикселей. Итак, в каждой строке у нас есть список:

tickers| pxs
-------| -------
bac    | 50  48
dis    | 30  45
gs     | 250 240
ibm    | 100 110

теперь мы должны применить функцию, которая рассчитает дельту. Лучшая функция, упомянутая выше: дельты, но мой вариант примерно такой же.

если выбираем - то у нас будет таблица с тиккерами|список пикселей|список дельт, но если мы используем update..by, то он разгруппирует сгруппированные значения.

person user3141259    schedule 10.01.2014
comment
Некоторое словоблудие, объясняющее ваш ответ, сделает этот ответ полезным; просто набирать код на самом деле не нужно, так как это не учит эффективно. - person Joe; 10.01.2014
comment
Спасибо за ответ, тоже очень полезный. - person user1158959; 11.01.2014

Вы можете получить те же результаты, используя функцию prev. Стоит подчеркнуть, что prev автоматически добавляет нуль (0N) в качестве первого элемента. Это важно, поскольку у нас нет доступной предыдущей информации, однако добавление 0 в качестве первого элемента предполагает, что никаких изменений не было; хотя это зависит от того, как вы хотите обрабатывать первую запись.

q)update delta:pxs-prev[pxs] by tickers from trades
tickers dates     | pxs delta
------------------| ---------
ibm     2013.05.01| 100
bac     2013.01.05| 50
dis     2013.02.03| 30
gs      2013.02.11| 250
ibm     2013.06.17| 110 10
gs      2013.06.21| 240 -10
dis     2013.04.24| 45  15
bac     2013.01.06| 48  -2

используя deltas для получения тех же результатов (0N вместо 0)

q)update delta:{0N,1_deltas x}pxs by tickers from trades
person nyi    schedule 28.06.2018

person    schedule
comment
Чтобы прояснить встроенную анонимную функцию {0,1_deltas x}: запятая — это оператор соединения списка, а 1_ означает удаление первой записи из дельта-результата. Поскольку функция вызывается без ' или each, функция вызывается только один раз с полным столбцом данных. Если 0,1_ удалить, первая дельта будет 100, что обычно нежелательно. - person kevinarpe; 24.11.2016