use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimeSeries {
pub values: Vec<f64>,
pub timestamps: Option<Vec<u64>>,
pub frequency: Option<u64>,
}
impl TimeSeries {
pub fn new(values: Vec<f64>) -> Self {
Self {
values,
timestamps: None,
frequency: None,
}
}
pub fn with_timestamps(values: Vec<f64>, timestamps: Vec<u64>) -> Self {
Self {
values,
timestamps: Some(timestamps),
frequency: None,
}
}
pub fn len(&self) -> usize {
self.values.len()
}
pub fn is_empty(&self) -> bool {
self.values.is_empty()
}
pub fn mean(&self) -> f64 {
if self.values.is_empty() {
return 0.0;
}
self.values.iter().sum::<f64>() / self.values.len() as f64
}
pub fn variance(&self) -> f64 {
if self.values.len() < 2 {
return 0.0;
}
let mean = self.mean();
self.values.iter().map(|x| (x - mean).powi(2)).sum::<f64>() / (self.values.len() - 1) as f64
}
pub fn std_dev(&self) -> f64 {
self.variance().sqrt()
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub struct ARIMAParams {
pub p: usize,
pub d: usize,
pub q: usize,
}
impl ARIMAParams {
pub fn new(p: usize, d: usize, q: usize) -> Self {
Self { p, d, q }
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ARIMAResult {
pub ar_coefficients: Vec<f64>,
pub ma_coefficients: Vec<f64>,
pub intercept: f64,
pub fitted: Vec<f64>,
pub residuals: Vec<f64>,
pub forecast: Vec<f64>,
pub aic: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProphetResult {
pub trend: Vec<f64>,
pub seasonal: Option<Vec<f64>>,
pub holidays: Option<Vec<f64>>,
pub residuals: Vec<f64>,
pub forecast: Vec<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DecompositionResult {
pub trend: Vec<f64>,
pub seasonal: Vec<f64>,
pub residual: Vec<f64>,
pub n: usize,
pub period: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TrendMethod {
SimpleMovingAverage,
ExponentialMovingAverage,
CenteredMovingAverage,
Lowess,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TrendResult {
pub trend: Vec<f64>,
pub detrended: Vec<f64>,
pub method: TrendMethod,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChangePointResult {
pub change_points: Vec<usize>,
pub confidence: Vec<f64>,
pub segment_means: Vec<f64>,
pub segment_variances: Vec<f64>,
pub cost: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ChangePointMethod {
PELT,
BinarySegmentation,
CUSUM,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimeSeriesAnomalyResult {
pub scores: Vec<f64>,
pub anomaly_indices: Vec<usize>,
pub expected: Vec<f64>,
pub threshold: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AnomalyMethod {
ZScore,
IQR,
MovingAverageDeviation,
SeasonalESD,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub struct GARCHParams {
pub p: usize,
pub q: usize,
}
impl GARCHParams {
pub fn new(p: usize, q: usize) -> Self {
Self { p, q }
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VolatilityResult {
pub variance: Vec<f64>,
pub volatility: Vec<f64>,
pub coefficients: GARCHCoefficients,
pub forecast: Vec<f64>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct GARCHCoefficients {
pub omega: f64,
pub alpha: Vec<f64>,
pub beta: Vec<f64>,
}