首页 > 解决方案 > KDB - 使用迭代器的自动函数参数行为

问题描述

我正在努力理解以下扫描函数中参数的行为。我了解 EWMA calc 并制作了一个 Excel 工作表来匹配以尝试理解,但 kdb 语法在 x、y 和 z 是什么(以及何时)方面让我失望。我已经为 Mortals、书籍和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 值列,而不是正确引用上一个 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 EWMA 的 Excel 公式

标签: kdb

解决方案


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


推荐阅读