soma.cell

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).

Generated from soma describe on this file.

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