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
8429 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<T> RollingAggWindowNoNulls<T> for MeanWindow<'_, 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
type This<'a> = MeanWindow<'a, T>;
24
25
fn new<'a>(
26
slice: &'a [T],
27
start: usize,
28
end: usize,
29
params: Option<RollingFnParams>,
30
window_size: Option<usize>,
31
) -> Self::This<'a> {
32
MeanWindow {
33
sum: <SumWindow<T, f64> as RollingAggWindowNoNulls<T>>::new(
34
slice,
35
start,
36
end,
37
params,
38
window_size,
39
),
40
}
41
}
42
43
unsafe fn update(&mut self, new_start: usize, new_end: usize) {
44
unsafe {
45
RollingAggWindowNoNulls::update(&mut self.sum, new_start, new_end);
46
};
47
}
48
49
fn get_agg(&self, idx: usize) -> Option<T> {
50
let sum = RollingAggWindowNoNulls::get_agg(&self.sum, idx).unwrap();
51
(self.sum.start != self.sum.end)
52
.then(|| sum / NumCast::from(self.sum.end - self.sum.start).unwrap())
53
}
54
55
fn slice_len(&self) -> usize {
56
RollingAggWindowNulls::slice_len(&self.sum)
57
}
58
}
59
60
impl<
61
T: NativeType
62
+ IsFloat
63
+ Add<Output = T>
64
+ Sub<Output = T>
65
+ NumCast
66
+ Div<Output = T>
67
+ AddAssign
68
+ SubAssign
69
+ PartialOrd,
70
> RollingAggWindowNulls<T> for MeanWindow<'_, T>
71
{
72
type This<'a> = MeanWindow<'a, T>;
73
74
fn new<'a>(
75
slice: &'a [T],
76
validity: &'a Bitmap,
77
start: usize,
78
end: usize,
79
params: Option<RollingFnParams>,
80
window_size: Option<usize>,
81
) -> Self::This<'a> {
82
MeanWindow {
83
sum: <SumWindow<T, f64> as RollingAggWindowNulls<T>>::new(
84
slice,
85
validity,
86
start,
87
end,
88
params,
89
window_size,
90
),
91
}
92
}
93
94
unsafe fn update(&mut self, new_start: usize, new_end: usize) {
95
unsafe { RollingAggWindowNulls::update(&mut self.sum, new_start, new_end) };
96
}
97
98
fn get_agg(&self, idx: usize) -> Option<T> {
99
let sum = RollingAggWindowNulls::get_agg(&self.sum, idx);
100
let len = self.sum.end - self.sum.start;
101
if self.sum.null_count == len {
102
None
103
} else {
104
sum.map(|sum| {
105
sum / NumCast::from(self.sum.end - self.sum.start - self.sum.null_count).unwrap()
106
})
107
}
108
}
109
110
fn is_valid(&self, min_periods: usize) -> bool {
111
self.sum.is_valid(min_periods)
112
}
113
114
fn slice_len(&self) -> usize {
115
RollingAggWindowNulls::slice_len(&self.sum)
116
}
117
}
118
119