Article For
5.1

Statistical Measures


  • Queries can calculate the percentile, slope, and standard deviation of a time series, or of a range of entries within a time series.

  • For time series that have more than one value per entry, these methods return one measure for the first values in each entry, another measure for the second values in each entry, and so on.

  • In this page:


Syntax

Percentile

A percentile of a time series is the value that divides the time series values by some ratio, when they are arranged from smallest to largest.

For example, a 90th percentile is greater than 90% of the values in the series, and less than the remaining 10%.

  • RQL method: percentile()
  • LINQ method: Percentile()

The percentile method can be used to calculate any percentile in a time series or range of time series entries. It takes one double value between 0 and 100. This represents the percent of the time series values that should be smaller than the result.

See examples below.


Slope

  • RQL method: slope()
  • LINQ method: slope()

The slope of a time series or range of time series entries is the difference between the first and last values of the range (disregarding the values in between) divided by the difference in time.

Queries that use this method must also aggregate the time series, grouping the entries into whole numbers of time units.

The difference in time is measured in milliseconds. Use scaling to adjust the results to your preferred units.

See examples below.


Standard Deviation

  • RQL method: stddev()
  • LINQ method: StandardDeviation()

These methods return the standard deviation of time series values.

See examples below.


Result Format

Queries with these methods return results with the following format:

{
    "From": <first entry's timestamp>,
    "To": <last entry's timestamp>,
    "Count": [
        <number of first values from each entry>,
        <number of second values from each entry>,
        ...
    ],
    <"Percentile"/"Slope"/"Standard Deviation">: [
        <double - measure for first values from each entry>,
        <double - measure for second values from each entry>,
        ...
    ]
}

If the query uses group by aggregation, there will be one of these results for each of the aggregates.

Examples

Percentile

var query = session.Query<Employee>()
    .Select(p => RavenQuery.TimeSeries(p, "HeartRates")
        .Select(x => new
        {
            P = x.Percentile(90)
        }
    )
);
var query = session.Advanced.RawQuery<TimeSeriesAggregationResult>(@"
    from Employees as e
    select timeseries(
        from e.HeartRate 
        select percentile(90)
    )
");

Slope

var query = session.Query<Employee>()
    .Select(p => RavenQuery.TimeSeries(p, "HeartRates")
        .GroupBy(g => g.Hours(1))
        .Select(x => new
        {
            Slope = x.Slope()
        }
    )
);
var query = session.Advanced.RawQuery<TimeSeriesAggregationResult>(@"
    from Employees as e 
    select timeseries(
        from e.HeartRates
        group by 1 hour
        select slope()
    )
");

Standard Deviation

//Example query with defined range
var date = DateTime.Today;

var query = session.Query<Employee>()
    .Select(p => RavenQuery.TimeSeries(p, "HeartRates", date, date.AddDays(1))
        .Select(x => new
        {
            StdDev = x.StandardDeviation()
        }
    )
);
//Example query with defined range
var date = DateTime.Today;

var query = session.Advanced.RawQuery<TimeSeriesAggregationResult>(@"
    from Employees as e
    select timeseries(
        from e.HeartRates 
        between $start and $end
        select stddev()
    )
")
.AddParameter("start", date)
.AddParameter("end", date.AddDays(1));