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/ewm.rs
8469 views
1
pub use polars_compute::ewm::EWMOptions;
2
use polars_compute::ewm::mean::ewm_mean as kernel_ewm_mean;
3
use polars_compute::ewm::{ewm_std as kernel_ewm_std, ewm_var as kernel_ewm_var};
4
use polars_core::prelude::*;
5
6
fn check_alpha(alpha: f64) -> PolarsResult<()> {
7
polars_ensure!((0.0..=1.0).contains(&alpha), ComputeError: "alpha must be in [0; 1]");
8
Ok(())
9
}
10
11
pub fn ewm_mean(s: &Series, options: EWMOptions) -> PolarsResult<Series> {
12
check_alpha(options.alpha).inspect_err(|_| {
13
if cfg!(debug_assertions) {
14
panic!()
15
}
16
})?;
17
match s.dtype() {
18
#[cfg(feature = "dtype-f16")]
19
DataType::Float16 => {
20
use num_traits::AsPrimitive;
21
22
let xs = s.f16().unwrap();
23
let result = kernel_ewm_mean(
24
xs,
25
options.alpha.as_(),
26
options.adjust,
27
options.min_periods,
28
options.ignore_nulls,
29
);
30
Series::try_from((s.name().clone(), Box::new(result) as ArrayRef))
31
},
32
DataType::Float32 => {
33
let xs = s.f32().unwrap();
34
let result = kernel_ewm_mean(
35
xs,
36
options.alpha as f32,
37
options.adjust,
38
options.min_periods,
39
options.ignore_nulls,
40
);
41
Series::try_from((s.name().clone(), Box::new(result) as ArrayRef))
42
},
43
DataType::Float64 => {
44
let xs = s.f64().unwrap();
45
let result = kernel_ewm_mean(
46
xs,
47
options.alpha,
48
options.adjust,
49
options.min_periods,
50
options.ignore_nulls,
51
);
52
Series::try_from((s.name().clone(), Box::new(result) as ArrayRef))
53
},
54
dt if cfg!(debug_assertions) => panic!("{:?}", dt),
55
_ => ewm_mean(&s.cast(&DataType::Float64)?, options),
56
}
57
}
58
59
pub fn ewm_std(s: &Series, options: EWMOptions) -> PolarsResult<Series> {
60
check_alpha(options.alpha)?;
61
match s.dtype() {
62
#[cfg(feature = "dtype-f16")]
63
DataType::Float16 => {
64
use num_traits::AsPrimitive;
65
66
let xs = s.f16().unwrap();
67
let result = kernel_ewm_std(
68
xs,
69
options.alpha.as_(),
70
options.adjust,
71
options.bias,
72
options.min_periods,
73
options.ignore_nulls,
74
);
75
Series::try_from((s.name().clone(), Box::new(result) as ArrayRef))
76
},
77
DataType::Float32 => {
78
let xs = s.f32().unwrap();
79
let result = kernel_ewm_std(
80
xs,
81
options.alpha as f32,
82
options.adjust,
83
options.bias,
84
options.min_periods,
85
options.ignore_nulls,
86
);
87
Series::try_from((s.name().clone(), Box::new(result) as ArrayRef))
88
},
89
DataType::Float64 => {
90
let xs = s.f64().unwrap();
91
let result = kernel_ewm_std(
92
xs,
93
options.alpha,
94
options.adjust,
95
options.bias,
96
options.min_periods,
97
options.ignore_nulls,
98
);
99
Series::try_from((s.name().clone(), Box::new(result) as ArrayRef))
100
},
101
_ => ewm_std(&s.cast(&DataType::Float64)?, options),
102
}
103
}
104
105
pub fn ewm_var(s: &Series, options: EWMOptions) -> PolarsResult<Series> {
106
check_alpha(options.alpha)?;
107
match s.dtype() {
108
#[cfg(feature = "dtype-f16")]
109
DataType::Float16 => {
110
use num_traits::AsPrimitive;
111
112
let xs = s.f16().unwrap();
113
let result = kernel_ewm_var(
114
xs,
115
options.alpha.as_(),
116
options.adjust,
117
options.bias,
118
options.min_periods,
119
options.ignore_nulls,
120
);
121
Series::try_from((s.name().clone(), Box::new(result) as ArrayRef))
122
},
123
DataType::Float32 => {
124
let xs = s.f32().unwrap();
125
let result = kernel_ewm_var(
126
xs,
127
options.alpha as f32,
128
options.adjust,
129
options.bias,
130
options.min_periods,
131
options.ignore_nulls,
132
);
133
Series::try_from((s.name().clone(), Box::new(result) as ArrayRef))
134
},
135
DataType::Float64 => {
136
let xs = s.f64().unwrap();
137
let result = kernel_ewm_var(
138
xs,
139
options.alpha,
140
options.adjust,
141
options.bias,
142
options.min_periods,
143
options.ignore_nulls,
144
);
145
Series::try_from((s.name().clone(), Box::new(result) as ArrayRef))
146
},
147
_ => ewm_var(&s.cast(&DataType::Float64)?, options),
148
}
149
}
150
151