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
6939 views
1
pub use arrow::legacy::kernels::ewm::EWMOptions;
2
use arrow::legacy::kernels::ewm::{
3
ewm_mean as kernel_ewm_mean, ewm_std as kernel_ewm_std, ewm_var as kernel_ewm_var,
4
};
5
use polars_core::prelude::*;
6
7
fn check_alpha(alpha: f64) -> PolarsResult<()> {
8
polars_ensure!((0.0..=1.0).contains(&alpha), ComputeError: "alpha must be in [0; 1]");
9
Ok(())
10
}
11
12
pub fn ewm_mean(s: &Series, options: EWMOptions) -> PolarsResult<Series> {
13
check_alpha(options.alpha)?;
14
match s.dtype() {
15
DataType::Float32 => {
16
let xs = s.f32().unwrap();
17
let result = kernel_ewm_mean(
18
xs,
19
options.alpha as f32,
20
options.adjust,
21
options.min_periods,
22
options.ignore_nulls,
23
);
24
Series::try_from((s.name().clone(), Box::new(result) as ArrayRef))
25
},
26
DataType::Float64 => {
27
let xs = s.f64().unwrap();
28
let result = kernel_ewm_mean(
29
xs,
30
options.alpha,
31
options.adjust,
32
options.min_periods,
33
options.ignore_nulls,
34
);
35
Series::try_from((s.name().clone(), Box::new(result) as ArrayRef))
36
},
37
_ => ewm_mean(&s.cast(&DataType::Float64)?, options),
38
}
39
}
40
41
pub fn ewm_std(s: &Series, options: EWMOptions) -> PolarsResult<Series> {
42
check_alpha(options.alpha)?;
43
match s.dtype() {
44
DataType::Float32 => {
45
let xs = s.f32().unwrap();
46
let result = kernel_ewm_std(
47
xs,
48
options.alpha as f32,
49
options.adjust,
50
options.bias,
51
options.min_periods,
52
options.ignore_nulls,
53
);
54
Series::try_from((s.name().clone(), Box::new(result) as ArrayRef))
55
},
56
DataType::Float64 => {
57
let xs = s.f64().unwrap();
58
let result = kernel_ewm_std(
59
xs,
60
options.alpha,
61
options.adjust,
62
options.bias,
63
options.min_periods,
64
options.ignore_nulls,
65
);
66
Series::try_from((s.name().clone(), Box::new(result) as ArrayRef))
67
},
68
_ => ewm_std(&s.cast(&DataType::Float64)?, options),
69
}
70
}
71
72
pub fn ewm_var(s: &Series, options: EWMOptions) -> PolarsResult<Series> {
73
check_alpha(options.alpha)?;
74
match s.dtype() {
75
DataType::Float32 => {
76
let xs = s.f32().unwrap();
77
let result = kernel_ewm_var(
78
xs,
79
options.alpha as f32,
80
options.adjust,
81
options.bias,
82
options.min_periods,
83
options.ignore_nulls,
84
);
85
Series::try_from((s.name().clone(), Box::new(result) as ArrayRef))
86
},
87
DataType::Float64 => {
88
let xs = s.f64().unwrap();
89
let result = kernel_ewm_var(
90
xs,
91
options.alpha,
92
options.adjust,
93
options.bias,
94
options.min_periods,
95
options.ignore_nulls,
96
);
97
Series::try_from((s.name().clone(), Box::new(result) as ArrayRef))
98
},
99
_ => ewm_var(&s.cast(&DataType::Float64)?, options),
100
}
101
}
102
103