kdb + / q:将带有更新变量的迭代过程应用于列

时间:2015-03-15 11:39:41

标签: kdb

考虑以下具有起始值f:{[x] ..}的{​​{1}}程序:

  1. 使用a:0x执行某些操作。输出保存为a的新版本,输出由函数
  2. 返回
  3. 对于下一个输入a,请重做该过程,但现在使用新的x
  4. 对于单个值a,此过程很容易构建。例如:

    x

    但是,如何使这样的功能在应用于表格列时也能正常工作?

    我无法如何将这个步骤合并到一个变量的中间保存'在一个可以立即应用于列的函数中。这有什么特别的技巧吗?例如。当我在上面的示例中使用表格列时,它只会为a:0; f:{[x] a::a+x; :a} / A simple example (actual function more complicated) 计算所有行的a+x,而不是在每次迭代时更新a:0

2 个答案:

答案 0 :(得分:4)

无需为此使用全局变量 - 可以使用scan - 请参阅here

示例 -

生成表格 -

q)t:0N!([] time:5?.z.p; sym:5?`3; price:5?100f; size:5?10000)
    time                          sym price    size
    -----------------------------------------------
    2002.04.04D18:06:07.889113280 cmj 29.07093 3994
    2007.05.21D04:26:13.021438816 llm 7.347808 496
    2010.10.30D10:15:14.157553088 obp 31.59526 1728
    2005.11.01D21:15:54.022395584 dhc 34.10485 5486
    2005.03.06D21:05:07.403334368 mho 86.17972 2318

使用简单累加器的示例 - 注意,如果需要,该函数可以访问其他参数(参见下一个示例):

q)update someCol:{[a;x;y;z] (a+1)}\[0;time;price;size] from t
    time                          sym price    size someCol
    -------------------------------------------------------
    2002.04.04D18:06:07.889113280 cmj 29.07093 3994 1
    2007.05.21D04:26:13.021438816 llm 7.347808 496  2
    2010.10.30D10:15:14.157553088 obp 31.59526 1728 3
    2005.11.01D21:15:54.022395584 dhc 34.10485 5486 4
    2005.03.06D21:05:07.403334368 mho 86.17972 2318 5

说你想获得累积大小:

q)update cuSize:{[a;x;y;z] (a+z)}\[0;time;price;size] from t
    time                          sym price    size cuSize
    ------------------------------------------------------
    2002.04.04D18:06:07.889113280 cmj 29.07093 3994 3994
    2007.05.21D04:26:13.021438816 llm 7.347808 496  4490
    2010.10.30D10:15:14.157553088 obp 31.59526 1728 6218
    2005.11.01D21:15:54.022395584 dhc 34.10485 5486 11704
    2005.03.06D21:05:07.403334368 mho 86.17972 2318 14022

如果您希望通过扫描传递多个var,可以通过为其提供更复杂的结构,将更多值打包到第一个var中:

q)update cuPriceAndSize:{[a;x;y;z] (a[0]+y;a[1]+z)}\[0 0;time;price;size] from t
    time                          sym price    size cuPriceAndSize
    --------------------------------------------------------------
    2002.04.04D18:06:07.889113280 cmj 29.07093 3994 29.07093 3994
    2007.05.21D04:26:13.021438816 llm 7.347808 496  36.41874 4490
    2010.10.30D10:15:14.157553088 obp 31.59526 1728 68.014   6218
    2005.11.01D21:15:54.022395584 dhc 34.10485 5486 102.1188 11704
    2005.03.06D21:05:07.403334368 mho 86.17972 2318 188.2986 14022

答案 1 :(得分:1)

@MdSalih解决方案是正确的,我只是在这里解释一下,在你的案例和解决方案中可能出现全局变量的可能原因。

q) t:([]id: 1 2)
q)a:1

我想你可能一直在使用它:

q) select k:{x:x+a;a::a+1;:x} id from t

输出:

k 
--
1
2

a值为2,表示只执行一次函数。原因是我们将完整的id列列表传递给函数,而(+)是原子的,这意味着它一次在完整列表上运行。在下面的前。 2将添加到列表中的所有项目。

q) 2 + (1;3;5)

使用它的正确方法是'each':

q)select k:{x:x+a;a::a+1;:x} each id from t

输出:

k 
--
2
3