polars_compute/rolling/nulls/
min_max.rs

1use polars_utils::min_max::{MaxPropagateNan, MinPropagateNan};
2
3use super::super::min_max::MinMaxWindow;
4
5pub type MinWindow<'a, T> = MinMaxWindow<'a, T, MinPropagateNan>;
6pub type MaxWindow<'a, T> = MinMaxWindow<'a, T, MaxPropagateNan>;
7
8use super::*;
9
10pub fn rolling_min<T>(
11    arr: &PrimitiveArray<T>,
12    window_size: usize,
13    min_periods: usize,
14    center: bool,
15    weights: Option<&[f64]>,
16    _params: Option<RollingFnParams>,
17) -> ArrayRef
18where
19    T: NativeType + IsFloat,
20{
21    if weights.is_some() {
22        panic!("weights not yet supported on array with null values")
23    }
24    if center {
25        rolling_apply_agg_window::<MinMaxWindow<T, MinPropagateNan>, _, _>(
26            arr.values().as_slice(),
27            arr.validity().as_ref().unwrap(),
28            window_size,
29            min_periods,
30            det_offsets_center,
31            None,
32        )
33    } else {
34        rolling_apply_agg_window::<MinMaxWindow<T, MinPropagateNan>, _, _>(
35            arr.values().as_slice(),
36            arr.validity().as_ref().unwrap(),
37            window_size,
38            min_periods,
39            det_offsets,
40            None,
41        )
42    }
43}
44
45pub fn rolling_max<T>(
46    arr: &PrimitiveArray<T>,
47    window_size: usize,
48    min_periods: usize,
49    center: bool,
50    weights: Option<&[f64]>,
51    _params: Option<RollingFnParams>,
52) -> ArrayRef
53where
54    T: NativeType + std::iter::Sum + Zero + AddAssign + Copy + PartialOrd + Bounded + IsFloat,
55{
56    if weights.is_some() {
57        panic!("weights not yet supported on array with null values")
58    }
59    if center {
60        rolling_apply_agg_window::<MinMaxWindow<T, MaxPropagateNan>, _, _>(
61            arr.values().as_slice(),
62            arr.validity().as_ref().unwrap(),
63            window_size,
64            min_periods,
65            det_offsets_center,
66            None,
67        )
68    } else {
69        rolling_apply_agg_window::<MinMaxWindow<T, MaxPropagateNan>, _, _>(
70            arr.values().as_slice(),
71            arr.validity().as_ref().unwrap(),
72            window_size,
73            min_periods,
74            det_offsets,
75            None,
76        )
77    }
78}