【发布时间】:2021-01-09 16:09:06
【问题描述】:
【问题讨论】:
标签: kdb
【问题讨论】:
标签: kdb
这是一种幼稚的方法。它从一个空列表和空中位数开始,并遍历列表,每次都输入一个新值。
子列表用于固定窗口,并将这个窗口与中位数一起作为状态传递到下一次迭代中。
在扫描结束时 \ 将输出每次迭代的状态,从中我们获取每个迭代的中值(第一个元素)
mmed:{{(med l;l:neg[x] sublist last[y],z)}[x]\[(0n;());y][;0]}
q)mmed[5;til 10]
0 0.5 1 1.5 2 3 4 5 6 7
q)i:4 9 2 7 0 1 9 2 1 8
q)mmed[3;i]
4 6.5 4 7 2 1 1 2 2 2
【讨论】:
这里还有一个通用的“滑动窗口”功能,您可以将所需的聚合器传递到:https://code.kx.com/q/kb/programming-idioms/#how-do-i-apply-a-function-to-a-sequence-sliding-window
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
q)update newcol:swin[med;10;mycol] from tab
【讨论】: