# Calculate the rate of change

Use the `derivative()` function to calculate the rate of change between subsequent values or the `aggregate.rate()` function to calculate the average rate of change per window of time. If time between points varies, these functions normalize points to a common time interval making values easily comparable.

## Rate of change between subsequent values

Use the `derivative()` function to calculate the rate of change per unit of time between subsequent non-null values.

``````data
|> derivative(unit: 1s)
``````

By default, `derivative()` returns only positive derivative values and replaces negative values with null. Cacluated values are returned as floats.

Given the following input:

_time _value
2020-01-01T00:00:00Z 250
2020-01-01T00:04:00Z 160
2020-01-01T00:12:00Z 150
2020-01-01T00:19:00Z 220
2020-01-01T00:32:00Z 200
2020-01-01T00:51:00Z 290
2020-01-01T01:00:00Z 340

`derivative(unit: 1m)` returns:

_time _value
2020-01-01T00:04:00Z
2020-01-01T00:12:00Z
2020-01-01T00:19:00Z 10.0
2020-01-01T00:32:00Z
2020-01-01T00:51:00Z 4.74
2020-01-01T01:00:00Z 5.56

Results represent the rate of change per minute between subsequent values with negative values set to null.

### Return negative derivative values

To return negative derivative values, set the `nonNegative` parameter to `false`,

Given the following input:

_time _value
2020-01-01T00:00:00Z 250
2020-01-01T00:04:00Z 160
2020-01-01T00:12:00Z 150
2020-01-01T00:19:00Z 220
2020-01-01T00:32:00Z 200
2020-01-01T00:51:00Z 290
2020-01-01T01:00:00Z 340

The following returns:

``````|> derivative(
unit: 1m,
nonNegative: false
)
``````
_time _value
2020-01-01T00:04:00Z -22.5
2020-01-01T00:12:00Z -1.25
2020-01-01T00:19:00Z 10.0
2020-01-01T00:32:00Z -1.54
2020-01-01T00:51:00Z 4.74
2020-01-01T01:00:00Z 5.56

Results represent the rate of change per minute between subsequent values and include negative values.

## Average rate of change per window of time

Use the `aggregate.rate()` function to calculate the average rate of change per window of time.

``````import "experimental/aggregate"

data
|> aggregate.rate(
every: 1m,
unit: 1s,
groupColumns: ["tag1", "tag2"]
)
``````

`aggregate.rate()` returns the average rate of change (as a float) per `unit` for time intervals defined by `every`. Negative values are replaced with null.

`aggregate.rate()` does not support `nonNegative: false`.

Given the following input:

_time _value
2020-01-01T00:00:00Z 250
2020-01-01T00:04:00Z 160
2020-01-01T00:12:00Z 150
2020-01-01T00:19:00Z 220
2020-01-01T00:32:00Z 200
2020-01-01T00:51:00Z 290
2020-01-01T01:00:00Z 340

The following returns:

``````|> aggregate.rate(
every: 20m,
unit: 1m
)
``````
_time _value
2020-01-01T00:20:00Z
2020-01-01T00:40:00Z 10.0
2020-01-01T01:00:00Z 4.74
2020-01-01T01:20:00Z 5.56

Results represent the average change rate per minute of every 20 minute interval with negative values set to null. Timestamps represent the right bound of the time window used to average values.

This documentation is open source. See a typo? Please, open an issue.

Need help getting up and running? Get Support