KDB/Q 我们如何计算移动中位数

KDB/Q how do we calculate the moving median

kdb/q已经有移动平均线。

https://code.kx.com/q/ref/avg/#mavg

但是我如何计算移动中位数?

这是一个天真的方法。它以一个空列表和 null 中位数开始,并遍历列表,每次都输入一个新值。

子列表用于修复 window,并且此 window 与中值一起作为状态传递到下一次迭代。

最后 scan \ 将输出每次迭代的状态,我们从每个迭代中获取中值(第一个元素)

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

这里还有一个通用的“滑动 window”函数,您可以将所需的聚合器传递到: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