0

There are already moving average in kdb/q.

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

But how do I compute moving median?

Will Da Silva
  • 6,386
  • 2
  • 27
  • 52
Matt Frank
  • 177
  • 6

2 Answers2

1

Here is a naive approach. It starts with an empty list and null median and iterates over the list feeding in a new value each time.

Sublist is used fix the window, and this window is passed along with the median as the state of into the next iteration.

At the end scan \ will output the state at every iteration from which we take the median (first element) from each one

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
Mark Kelly
  • 1,780
  • 7
  • 16
0

There's also a generic "sliding window" function here which you can pass your desired aggregator into: 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
terrylynch
  • 11,844
  • 13
  • 21