fdars_core/detrend/
mod.rs1use crate::matrix::FdMatrix;
13use std::borrow::Cow;
14
15pub mod auto;
16pub mod decompose;
17pub mod diff;
18pub mod linear;
19pub mod loess;
20pub mod polynomial;
21pub mod stl;
22
23#[cfg(test)]
24mod tests;
25
26#[derive(Debug, Clone)]
32pub struct TrendResult {
33 pub trend: FdMatrix,
35 pub detrended: FdMatrix,
37 pub method: Cow<'static, str>,
39 pub coefficients: Option<FdMatrix>,
42 pub rss: Vec<f64>,
44 pub n_params: usize,
46}
47
48impl TrendResult {
49 pub(super) fn empty(
51 data: &FdMatrix,
52 n: usize,
53 m: usize,
54 method: Cow<'static, str>,
55 n_params: usize,
56 ) -> Self {
57 TrendResult {
58 trend: FdMatrix::zeros(n, m),
59 detrended: FdMatrix::from_slice(data.as_slice(), n, m)
60 .unwrap_or_else(|_| FdMatrix::zeros(n, m)),
61 method,
62 coefficients: None,
63 rss: vec![0.0; n],
64 n_params,
65 }
66 }
67}
68
69#[derive(Debug, Clone)]
71pub struct DecomposeResult {
72 pub trend: FdMatrix,
74 pub seasonal: FdMatrix,
76 pub remainder: FdMatrix,
78 pub period: f64,
80 pub method: Cow<'static, str>,
82}
83
84pub(super) fn reassemble_polynomial_results(
90 results: Vec<(Vec<f64>, Vec<f64>, Vec<f64>, f64)>,
91 n: usize,
92 m: usize,
93 n_coef: usize,
94) -> (FdMatrix, FdMatrix, FdMatrix, Vec<f64>) {
95 let mut trend = FdMatrix::zeros(n, m);
96 let mut detrended = FdMatrix::zeros(n, m);
97 let mut coefficients = FdMatrix::zeros(n, n_coef);
98 let mut rss = vec![0.0; n];
99 for (i, (t, d, coefs, r)) in results.into_iter().enumerate() {
100 for j in 0..m {
101 trend[(i, j)] = t[j];
102 detrended[(i, j)] = d[j];
103 }
104 for k in 0..n_coef {
105 coefficients[(i, k)] = coefs[k];
106 }
107 rss[i] = r;
108 }
109 (trend, detrended, coefficients, rss)
110}
111
112pub(super) fn reassemble_trend_results(
114 results: Vec<(Vec<f64>, Vec<f64>, f64)>,
115 n: usize,
116 m: usize,
117) -> (FdMatrix, FdMatrix, Vec<f64>) {
118 let mut trend = FdMatrix::zeros(n, m);
119 let mut detrended = FdMatrix::zeros(n, m);
120 let mut rss = vec![0.0; n];
121 for (i, (t, d, r)) in results.into_iter().enumerate() {
122 for j in 0..m {
123 trend[(i, j)] = t[j];
124 detrended[(i, j)] = d[j];
125 }
126 rss[i] = r;
127 }
128 (trend, detrended, rss)
129}
130
131pub use auto::auto_detrend;
136pub use decompose::{decompose_additive, decompose_multiplicative};
137pub use diff::detrend_diff;
138pub use linear::detrend_linear;
139pub use loess::detrend_loess;
140pub use polynomial::detrend_polynomial;
141pub use stl::{stl_decompose, stl_decompose_with_config, stl_fdata, StlConfig, StlResult};