问题描述
我正在努力了解以下扫描功能中参数的行为。我了解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
解决方法
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获取列表中的下一个值,直到列表如何传递给函数。