Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 在qkdb中与每个循环+_Loops_Each_Kdb_Q Lang - Fatal编程技术网

Loops 在qkdb中与每个循环+

Loops 在qkdb中与每个循环+,loops,each,kdb,q-lang,Loops,Each,Kdb,Q Lang,我有一个股票交易数据库name TRADES,我一直在尝试用每个函数做一个简单的循环,每个函数都会对每个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:3

我有一个股票交易数据库name TRADES,我一直在尝试用每个函数做一个简单的循环,每个函数都会对每个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,即每个不同的ISIN

非常感谢您提前提供的帮助。

对于某些交易:

对于从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的总数量,其中数量>给定的最小数量

两个选项:

解决方案1:

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将不会将其识别为分区数据库

详情如下:

您必须手动加载列/表并进行计算。一种解决办法是:

   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")

太好了,谢谢!也可能您知道如何进行多个循环,例如,仅对ISIN的US0378331005、US5949181045的子集进行相同的计算?还有,如果某个minQty没有求和数量,那么当minQty变得越来越大,并且没有要求和的数量时,如何显示0?再次感谢!谢谢你的回答。但也许您也可以回答问题的第二部分,即如何进行多个循环,例如,如何仅对ISIN的US0378331005、US5949181045的子集进行相同的计算?您可以将ISIN列表作为第二个参数传递,比如说在“lstIsin”中,并在where子句中使用该参数进行过滤。比如->在lstIsin中的isin位置,数量>最小数量。这回答了你的问题吗?这很有帮助。但我想知道ISTIN中isin所在的代码是否有助于自动加载isin数百个分区的交易数据库并进行计算:t_US0378331005:value:C:/q/US0378331005/;t_US5949181045:value:C:/q/US5949181045/;还有几百个。然后,我需要对db:s_US0378331005:{[mqty]mqty-xasc ungroup-select-mqty,quantity:sum@/:quantity中的每一个执行计算,其中每个quantity>/:mqty from t_US0378331005};s_US5949181045:{[mqty]mqty xasc ungroup选择mqty,quantity:sum@/:quantity,其中每个数量>/:mqty from t t_US5949181045};等等。我可以为每个ISIN交易数据库逐行编写数百个代码,但我想也许可以编写一个代码来加载并自动完成计算?在这个例子中,也许每个命令都有帮助?谢谢你的帮助!看起来您已经在ISIN上对数据库进行了分区。这种方法的问题是KDB不会将其识别为分区目录,因为分区键域中只允许int值。这意味着您不能直接使用“选择依据”,您必须手动加载文件并进行计算。我编辑了我的答案以涵盖这一点。
  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
   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")