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)]
32#[non_exhaustive]
33pub struct TrendResult {
34 pub trend: FdMatrix,
36 pub detrended: FdMatrix,
38 pub method: Cow<'static, str>,
40 pub coefficients: Option<FdMatrix>,
43 pub rss: Vec<f64>,
45 pub n_params: usize,
47}
48
49impl TrendResult {
50 pub(super) fn empty(
52 data: &FdMatrix,
53 n: usize,
54 m: usize,
55 method: Cow<'static, str>,
56 n_params: usize,
57 ) -> Self {
58 TrendResult {
59 trend: FdMatrix::zeros(n, m),
60 detrended: FdMatrix::from_slice(data.as_slice(), n, m)
61 .unwrap_or_else(|_| FdMatrix::zeros(n, m)),
62 method,
63 coefficients: None,
64 rss: vec![0.0; n],
65 n_params,
66 }
67 }
68}
69
70#[derive(Debug, Clone)]
72#[non_exhaustive]
73pub struct DecomposeResult {
74 pub trend: FdMatrix,
76 pub seasonal: FdMatrix,
78 pub remainder: FdMatrix,
80 pub period: f64,
82 pub method: Cow<'static, str>,
84}
85
86pub(super) fn reassemble_polynomial_results(
92 results: Vec<(Vec<f64>, Vec<f64>, Vec<f64>, f64)>,
93 n: usize,
94 m: usize,
95 n_coef: usize,
96) -> (FdMatrix, FdMatrix, FdMatrix, Vec<f64>) {
97 let mut trend = FdMatrix::zeros(n, m);
98 let mut detrended = FdMatrix::zeros(n, m);
99 let mut coefficients = FdMatrix::zeros(n, n_coef);
100 let mut rss = vec![0.0; n];
101 for (i, (t, d, coefs, r)) in results.into_iter().enumerate() {
102 for j in 0..m {
103 trend[(i, j)] = t[j];
104 detrended[(i, j)] = d[j];
105 }
106 for k in 0..n_coef {
107 coefficients[(i, k)] = coefs[k];
108 }
109 rss[i] = r;
110 }
111 (trend, detrended, coefficients, rss)
112}
113
114pub(super) fn reassemble_trend_results(
116 results: Vec<(Vec<f64>, Vec<f64>, f64)>,
117 n: usize,
118 m: usize,
119) -> (FdMatrix, FdMatrix, Vec<f64>) {
120 let mut trend = FdMatrix::zeros(n, m);
121 let mut detrended = FdMatrix::zeros(n, m);
122 let mut rss = vec![0.0; n];
123 for (i, (t, d, r)) in results.into_iter().enumerate() {
124 for j in 0..m {
125 trend[(i, j)] = t[j];
126 detrended[(i, j)] = d[j];
127 }
128 rss[i] = r;
129 }
130 (trend, detrended, rss)
131}
132
133pub use auto::auto_detrend;
138pub use decompose::{decompose_additive, decompose_multiplicative};
139pub use diff::detrend_diff;
140pub use linear::detrend_linear;
141pub use loess::detrend_loess;
142pub use polynomial::detrend_polynomial;
143pub use stl::{stl_decompose, stl_decompose_with_config, stl_fdata, StlConfig, StlResult};