KDB-具有迭代器的自动函数参数行为

问题描述

我正在努力了解以下扫描功能中参数的行为。我了解EWMA calc,并制作了一个Excel工作表进行匹配以尝试理解,但kdb语法使我不了解x,y和z。我已经参考了《凡人》,书籍和https://code.kx.com/q/ref/over/的Q,但我确实理解了所提供的简单示例中的情况。

我了解基于Excel calc的EWMA公式,但是如何将其转换为下面的函数x = constant,y= passed in values (but also appears to be prior result?) and z= (prev period?)

ewma: {{(y*1-x)+(z*x)} [x]\[y]}; 
ewma [.25; 15 20 25 30 35f]
15 16.25 18.4375 21.32813 24.74609

重新排列术语使它更易于阅读,但是如果我是用Excel编写的,则我会错误地引用加法运算符中的y值列,而不是正确地引用prev EWMA值。

ewma: {{y+x*z-y} [x]\[y]};  
ewma [.25; 15 20 25 30 35f]
15 16.25 18.4375 21.32813 24.74609

Excel公式中的EWMA,用于审核

Excel formula for EWMA

解决方法

0N!在这些情况下对于确定传递的变量很有用。只需添加到功能开始即可在控制台中显示变量。例如。以显示每次运行时传递的z:

        q)ewma: {{0N!z;(y*1-x)+(z*x)} [x]\[y]};
        q)ewma [.25; 15 20 25 30 35f]
        15f
        16.25
        18.4375
        21.32812
        
        //Or multiple at once
        q)ewma: {{0N!(x;y;z);(y*1-x)+(z*x)} [x]\[y]};
        q)
        q)ewma [.25; 15 20 25 30 35f]
        0.25 15 20
        0.25 16.25 25
        0.25 18.4375 30
        0.25 21.32812 35

编辑:

要想想为什么z保持'y'值,最好只用x / y考虑下面的简化示例。

//two parameters specified in beginning. 
//x initialised as 1 then takes the function result for next run
//y takes value of next value in list
q){0N!(x;y);x+y}\[1;2 3 4]
1 2
3 3
6 4
3 6 10
//in this example only one parameter is passed
//but q takes first value in list as x in this special case
q){0N!(x;y);x+y}\[1 2 3 4]
1 2
3 3
6 4
1 3 6 10

在您的示例中发生了类似的情况。 x没有传递给迭代器,因此每次运行将采用相同的值。

内部函数y值将采用外部y变量的第一个值(在这种情况下为15f)初始化,如上面的简化示例所示。然后,z为其初始运行获取列表的第二个值。然后,y获取上一个函数运行的结果,z获取列表中的下一个值,直到列表如何传递给函数。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...