indicato_rs 0.1.3

Library for common statistical market signals
Documentation
use std::collections::VecDeque;

pub trait DequeMathExtF64 {
    fn mean(&self) -> f64;
    fn variance(&self) -> f64;
    fn standard_deviation(&self) -> f64;
    fn max(&self) -> f64;
    fn min(&self) -> f64;
}

impl DequeMathExtF64 for VecDeque<f64> {
    fn mean(&self) -> f64 {
        if self.is_empty() {
            return 0.0;
        }
        self.iter().sum::<f64>() / self.len() as f64
    }

    fn variance(&self) -> f64 {
        let mean = self.iter().sum::<f64>() / self.len() as f64;
        self.iter().map(|x| (x - mean).powi(2)).sum::<f64>() / self.len() as f64
    }

    fn standard_deviation(&self) -> f64 {
        self.variance().sqrt()
    }

    fn max(&self) -> f64 {
        self.iter().fold(f64::MIN, |acc, &x| acc.max(x))
    }

    fn min(&self) -> f64 {
        self.iter().fold(f64::MAX, |acc, &x| acc.min(x))
    }
}


#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_mean() {
        let mut values = VecDeque::new();
        values.push_back(1.0);
        values.push_back(2.0);
        values.push_back(3.0);
        assert_eq!(values.mean(), 2.0);
    }

    #[test]
    fn test_mean_empty() {
        let values = VecDeque::new();
        assert_eq!(values.mean(), 0.0);
    }

    #[test]
    fn test_variance() {
        let mut values = VecDeque::new();
        values.push_back(1.0);
        values.push_back(2.0);
        values.push_back(3.0);
        assert_eq!(values.variance(), 2.0/3.0);
    }

    #[test]
    fn test_standard_deviation() {
        let mut values = VecDeque::new();
        values.push_back(1.0);
        values.push_back(2.0);
        values.push_back(3.0);
        assert_eq!(values.standard_deviation(), (2.0/3.0 as f64).sqrt());
    }

    #[test]
    fn test_max() {
        let mut values = VecDeque::new();
        values.push_back(1.0);
        values.push_back(2.0);
        values.push_back(3.0);
        assert_eq!(values.max(), 3.0);
    }

    #[test]
    fn test_min() {
        let mut values = VecDeque::new();
        values.push_back(2.0);
        values.push_back(1.0);
        values.push_back(3.0);
        assert_eq!(values.min(), 1.0);
    }
}