use crate::matrix::FdMatrix;
use std::borrow::Cow;
pub mod auto;
pub mod decompose;
pub mod diff;
pub mod linear;
pub mod loess;
pub mod polynomial;
pub mod stl;
#[cfg(test)]
mod tests;
#[derive(Debug, Clone)]
#[non_exhaustive]
pub struct TrendResult {
pub trend: FdMatrix,
pub detrended: FdMatrix,
pub method: Cow<'static, str>,
pub coefficients: Option<FdMatrix>,
pub rss: Vec<f64>,
pub n_params: usize,
}
impl TrendResult {
pub(super) fn empty(
data: &FdMatrix,
n: usize,
m: usize,
method: Cow<'static, str>,
n_params: usize,
) -> Self {
TrendResult {
trend: FdMatrix::zeros(n, m),
detrended: FdMatrix::from_slice(data.as_slice(), n, m)
.unwrap_or_else(|_| FdMatrix::zeros(n, m)),
method,
coefficients: None,
rss: vec![0.0; n],
n_params,
}
}
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub struct DecomposeResult {
pub trend: FdMatrix,
pub seasonal: FdMatrix,
pub remainder: FdMatrix,
pub period: f64,
pub method: Cow<'static, str>,
}
pub(super) fn reassemble_polynomial_results(
results: Vec<(Vec<f64>, Vec<f64>, Vec<f64>, f64)>,
n: usize,
m: usize,
n_coef: usize,
) -> (FdMatrix, FdMatrix, FdMatrix, Vec<f64>) {
let mut trend = FdMatrix::zeros(n, m);
let mut detrended = FdMatrix::zeros(n, m);
let mut coefficients = FdMatrix::zeros(n, n_coef);
let mut rss = vec![0.0; n];
for (i, (t, d, coefs, r)) in results.into_iter().enumerate() {
for j in 0..m {
trend[(i, j)] = t[j];
detrended[(i, j)] = d[j];
}
for k in 0..n_coef {
coefficients[(i, k)] = coefs[k];
}
rss[i] = r;
}
(trend, detrended, coefficients, rss)
}
pub(super) fn reassemble_trend_results(
results: Vec<(Vec<f64>, Vec<f64>, f64)>,
n: usize,
m: usize,
) -> (FdMatrix, FdMatrix, Vec<f64>) {
let mut trend = FdMatrix::zeros(n, m);
let mut detrended = FdMatrix::zeros(n, m);
let mut rss = vec![0.0; n];
for (i, (t, d, r)) in results.into_iter().enumerate() {
for j in 0..m {
trend[(i, j)] = t[j];
detrended[(i, j)] = d[j];
}
rss[i] = r;
}
(trend, detrended, rss)
}
pub use auto::auto_detrend;
pub use decompose::{decompose_additive, decompose_multiplicative};
pub use diff::detrend_diff;
pub use linear::detrend_linear;
pub use loess::detrend_loess;
pub use polynomial::detrend_polynomial;
pub use stl::{stl_decompose, stl_decompose_with_config, stl_fdata, StlConfig, StlResult};