添加基于其他列的列 KDB+

Adding a column based on other columns KDB+

我有一个包含多列的 table ("ibmqt"),我想添加一个新列,其中包含布尔值,指示每一行是否有一列 ("bid") 大于或等于另一列 ("ask").

我迄今为止最成功的尝试是:

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 等

有什么建议吗?

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

ibmqt:update pricecross:bid>=ask from ibmqt

或者您可以就地更新 ibmqt

update pricecross:bid>=ask from `ibmqt

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

1 2 3 >= 0 2 4 / 110b

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

因为 >= 被重载以同时处理原子和列表,使用 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