# Calculate the moving average

Use `movingAverage()` or `timedMovingAverage()` to return the moving average of data.

``````data
|> movingAverage(n: 5)

// OR

data
|> timedMovingAverage(every: 5m, period: 10m)
``````

### movingAverage()

For each row in a table, `movingAverage()` returns the average of the current value and previous values where `n` is the total number of values used to calculate the average.

If `n = 3`:

Row # Calculation
1 Insufficient number of rows
2 Insufficient number of rows
3 (Row1 + Row2 + Row3) / 3
4 (Row2 + Row3 + Row4) / 3
5 (Row3 + Row4 + Row5) / 3

Given the following input:

_time _value
2020-01-01T00:01:00Z 1.0
2020-01-01T00:02:00Z 1.2
2020-01-01T00:03:00Z 1.8
2020-01-01T00:04:00Z 0.9
2020-01-01T00:05:00Z 1.4
2020-01-01T00:06:00Z 2.0

The following would return:

``````|> movingAverage(n: 3)
``````
_time _value
2020-01-01T00:03:00Z 1.33
2020-01-01T00:04:00Z 1.30
2020-01-01T00:05:00Z 1.36
2020-01-01T00:06:00Z 1.43

### timedMovingAverage()

For each row in a table, `timedMovingAverage()` returns the average of the current value and all row values in the previous `period` (duration). It returns moving averages at a frequency defined by the `every` parameter.

Each color in the diagram below represents a period of time used to calculate an average and the time a point representing the average is returned. If `every = 30m` and `period = 1h`:

Given the following input:

_time _value
2020-01-01T00:00:00Z 1.0
2020-01-01T00:30:00Z 1.2
2020-01-01T01:00:00Z 1.8
2020-01-01T01:30:00Z 0.9
2020-01-01T02:00:00Z 1.4
2020-01-01T02:30:00Z 2.0
2020-01-01T03:00:00Z 1.9

The following would return:

``````|> timedMovingAverage(every: 30m, period: 1h)
``````
_time _value
2020-01-01T00:30:00Z 1.0
2020-01-01T01:00:00Z 1.1
2020-01-01T01:30:00Z 1.5
2020-01-01T02:00:00Z 1.35
2020-01-01T02:30:00Z 1.15
2020-01-01T03:00:00Z 1.7
2020-01-01T03:00:00Z 2