polars_compute/rolling/nulls/
min_max.rs1use 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}