rolling_norm 0.4.0

Computes the rolling mean, variance, standard derivation and norm.
Documentation
use super::*;

#[test]
fn from_buf() {
    let rolling = Series::from([2.0, 4.0, 6.0]);
    approx_eq(rolling.curr(), 6.0);
    approx_eq(rolling.mean(), 4.0);
    approx_eq(rolling.var(), 2.66666);
    approx_eq(rolling.stdev(), 1.63299);
    approx_eq(rolling.norm(), (6.0 - 4.0) / 1.63299);
}

#[test]
fn sum() {
    let rolling = Series::from([2.0, 4.0, 6.0]);
    assert_eq!(rolling.sum(), 12.0);
}

#[test]
fn all_zero() {
    let rolling = Series::from([0.0, 0.0, 0.0]);
    approx_eq(rolling.curr(), 0.0);
    approx_eq(rolling.mean(), 0.0);
    approx_eq(rolling.var(), 0.0);
    approx_eq(rolling.stdev(), 0.0);
    approx_eq(rolling.norm(), 0.0);
}

#[test]
fn mean_stdev() {
    let mut rolling = Series::<f64, 3>::new();
    rolling.insert(2.0);
    rolling.insert(4.0);
    rolling.insert(6.0);
    approx_eq(rolling.curr(), 6.0);
    approx_eq(rolling.mean(), 4.0);
    approx_eq(rolling.stdev(), 1.63299);
    rolling.insert(8.0);
    approx_eq(rolling.curr(), 8.0);
    approx_eq(rolling.mean(), 6.0);
    approx_eq(rolling.stdev(), 1.63299);
    rolling.insert(8.0);
    rolling.insert(8.0);
    approx_eq(rolling.curr(), 8.0);
    approx_eq(rolling.mean(), 8.0);
    approx_eq(rolling.stdev(), 0.0);
}

#[test]
fn index() {
    let mut rolling = Series::<f64, 3>::new();
    rolling.insert(2.0);
    rolling.insert(4.0);
    rolling.insert(6.0);
    assert_eq!(rolling[0], 6.0);
    assert_eq!(rolling[1], 4.0);
    assert_eq!(rolling[2], 2.0);
}

fn approx_eq<R: Real + std::fmt::Debug>(a: R, b: R) {
    assert!(
        (a - b).abs() < R::from(0.01).unwrap(),
        "Numbers {:?} and {:?} aren't roughly equal.",
        a,
        b
    );
}