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

KDB - Automatic function argument behavior with Iterators

我很难理解以下扫描函数中参数的行为。我理解 EWMA calc 并制作了一个 Excel 工作表来匹配以试图理解,但是 kdb 语法在什么(以及什么时候)是 x、y 和 z 方面让我失望。我参考了 Q for Mortals、书籍和 https://code.kx.com/q/ref/over/,我确实理解所提供的更简单示例中发生的事情。

我理解基于 Excel 计算的 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 值列,而不是正确引用上一个 EWMA 值。

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

EWMA 中的 Excel 审核公式

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 获取列表中的下一个值,直到列表如何被传递给函数。