2016-11-12 3 views
2

У меня есть база данных торговли запасами (имя «ТРЕЙДЫ»), и я долго пытаюсь сделать простой цикл (с функцией EACH), который суммирует все величины, которые превышают pre -определенный порог количества для каждого ISIN. Данные выглядит следующим образом:Петля с EACH в Q KDB +

q) select TIME, PRICE, QUANTITY from TRADES where ISIN=`IT123 

TIME PRICE QUANTITY 
8:58:05 9.47 66 
9:00:09 9.47 55 
9:00:56 9.48 107 
9:01:06 9.49 7 
9:01:33 9.50 9 
9:03:11 9.07 200 
9:06:27 9.07 100 
9:07:46 9.12 65... 

Сначала я пытаюсь этот код для одного ISIN:

q) myquant: ([] qu: 1 + til 100) //pre-define quantities from 1 to 100 

q) f:{[x] (select sum QUANTITY from TRADES where ISIN=`IT123, QUANTITY> x)} 

q) f each myquant.qu //use function EACH for all x that are in myquant 

И тогда я получаю некоторые иероглифы ... Может быть, это потому, что список ошибочно указано?

Мне также нужно делать эти вычисления не только для одного, но и для всех ISIN, которые у меня есть в базе данных (т. Е. «КАЖДЫЙ отличный ISIN»).

Большое спасибо за помощь заранее.

ответ

2

Учитывая некоторые trades:

q)show trades:flip`isin`time`price`quantity!100?/:(`US5949181045`US38259P5089`US0378331005;24t;100f;100) 
    isin   time   price quantity 
    ------------------------------------------- 
    US5949181045 18:45:28.487 60.91539 12 
    US5949181045 04:35:02.468 98.30794 62 
    US0378331005 23:39:20.774 75.43122 18 
    US38259P5089 09:37:08.266 38.13679 37 
    US0378331005 12:09:01.385 3.112646 17 
    .. 

Для minQty в диапазоне от 0 до 100:

q)raze {[minQty] select sum quantity by isin,minQty:minQty from trades where quantity>minQty} each til 100 
    isin   minQty| quantity 
    -------------------| -------- 
    US0378331005 0  | 1537 
    US38259P5089 0  | 1767 
    US5949181045 0  | 1435 
    US0378331005 1  | 1537 
    US38259P5089 1  | 1767 
    .. 

Результата дает величину суммы для каждого ISIN, где количество является> данного minQty

+0

Отлично, спасибо! Также, возможно, вы знаете, как делать несколько циклов, например. делать одни и те же вычисления только для подмножества ISIN (US0378331005, US5949181045)? А также, как показать 0, если сумма каких-либо сумм в некоторых minQty (это будет случай, когда minQty становится все больше и больше, и сумма не суммируется)? Еще раз спасибо! – Linas

2

Пара вариантов:

Sol 1:

q) s1:{[mqty]`mqty xasc ungroup select mqty,quantity:sum @/:quantity where each quantity>/:mqty by isin from trades} 

    q) s1 myquant.qu 

Sol2:

Продление решение MdSalih для обработки сценария, когда ни одна строка не соответствует условию КОЛИЧЕСТВО

q) s2:{a:ungroup select minQty:x ,quantity:0 by isin from trades; 
     b:raze {[minQty] select sum quantity by isin,minQty:minQty from trades where quantity>minQty} each x; 
     `minQty xasc a lj b } 


    q)s2 myquant.qu 

EDIT (Для ISIN распределяли реж):

Если у вас ISIN как ключ раздела, который не является int (как это выглядит из вашего примера в комментариях), тогда kdb не распознает его как ap украшенная база данных.

Более подробную информацию о: http://code.kx.com/q4m3/14_Introduction_to_Kdb+/#1432-partition-domain

Вы должны вручную загрузить столбцы/таблицы и делать расчеты. Одним из решений является:

q) src_path:"C:\q\" 
    q) raze {[isin;mqty]a:get hsym `$src_path,isin,"\trades\quantity";flip `isin`mqty`quantity!count[mqty]#/:(enlist isin;mqty;sum @/:a where each a>/:(),mqty)}[;myquant.qu] each ("ISIN01";"ISIN02") 
+0

Благодарим вас за ответ. Но, возможно, вы также можете ответить на вторую часть вопроса, то есть как сделать несколько циклов, например. как сделать одни и те же вычисления только для подмножества ISIN (US0378331005, US5949181045)? – Linas

+0

Вы можете передать список ISIN в качестве второго аргумента (скажем, в 'lstIsin') и использовать это в where, где для фильтрации. Как -> где isin в lstIsin, количество> minQty. Отвечает ли это на ваш вопрос? – Rahul

+0

Это помогло.Но мне было интересно, сможет ли этот код (где isin в IstIsin) автоматически загружать мои торговые базы данных ISIN (сотни разделов) и выполнять вычисления: t_US0378331005: значение ': C:/q/US0378331005 /; t_US5949181045: значение ': C:/q/US5949181045 /; и еще сотни. Затем мне нужно выполнить вычисления для EACH из db: s_US0378331005: {[mqty] 'mqty xasc ungroup select mqty, quantity: sum @ /: количество, где каждая величина> /: mqty от t_US0378331005}; s_US5949181045: {[mqty] 'mqty xasc ungroup select mqty, quantity: sum @ /: количество, где каждая величина> /: mqty от t_US5949181045}; и т. д. – Linas

Смежные вопросы