Path: blob/main/crates/polars-compute/src/rolling/mean.rs
8429 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<T> RollingAggWindowNoNulls<T> for MeanWindow<'_, T>10where11T: NativeType12+ IsFloat13+ std::iter::Sum14+ AddAssign15+ SubAssign16+ Div<Output = T>17+ NumCast18+ Add<Output = T>19+ Sub<Output = T>20+ PartialOrd,21{22type This<'a> = MeanWindow<'a, T>;2324fn new<'a>(25slice: &'a [T],26start: usize,27end: usize,28params: Option<RollingFnParams>,29window_size: Option<usize>,30) -> Self::This<'a> {31MeanWindow {32sum: <SumWindow<T, f64> as RollingAggWindowNoNulls<T>>::new(33slice,34start,35end,36params,37window_size,38),39}40}4142unsafe fn update(&mut self, new_start: usize, new_end: usize) {43unsafe {44RollingAggWindowNoNulls::update(&mut self.sum, new_start, new_end);45};46}4748fn get_agg(&self, idx: usize) -> Option<T> {49let sum = RollingAggWindowNoNulls::get_agg(&self.sum, idx).unwrap();50(self.sum.start != self.sum.end)51.then(|| sum / NumCast::from(self.sum.end - self.sum.start).unwrap())52}5354fn slice_len(&self) -> usize {55RollingAggWindowNulls::slice_len(&self.sum)56}57}5859impl<60T: NativeType61+ IsFloat62+ Add<Output = T>63+ Sub<Output = T>64+ NumCast65+ Div<Output = T>66+ AddAssign67+ SubAssign68+ PartialOrd,69> RollingAggWindowNulls<T> for MeanWindow<'_, T>70{71type This<'a> = MeanWindow<'a, T>;7273fn new<'a>(74slice: &'a [T],75validity: &'a Bitmap,76start: usize,77end: usize,78params: Option<RollingFnParams>,79window_size: Option<usize>,80) -> Self::This<'a> {81MeanWindow {82sum: <SumWindow<T, f64> as RollingAggWindowNulls<T>>::new(83slice,84validity,85start,86end,87params,88window_size,89),90}91}9293unsafe fn update(&mut self, new_start: usize, new_end: usize) {94unsafe { RollingAggWindowNulls::update(&mut self.sum, new_start, new_end) };95}9697fn get_agg(&self, idx: usize) -> Option<T> {98let sum = RollingAggWindowNulls::get_agg(&self.sum, idx);99let len = self.sum.end - self.sum.start;100if self.sum.null_count == len {101None102} else {103sum.map(|sum| {104sum / NumCast::from(self.sum.end - self.sum.start - self.sum.null_count).unwrap()105})106}107}108109fn is_valid(&self, min_periods: usize) -> bool {110self.sum.is_valid(min_periods)111}112113fn slice_len(&self) -> usize {114RollingAggWindowNulls::slice_len(&self.sum)115}116}117118119