quantaxis_rs/
qadata.rs

1use core::fmt::Debug;
2use core::ops::AddAssign;
3
4use ndarray::array;
5use num_traits::{cast::FromPrimitive, float::Float, identities::One, identities::Zero};
6use serde::{Deserialize, Serialize};
7
8//use num_traits::real::Real;
9
10#[derive(Clone, Debug, Serialize, Deserialize)]
11pub struct Stats<T: Float + Zero + One + AddAssign + FromPrimitive + PartialEq + Debug> {
12    pub min: T,
13    pub max: T,
14    /// Mean of sample set
15    pub mean: T,
16    /// Standard deviation of sample
17    pub std_dev: T,
18
19    /// Number of values collected
20    #[serde(skip)]
21    count: usize,
22
23    /// Internal mean squared for algo
24    #[serde(skip)]
25    mean2: T,
26}
27
28impl<T> Stats<T>
29    where
30        T: Float + Zero + One + AddAssign + FromPrimitive + PartialEq + Debug,
31{
32    /// Create a new rolling-stats object
33    pub fn new() -> Stats<T> {
34        Stats {
35            count: 0,
36            min: T::zero(),
37            max: T::zero(),
38            mean: T::zero(),
39            std_dev: T::zero(),
40            mean2: T::zero(),
41        }
42    }
43
44    /// Update the rolling-stats object
45    pub fn update(&mut self, value: T) {
46        // Track min and max
47        if value > self.max || self.count == 0 {
48            self.max = value;
49        }
50        if value < self.min || self.count == 0 {
51            self.min = value;
52        }
53
54        // Increment counter
55        self.count += 1;
56        let count = T::from_usize(self.count).unwrap();
57
58        // Calculate mean
59        let delta: T = value - self.mean;
60        self.mean += delta / count;
61
62        // Mean2 used internally for standard deviation calculation
63        let delta2: T = value - self.mean;
64        self.mean2 += delta * delta2;
65
66        // Calculate standard deviation
67        if self.count > 1 {
68            self.std_dev = (self.mean2 / (count - T::one())).sqrt();
69        }
70    }
71}
72
73fn main() {
74    let mut s: Stats<f32> = Stats::new();
75
76    let vals: Vec<f32> = vec![1.0, 2.0, 3.0, 4.0, 5.0];
77    for v in &vals {
78        s.update(*v);
79
80        println!("{:?}", s.max);
81        println!("{:?}", s.mean);
82    }
83}