polars_compute/rolling/
moment.rs

1use super::RollingFnParams;
2use crate::moment::{KurtosisState, SkewState, VarState};
3
4pub trait StateUpdate {
5    fn new(params: Option<RollingFnParams>) -> Self;
6    fn insert_one(&mut self, x: f64);
7
8    fn remove_one(&mut self, x: f64);
9
10    fn finalize(&self) -> Option<f64>;
11}
12
13pub struct VarianceMoment {
14    state: VarState,
15    ddof: u8,
16}
17
18impl StateUpdate for VarianceMoment {
19    fn new(params: Option<RollingFnParams>) -> Self {
20        let ddof = if let Some(RollingFnParams::Var(params)) = params {
21            params.ddof
22        } else {
23            1
24        };
25
26        Self {
27            state: VarState::default(),
28            ddof,
29        }
30    }
31
32    fn insert_one(&mut self, x: f64) {
33        self.state.insert_one(x);
34    }
35
36    fn remove_one(&mut self, x: f64) {
37        self.state.remove_one(x);
38    }
39    fn finalize(&self) -> Option<f64> {
40        self.state.finalize(self.ddof)
41    }
42}
43
44pub struct KurtosisMoment {
45    state: KurtosisState,
46    fisher: bool,
47    bias: bool,
48}
49
50impl StateUpdate for KurtosisMoment {
51    fn new(params: Option<RollingFnParams>) -> Self {
52        let (fisher, bias) = if let Some(RollingFnParams::Kurtosis { fisher, bias }) = params {
53            (fisher, bias)
54        } else {
55            (false, false)
56        };
57
58        Self {
59            state: KurtosisState::default(),
60            fisher,
61            bias,
62        }
63    }
64
65    fn insert_one(&mut self, x: f64) {
66        self.state.insert_one(x);
67    }
68
69    fn remove_one(&mut self, x: f64) {
70        self.state.remove_one(x);
71    }
72    fn finalize(&self) -> Option<f64> {
73        self.state.finalize(self.fisher, self.bias)
74    }
75}
76
77pub struct SkewMoment {
78    state: SkewState,
79    bias: bool,
80}
81
82impl StateUpdate for SkewMoment {
83    fn new(params: Option<RollingFnParams>) -> Self {
84        let bias = if let Some(RollingFnParams::Skew { bias }) = params {
85            bias
86        } else {
87            false
88        };
89
90        Self {
91            state: SkewState::default(),
92            bias,
93        }
94    }
95
96    fn insert_one(&mut self, x: f64) {
97        self.state.insert_one(x);
98    }
99
100    fn remove_one(&mut self, x: f64) {
101        self.state.remove_one(x);
102    }
103    fn finalize(&self) -> Option<f64> {
104        self.state.finalize(self.bias)
105    }
106}