Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-compute/src/rolling/no_nulls/mean.rs
6939 views
1
#![allow(unsafe_op_in_unsafe_fn)]
2
3
use super::*;
4
5
pub struct MeanWindow<'a, T> {
6
sum: SumWindow<'a, T, f64>,
7
}
8
9
impl<'a, T> RollingAggWindowNoNulls<'a, T> for MeanWindow<'a, T>
10
where
11
T: NativeType
12
+ IsFloat
13
+ std::iter::Sum
14
+ AddAssign
15
+ SubAssign
16
+ Div<Output = T>
17
+ NumCast
18
+ Add<Output = T>
19
+ Sub<Output = T>
20
+ PartialOrd,
21
{
22
fn new(
23
slice: &'a [T],
24
start: usize,
25
end: usize,
26
params: Option<RollingFnParams>,
27
window_size: Option<usize>,
28
) -> Self {
29
Self {
30
sum: SumWindow::<T, f64>::new(slice, start, end, params, window_size),
31
}
32
}
33
34
unsafe fn update(&mut self, start: usize, end: usize) -> Option<T> {
35
let sum = self.sum.update(start, end).unwrap_unchecked();
36
Some(sum / NumCast::from(end - start).unwrap())
37
}
38
}
39
40
pub fn rolling_mean<T>(
41
values: &[T],
42
window_size: usize,
43
min_periods: usize,
44
center: bool,
45
weights: Option<&[f64]>,
46
_params: Option<RollingFnParams>,
47
) -> PolarsResult<ArrayRef>
48
where
49
T: NativeType + Float + std::iter::Sum<T> + SubAssign + AddAssign + IsFloat,
50
{
51
let offset_fn = match center {
52
true => det_offsets_center,
53
false => det_offsets,
54
};
55
match weights {
56
None => rolling_apply_agg_window::<MeanWindow<_>, _, _>(
57
values,
58
window_size,
59
min_periods,
60
offset_fn,
61
None,
62
),
63
Some(weights) => {
64
let wts = no_nulls::coerce_weights(weights);
65
no_nulls::rolling_apply_weights(
66
values,
67
window_size,
68
min_periods,
69
offset_fn,
70
no_nulls::compute_mean_weights,
71
&wts,
72
center,
73
)
74
},
75
}
76
}
77
78