# Calculate the rate of change

This page documents an earlier version of InfluxDB.
InfluxDB v2 is the latest stable version.
See the equivalent **InfluxDB v2** documentation: 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*.
Calculated 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.

Was this page helpful?

Thank you for your feedback!

#### Support and feedback

Thank you for being part of our community! We welcome and encourage your feedback and bug reports for InfluxDB and this documentation. To find support, use the following resources:

**Customers with an annual or support contract** can contact InfluxData Support.