polars_compute/rolling/
moment.rs1use 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}