Path: blob/main/crates/polars-compute/src/rolling/mean.rs
7884 views
use super::no_nulls::RollingAggWindowNoNulls;1use super::nulls::RollingAggWindowNulls;2use super::sum::SumWindow;3use super::*;45pub struct MeanWindow<'a, T> {6sum: SumWindow<'a, T, f64>,7}89impl<'a, T> RollingAggWindowNoNulls<'a, T> for MeanWindow<'a, T>10where11T: NativeType12+ IsFloat13+ std::iter::Sum14+ AddAssign15+ SubAssign16+ Div<Output = T>17+ NumCast18+ Add<Output = T>19+ Sub<Output = T>20+ PartialOrd,21{22fn new(23slice: &'a [T],24start: usize,25end: usize,26params: Option<RollingFnParams>,27window_size: Option<usize>,28) -> Self {29Self {30sum: RollingAggWindowNoNulls::new(slice, start, end, params, window_size),31}32}3334unsafe fn update(&mut self, start: usize, end: usize) -> Option<T> {35let sum = unsafe {36RollingAggWindowNoNulls::update(&mut self.sum, start, end).unwrap_unchecked()37};38if start == end {39None40} else {41Some(sum / NumCast::from(end - start).unwrap())42}43}44}4546impl<47'a,48T: NativeType49+ IsFloat50+ Add<Output = T>51+ Sub<Output = T>52+ NumCast53+ Div<Output = T>54+ AddAssign55+ SubAssign56+ PartialOrd,57> RollingAggWindowNulls<'a, T> for MeanWindow<'a, T>58{59unsafe fn new(60slice: &'a [T],61validity: &'a Bitmap,62start: usize,63end: usize,64params: Option<RollingFnParams>,65window_size: Option<usize>,66) -> Self {67Self {68sum: unsafe {69RollingAggWindowNulls::new(slice, validity, start, end, params, window_size)70},71}72}7374unsafe fn update(&mut self, start: usize, end: usize) -> Option<T> {75let sum = unsafe { RollingAggWindowNulls::update(&mut self.sum, start, end) };76let len = end - start;77if self.sum.null_count == len {78None79} else {80sum.map(|sum| sum / NumCast::from(end - start - self.sum.null_count).unwrap())81}82}83fn is_valid(&self, min_periods: usize) -> bool {84self.sum.is_valid(min_periods)85}86}878889