Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-compute/src/rolling/mean.rs
7884 views
1
use super::no_nulls::RollingAggWindowNoNulls;
2
use super::nulls::RollingAggWindowNulls;
3
use super::sum::SumWindow;
4
use super::*;
5
6
pub struct MeanWindow<'a, T> {
7
sum: SumWindow<'a, T, f64>,
8
}
9
10
impl<'a, T> RollingAggWindowNoNulls<'a, T> for MeanWindow<'a, T>
11
where
12
T: NativeType
13
+ IsFloat
14
+ std::iter::Sum
15
+ AddAssign
16
+ SubAssign
17
+ Div<Output = T>
18
+ NumCast
19
+ Add<Output = T>
20
+ Sub<Output = T>
21
+ PartialOrd,
22
{
23
fn new(
24
slice: &'a [T],
25
start: usize,
26
end: usize,
27
params: Option<RollingFnParams>,
28
window_size: Option<usize>,
29
) -> Self {
30
Self {
31
sum: RollingAggWindowNoNulls::new(slice, start, end, params, window_size),
32
}
33
}
34
35
unsafe fn update(&mut self, start: usize, end: usize) -> Option<T> {
36
let sum = unsafe {
37
RollingAggWindowNoNulls::update(&mut self.sum, start, end).unwrap_unchecked()
38
};
39
if start == end {
40
None
41
} else {
42
Some(sum / NumCast::from(end - start).unwrap())
43
}
44
}
45
}
46
47
impl<
48
'a,
49
T: NativeType
50
+ IsFloat
51
+ Add<Output = T>
52
+ Sub<Output = T>
53
+ NumCast
54
+ Div<Output = T>
55
+ AddAssign
56
+ SubAssign
57
+ PartialOrd,
58
> RollingAggWindowNulls<'a, T> for MeanWindow<'a, T>
59
{
60
unsafe fn new(
61
slice: &'a [T],
62
validity: &'a Bitmap,
63
start: usize,
64
end: usize,
65
params: Option<RollingFnParams>,
66
window_size: Option<usize>,
67
) -> Self {
68
Self {
69
sum: unsafe {
70
RollingAggWindowNulls::new(slice, validity, start, end, params, window_size)
71
},
72
}
73
}
74
75
unsafe fn update(&mut self, start: usize, end: usize) -> Option<T> {
76
let sum = unsafe { RollingAggWindowNulls::update(&mut self.sum, start, end) };
77
let len = end - start;
78
if self.sum.null_count == len {
79
None
80
} else {
81
sum.map(|sum| sum / NumCast::from(end - start - self.sum.null_count).unwrap())
82
}
83
}
84
fn is_valid(&self, min_periods: usize) -> bool {
85
self.sum.is_valid(min_periods)
86
}
87
}
88
89