Moving Average
Compute a simple moving average over a series of values.
Example 077 of the basic Soma programs: a small, commented program that teaches one thing. Every output below was printed by soma 3.2.4 when this page was built.
How it is built
The cell MovingAverage has no face and no memory. Handlers: run (line 21).
The source
077_moving_average.cell
// ============================================================================
// 077 — Moving Average
// ============================================================================
// Compute a simple moving average over a series of values.
//
// Run: soma run 077_moving_average.cell run
// Expect:
// Values: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
// 3-period moving averages:
// Period 3: avg = 20
// Period 4: avg = 30
// Period 5: avg = 40
// Period 6: avg = 50
// Period 7: avg = 60
// Period 8: avg = 70
// Period 9: avg = 80
// Period 10: avg = 90
cell MovingAverage {
on run() {
let values = list(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
print("Values: {values}")
let window = 3
print("{window}-period moving averages:")
// Compute moving average using enumerate
let indexed = enumerate(values)
let count = values.length
let i = window - 1
while i < count {
// Sum the window
let sum = 0
let j = i - window + 1
while j <= i {
// Access element by iterating
let idx = 0
for v in values {
if idx == j {
sum = sum + v
}
idx = idx + 1
}
j = j + 1
}
let avg = sum / window
let period = i + 1
print("Period {period}: avg = {avg}")
i = i + 1
}
return "done"
}
}What the toolchain says
$ soma check 077_moving_average.cell
✓ All checks passed.$ soma run 077_moving_average.cell run
Values: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
3-period moving averages:
Period 3: avg = 20
Period 4: avg = 30
Period 5: avg = 40
Period 6: avg = 50
Period 7: avg = 60
Period 8: avg = 70
Period 9: avg = 80
Period 10: avg = 90
done