Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-ops/src/series/ops/rolling.rs
6939 views
1
use polars_core::prelude::*;
2
#[cfg(feature = "moment")]
3
use {
4
num_traits::{Float, pow::Pow},
5
std::ops::SubAssign,
6
};
7
8
#[cfg(feature = "moment")]
9
fn rolling_skew_ca<T>(
10
ca: &ChunkedArray<T>,
11
window_size: usize,
12
min_periods: usize,
13
center: bool,
14
params: Option<RollingFnParams>,
15
) -> PolarsResult<ChunkedArray<T>>
16
where
17
T: PolarsFloatType,
18
T::Native: Float + SubAssign + Pow<T::Native, Output = T::Native>,
19
{
20
use arrow::array::Array;
21
22
let ca = ca.rechunk();
23
let arr = ca.downcast_get(0).unwrap();
24
let arr = if arr.has_nulls() {
25
polars_compute::rolling::nulls::rolling_skew(arr, window_size, min_periods, center, params)
26
} else {
27
let values = arr.values();
28
polars_compute::rolling::no_nulls::rolling_skew(
29
values,
30
window_size,
31
min_periods,
32
center,
33
params,
34
)?
35
};
36
Ok(unsafe { ca.with_chunks(vec![arr]) })
37
}
38
39
#[cfg(feature = "moment")]
40
pub fn rolling_skew(s: &Series, options: RollingOptionsFixedWindow) -> PolarsResult<Series> {
41
let window_size = options.window_size;
42
let min_periods = options.min_periods;
43
let center = options.center;
44
let params = options.fn_params;
45
46
match s.dtype() {
47
DataType::Float64 => {
48
let ca = s.f64().unwrap();
49
rolling_skew_ca(ca, window_size, min_periods, center, params).map(|ca| ca.into_series())
50
},
51
DataType::Float32 => {
52
let ca = s.f32().unwrap();
53
rolling_skew_ca(ca, window_size, min_periods, center, params).map(|ca| ca.into_series())
54
},
55
dt if dt.is_primitive_numeric() => {
56
let s = s.cast(&DataType::Float64).unwrap();
57
rolling_skew(&s, options)
58
},
59
dt => polars_bail!(opq = rolling_skew, dt),
60
}
61
}
62
63
#[cfg(feature = "moment")]
64
fn rolling_kurtosis_ca<T>(
65
ca: &ChunkedArray<T>,
66
window_size: usize,
67
params: Option<RollingFnParams>,
68
min_periods: usize,
69
center: bool,
70
) -> PolarsResult<ChunkedArray<T>>
71
where
72
T: PolarsFloatType,
73
T::Native: Float + SubAssign + Pow<T::Native, Output = T::Native>,
74
{
75
use arrow::array::Array;
76
77
let ca = ca.rechunk();
78
let arr = ca.downcast_get(0).unwrap();
79
let arr = if arr.has_nulls() {
80
polars_compute::rolling::nulls::rolling_kurtosis(
81
arr,
82
window_size,
83
min_periods,
84
center,
85
params,
86
)
87
} else {
88
let values = arr.values();
89
polars_compute::rolling::no_nulls::rolling_kurtosis(
90
values,
91
window_size,
92
min_periods,
93
center,
94
params,
95
)?
96
};
97
Ok(unsafe { ca.with_chunks(vec![arr]) })
98
}
99
100
#[cfg(feature = "moment")]
101
pub fn rolling_kurtosis(s: &Series, options: RollingOptionsFixedWindow) -> PolarsResult<Series> {
102
let window_size = options.window_size;
103
let min_periods = options.min_periods;
104
let center = options.center;
105
let params = options.fn_params;
106
107
match s.dtype() {
108
DataType::Float64 => {
109
let ca = s.f64().unwrap();
110
rolling_kurtosis_ca(ca, window_size, params, min_periods, center)
111
.map(|ca| ca.into_series())
112
},
113
DataType::Float32 => {
114
let ca = s.f32().unwrap();
115
rolling_kurtosis_ca(ca, window_size, params, min_periods, center)
116
.map(|ca| ca.into_series())
117
},
118
dt if dt.is_primitive_numeric() => {
119
let s = s.cast(&DataType::Float64).unwrap();
120
rolling_kurtosis(&s, options)
121
},
122
dt => polars_bail!(opq = rolling_kurtosis, dt),
123
}
124
}
125
126