Hi,
I wanted to do a moving/rolling average on raw data [1].
I haven���t find code for that (maybe this is done in polymath though).
So I ended writing that (I thing this is SMA):
SequenceableCollection>>movingAverage: anOrder
"Answer the moving or rolling average for anOrder window"
| retval size x y |
anOrder <= 0 ifTrue: [ Error signal: 'the order must be positive'].
size := self size - anOrder.
size negative ifTrue: [ Error signal: 'the collection size is too small'].
retval := self species ofSize: size + 1.
x := 1.
y := anOrder.
[y <= self size ] whileTrue: [
retval at: x put: (self copyFrom: x to: y) average
x := x + 1. y := y + 1
Not perfect but seems to works quite well (that���s probably better to remove copyFrom: and use some kind of buffer instead).
Any interest in that ? If any existing code too, I���ll be interested especially for other implementation (weighted, exponential) ?
(#(118 113 105 105 103 99 98 101 100 107) movingAverage: 3) collect: [:v | v asScaledDecimal: 1 ] .
"an Array(112.0s1 107.7s1 104.3s1 102.3s1 100.0s1 99.3s1 99.7s1 102.7s1)"
Cheers,
C��drick