use std::time::Duration;
use wingfoil::adapters::augurs::*;
use wingfoil::*;
fn forecasting() {
println!("== forecasting (ETS, 5 steps ahead, 90% interval) ==");
ticker(Duration::from_secs(1))
.count()
.map(|n| n as f64 + (n as f64 * 0.5).sin())
.augurs_forecast(AugursForecastConfig::new(48, 5).with_level(0.90))
.for_each(|forecast, time| {
let point: Vec<String> = forecast.point.iter().map(|v| format!("{v:.1}")).collect();
println!(" {time} next 5: [{}]", point.join(", "));
})
.run(RunMode::HistoricalFrom(NanoTime::ZERO), RunFor::Cycles(36))
.unwrap();
}
fn outlier_detection() {
println!("\n== outlier detection (MAD over 4 series) ==");
ticker(Duration::from_secs(1))
.count()
.map(|n| {
let base = 100.0 + (n as f64 * 0.4).sin();
let diverging = if n > 20 { base + 75.0 } else { base + 0.3 };
vec![base, base + 0.1, base - 0.1, diverging]
})
.augurs_outlier(AugursOutlierConfig::new(40, 0.5))
.for_each(|outliers, time| {
if !outliers.outlying.is_empty() {
println!(" {time} outlying series: {:?}", outliers.outlying);
}
})
.run(RunMode::HistoricalFrom(NanoTime::ZERO), RunFor::Cycles(36))
.unwrap();
}
fn seasonality() {
println!("\n== seasonality detection (periodogram) ==");
ticker(Duration::from_secs(1))
.count()
.map(|n| (n as f64 * std::f64::consts::TAU / 24.0).sin())
.augurs_seasons(AugursSeasonsConfig::new(120))
.for_each(|seasons, time| {
if let Some(period) = seasons.dominant() {
println!(" {time} seasonal period ~= {period} samples (true 24)");
}
})
.run(RunMode::HistoricalFrom(NanoTime::ZERO), RunFor::Cycles(120))
.unwrap();
}
fn changepoints() {
println!("\n== changepoint detection (BOCPD) ==");
ticker(Duration::from_secs(1))
.count()
.map(|n| if n > 30 { 50.0 } else { 0.0 })
.augurs_changepoint(AugursChangepointConfig::new(60))
.for_each(|changes, time| {
if changes.any() {
println!(
" {time} changepoint at window index {:?}",
changes.indices
);
}
})
.run(RunMode::HistoricalFrom(NanoTime::ZERO), RunFor::Cycles(50))
.unwrap();
}
fn main() {
env_logger::init();
forecasting();
outlier_detection();
seasonality();
changepoints();
}