#![allow(clippy::result_large_err)]
use chrono::NaiveDate;
use pandrs::temporal::{date_range, Frequency, Temporal, TimeSeries};
use pandrs::NA;
#[test]
fn test_date_range_creation() {
let start = NaiveDate::from_str("2023-01-01").unwrap();
let end = NaiveDate::from_str("2023-01-10").unwrap();
let daily_range = date_range(start, end, Frequency::Daily, true).unwrap();
assert_eq!(daily_range.len(), 10); assert_eq!(daily_range[0], start);
assert_eq!(daily_range[9], end);
let weekly_range = date_range(start, end, Frequency::Weekly, true).unwrap();
assert_eq!(weekly_range.len(), 2); }
#[test]
fn test_frequency_parsing() {
assert_eq!(Frequency::from_str("D"), Some(Frequency::Daily));
assert_eq!(Frequency::from_str("day"), Some(Frequency::Daily));
assert_eq!(Frequency::from_str("DAILY"), Some(Frequency::Daily));
assert_eq!(Frequency::from_str("W"), Some(Frequency::Weekly));
assert_eq!(Frequency::from_str("M"), Some(Frequency::Monthly));
assert_eq!(Frequency::from_str("Q"), Some(Frequency::Quarterly));
assert_eq!(Frequency::from_str("Y"), Some(Frequency::Yearly));
assert_eq!(Frequency::from_str("invalid"), None);
}
#[test]
fn test_time_series_creation() {
let dates = date_range(
NaiveDate::from_str("2023-01-01").unwrap(),
NaiveDate::from_str("2023-01-05").unwrap(),
Frequency::Daily,
true,
)
.unwrap();
let values = vec![
NA::Value(10.0),
NA::Value(20.0),
NA::NA,
NA::Value(30.0),
NA::Value(40.0),
];
let ts = TimeSeries::new(values, dates, Some("test".to_string())).unwrap();
assert_eq!(ts.len(), 5);
assert_eq!(ts.name(), Some(&"test".to_string()));
}
#[test]
fn test_time_series_filter() {
let dates = date_range(
NaiveDate::from_str("2023-01-01").unwrap(),
NaiveDate::from_str("2023-01-10").unwrap(),
Frequency::Daily,
true,
)
.unwrap();
let values = (0..10).map(|i| NA::Value(i as f64)).collect();
let ts = TimeSeries::new(values, dates, None).unwrap();
let start_filter = NaiveDate::from_str("2023-01-03").unwrap();
let end_filter = NaiveDate::from_str("2023-01-07").unwrap();
let filtered = ts.filter_by_time(&start_filter, &end_filter).unwrap();
assert_eq!(filtered.len(), 5);
assert_eq!(filtered.timestamps()[0], start_filter);
assert_eq!(filtered.timestamps()[4], end_filter);
}
#[test]
fn test_rolling_mean() {
let dates = date_range(
NaiveDate::from_str("2023-01-01").unwrap(),
NaiveDate::from_str("2023-01-05").unwrap(),
Frequency::Daily,
true,
)
.unwrap();
let values = vec![
NA::Value(10.0),
NA::Value(20.0),
NA::Value(30.0),
NA::Value(40.0),
NA::Value(50.0),
];
let ts = TimeSeries::new(values, dates, None).unwrap();
let window = 3;
let ma = ts.rolling_mean(window).unwrap();
assert_eq!(ma.len(), 5);
assert!(ma.values()[0].is_na());
assert!(ma.values()[1].is_na());
if let NA::Value(v) = ma.values()[2] {
assert_eq!(v, (10.0 + 20.0 + 30.0) / 3.0);
} else {
panic!("Expected a value at index 2");
}
if let NA::Value(v) = ma.values()[3] {
assert_eq!(v, (20.0 + 30.0 + 40.0) / 3.0);
} else {
panic!("Expected a value at index 3");
}
if let NA::Value(v) = ma.values()[4] {
assert_eq!(v, (30.0 + 40.0 + 50.0) / 3.0);
} else {
panic!("Expected a value at index 4");
}
}