了解 kdb 中的移动 window 计算

Understanding moving window calcs in kdb

我很难理解 kx 食谱中的这个 q 代码编程习语:

q)swin:{[f;w;s] f each { 1_x,y }\[w#0;s]}
q)swin[avg; 3; til 10]
0 0.33333333 1 2 3 4 5 6 7 8

符号令人困惑。作为初学者有没有简单的分解方法?

我知道该函数的紧凑表示法可能等同于此

swin:{[f;w;s] f each {[x; y] 1_x, y }\[w#0;s]}

w#0 表示重复 0 w 次(w 是前几个观察的填充物吗?),1_x, y 表示加入 x,在删除第一个观察后,到y。但我不明白这是如何在 f = avg 应用于每个时发挥作用的。有什么方法可以很容易理解吗?

http://code.kx.com/q/ref/adverbs/#converge-iterate

二进制(双参数)函数上的扫描 (\) 将第一个参数作为种子值 - 在本例中为 3#0 - 并遍历第二个列表中的每个项目 - 在本例中直到10 - 应用函数(附加新值,先删除)。

q){1_x,y}\[3#0;til 10]
0 0 0
0 0 1
0 1 2
1 2 3
2 3 4
3 4 5
4 5 6
5 6 7
6 7 8
7 8 9

现在您有十个列表,您可以对每个列表应用一个函数 - 在本例中为 avg 但它可以是应用于列表的任何其他函数

q)med each {1_x,y}\[3#0;til 10]
0 0 1 2 3 4 5 6 7 8f
q)
q)first each {1_x,y}\[3#0;til 10]
0 0 0 1 2 3 4 5 6 7
q)
q)last each {1_x,y}\[3#0;til 10]
0 1 2 3 4 5 6 7 8 9