在Q KDB +中循环使用EACH

时间:2016-11-12 12:22:11

标签: loops each kdb q-lang

我有股票交易数据库(名称“TRADES”),我正在尝试做一个简单的循环(使用函数EACH),它将对每个超过预定数量阈值的所有数量求和ISIN。数据如下所示:

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(即“EACH distinct ISIN”)。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分: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
    ..

对于范围为0到100的minQty

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

答案 1 :(得分:2)

几个选项:

SOL1:

  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

编辑(对于ISIN分区目录):

如果您将ISIN作为不是int的分区键(从注释中的示例看起来如此),那么kdb将不会将其识别为分区数据库。

有关详细信息: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")