Path: blob/main/crates/polars-compute/src/rolling/no_nulls/mean.rs
6939 views
#![allow(unsafe_op_in_unsafe_fn)]12use super::*;34pub struct MeanWindow<'a, T> {5sum: SumWindow<'a, T, f64>,6}78impl<'a, T> RollingAggWindowNoNulls<'a, T> for MeanWindow<'a, T>9where10T: NativeType11+ IsFloat12+ std::iter::Sum13+ AddAssign14+ SubAssign15+ Div<Output = T>16+ NumCast17+ Add<Output = T>18+ Sub<Output = T>19+ PartialOrd,20{21fn new(22slice: &'a [T],23start: usize,24end: usize,25params: Option<RollingFnParams>,26window_size: Option<usize>,27) -> Self {28Self {29sum: SumWindow::<T, f64>::new(slice, start, end, params, window_size),30}31}3233unsafe fn update(&mut self, start: usize, end: usize) -> Option<T> {34let sum = self.sum.update(start, end).unwrap_unchecked();35Some(sum / NumCast::from(end - start).unwrap())36}37}3839pub fn rolling_mean<T>(40values: &[T],41window_size: usize,42min_periods: usize,43center: bool,44weights: Option<&[f64]>,45_params: Option<RollingFnParams>,46) -> PolarsResult<ArrayRef>47where48T: NativeType + Float + std::iter::Sum<T> + SubAssign + AddAssign + IsFloat,49{50let offset_fn = match center {51true => det_offsets_center,52false => det_offsets,53};54match weights {55None => rolling_apply_agg_window::<MeanWindow<_>, _, _>(56values,57window_size,58min_periods,59offset_fn,60None,61),62Some(weights) => {63let wts = no_nulls::coerce_weights(weights);64no_nulls::rolling_apply_weights(65values,66window_size,67min_periods,68offset_fn,69no_nulls::compute_mean_weights,70&wts,71center,72)73},74}75}767778