kdb - 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
解决方案
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 获取列表中的下一个值,直到列表如何被传递给函数。
推荐阅读
- javascript - 使用 map() 读取 Json 对象
- c# - 如何将两个不同标签的编号结合到一个新标签上?
- reactjs - 如何将数组中的4个元素(对象)添加到本地存储,反应
- python - 我想知道为什么函数总是选择第一个以及如何修复它-Python
- php - 如何获取选定的下拉列表项的值并将其发布到控制器?
- react-native-navigation - 使用 RNN 库重置堆栈
- android - 从 Google Play 商店安装应用程序后如何打开特定活动以获取深层链接
- javascript - 如何将 javascript 文件插入到我的 IE-11 的 BHO 扩展中?我想插入一个多行的 javascript 文件
- bash - 如何在同一行附加标准错误
- c# - SeleniumExtras.WaitHelpers.ExpectedConditions