There are three ways to calculate an Average depending on the way we receive the data :
- Basic : we have all the data. In this case we just use the basic well known formula : $$Avg = \frac{1}{n} \sum_{i=0}^n x_i$$
- Moving average : calculated using rolling window
- Incremental average : the one that we will discuss now
The idea is to calculate the Basic average at every step w/o recalculating it from the whole sequence i.e. the data comes one value at a every time step.
Here is the formula :
$$a_n = a_{n-1} + \frac{x_n – a_{n-1}}{n}$$
here is how you can use it as a python closure function, so that you don’t have to carry the state :
def iavg(): avg = 0 n = 0 def calc(value): nonlocal n,avg n += 1 avg = avg + ((value - avg) / n) return avg return calc avg = iavg() print(f'2 => {avg(2)}') print(f'4 => {avg(4)}') print(f'6 => {avg(6)}') ----- 2 => 2.0 4 => 3.0 6 => 4.0 # (2+4+6) / 3 = 12/3 = 4