基于其他列KDB +添加列

时间:2016-03-30 13:23:37

标签: kdb q-lang

我有一个包含多个列的表(“ibmqt”),我想添加一个新列,其中包含布尔值,指示每行是否有一列(“bid”)大于或等于另一列专栏(“问”)。

到目前为止,我最成功的尝试是:

ibmqt: update (pricecross:select bid>=ask from ibmqt) from ibmqt

然而,这导致以下结果:

time         sym bid   ask   bsize asize pricecross
----------------------------------------------------
00:00:59.063 IBM 43.53 43.57 10000 9000  (,`ask)!,0b
00:01:03.070 IBM 43.54 43.59 6500  3000  (,`ask)!,0b
00:02:31.911 IBM 43.56 43.6  500   4500  (,`ask)!,0b
00:03:43.070 IBM 43.56 43.56 10000 2500  (,`ask)!,1b
00:06:01.170 IBM 43.54 43.56 8500  4500  (,`ask)!,0b
00:06:11.081 IBM 43.56 43.58 500   1500  (,`ask)!,0b
00:08:15.126 IBM 43.55 43.57 1500  9000  (,`ask)!,0b

显然在“pricecross”栏中我只想要0,0,0,1,0等。

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

不需要嵌套选择。这将满足您的需求:

ibmqt:update pricecross:bid>=ask from ibmqt

或者您可以更新ibmqt

update pricecross:bid>=ask from `ibmqt

q是一种数组语言,因此bid>=ask成对地比较两列并返回一个布尔列表。这将说明这个想法:

1 2 3 >= 0 2 4 / 110b

然后将布尔值列表分配给新列pricecross

答案 1 :(得分:0)

由于>=被重载以同时使用原子和列表,因此在这里使用pricecross:bid>=ask是最佳解决方案:

q)update pricecross:bid>=ask from ibmqt 

但是获得相同结果的方式略有不同:

q)update pricecross:bid>='ask from ibmqt 
q)update pricecross:>='[bid;ask] from ibmqt 

当二进位函数仅适用于原子时,这特别有用:

q)update pricetolerance:tolerance'[bid;ask] from ibmqt