Сводная таблица с несколькими столбцами значений в KDB + - PullRequest
3 голосов
/ 07 февраля 2020

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

tb: ([] time: 2010.01.01 2010.01.01; side:`Buy`Sell; price:100 101; size:30 50)

time        side    price   size
--------------------------------
2010.01.01  Buy     100     30
2010.01.01  Sell    101     50

В приведенную ниже таблицу с одной строкой:

tb1: ([] enlist time: 2010.01.01; enlist price_buy:100; enlist price_sell:101; enlist size_buy:30; enlist size_sell:50)

time        price_buy price_sell size_buy size_sell
-----------------------------------------------------
2010.01.01  100       101        30       50

Какой самый эффективный способ достижения это?

Ответы [ 3 ]

4 голосов
/ 07 февраля 2020
(select price_buy:price, size_buy:size by time from tb where side = `Buy) lj select price_sell:price, size_sell:size by time from tb where side = `Sell

time      | price_buy size_buy price_sell size_sell
----------| ---------------------------------------
2010.01.01| 100       30       101        50

Если вы хотите избежать двух операторов, выберите:

raze each select `price_buy`price_sell!(side!price)@/:`Buy`Sell, `size_buy`size_sell!(side!size)@/:`Buy`Sell by time from tb

В качестве дополнительного примечания указание столбца даты с меткой времени может вводить в заблуждение. Типичные финансовые таблицы в kdb имеют формат date time sym etc

Редактировать: Функциональная форма для создания динамических c столбцов:

{x[0] lj x[1]}[{?[`tb;enlist (=;`side;enlist `$x);(enlist `time)!enlist `time;(`$("price",x;"size",x))!(`price;`size)]} each ("Sell";"Buy")] time | priceSell sizeSell priceBuy sizeBuy ----------| ----------------------------------- 2010.01.01| 101 50 100 30

2 голосов
/ 07 февраля 2020

Общая функция поворота на веб-сайте Kx может сделать это, см. https://code.kx.com/q/kb/pivoting-tables/

q)piv[tb;(),`time;(),`side;`price`size;{[v;P]`$raze each string raze P[;0],'/:v,/:\:P[;1]};{x,z}]
time      | Buyprice Sellprice Buysize Sellsize
----------| -----------------------------------
2010.01.01| 100      101       30      50

1 голос
/ 07 февраля 2020

У меня есть функция поворота в github . Но он не поддерживает несколько столбцов

.math.st.pivot: {[t;rc;cf;ff]
  P: asc distinct t cf;
  Pcol: `$string[P] cross "_",/:string key ff;
  t: ?[t;();rc!rc;key[ff]!{({[x;y;z] z each y@group x}[;;z];x;y)}[cf]'[key ff;value ff]];
  t: ![t;();0b; Pcol! raze {((';@);x;$[-11h=type y;enlist;::] y)}'[key ff]'[P] ];
  ![t;();0b;key ff]
};

Но вы можете оставить объединение для достижения ожидаемого результата:

.math.st.pivot[tb;enlist`time;`side;enlist[`price]!enlist first]
  lj .math.st.pivot[tb;enlist`time;`side;enlist[`size]!enlist first]

Похоже, что добавление поддержки нескольких столбцов - хорошая идея.

...