Path: blob/main/crates/polars-compute/src/rolling/nulls/mean.rs
6939 views
#![allow(unsafe_op_in_unsafe_fn)]1use super::*;23pub struct MeanWindow<'a, T> {4sum: SumWindow<'a, T, f64>,5}67impl<8'a,9T: NativeType10+ IsFloat11+ Add<Output = T>12+ Sub<Output = T>13+ NumCast14+ Div<Output = T>15+ AddAssign16+ SubAssign17+ PartialOrd,18> RollingAggWindowNulls<'a, T> for MeanWindow<'a, T>19{20unsafe fn new(21slice: &'a [T],22validity: &'a Bitmap,23start: usize,24end: usize,25params: Option<RollingFnParams>,26window_size: Option<usize>,27) -> Self {28Self {29sum: SumWindow::new(slice, validity, 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);35let len = end - start;36if self.sum.null_count == len {37None38} else {39sum.map(|sum| sum / NumCast::from(end - start - self.sum.null_count).unwrap())40}41}42fn is_valid(&self, min_periods: usize) -> bool {43self.sum.is_valid(min_periods)44}45}4647pub fn rolling_mean<T>(48arr: &PrimitiveArray<T>,49window_size: usize,50min_periods: usize,51center: bool,52weights: Option<&[f64]>,53_params: Option<RollingFnParams>,54) -> ArrayRef55where56T: NativeType57+ IsFloat58+ PartialOrd59+ Add<Output = T>60+ Sub<Output = T>61+ NumCast62+ AddAssign63+ SubAssign64+ Div<Output = T>,65{66if weights.is_some() {67panic!("weights not yet supported on array with null values")68}69if center {70rolling_apply_agg_window::<MeanWindow<_>, _, _>(71arr.values().as_slice(),72arr.validity().as_ref().unwrap(),73window_size,74min_periods,75det_offsets_center,76None,77)78} else {79rolling_apply_agg_window::<MeanWindow<_>, _, _>(80arr.values().as_slice(),81arr.validity().as_ref().unwrap(),82window_size,83min_periods,84det_offsets,85None,86)87}88}899091