use pandrs::error::Result;
use pandrs::{NASeries, NA};
#[allow(clippy::result_large_err)]
fn main() -> Result<()> {
println!("=== Support for NA Values (Missing Data) ===");
let data = vec![
NA::Value(10),
NA::Value(20),
NA::NA, NA::Value(40),
NA::NA, ];
let series = NASeries::new(data, Some("numbers".to_string()))?;
println!("Series with NA: {series:?}");
println!("Number of NAs: {}", series.na_count());
println!("Number of values: {}", series.value_count());
println!("Contains NA: {}", series.has_na());
println!("\n--- Handling of NA Values ---");
println!("Sum (ignoring NAs): {:?}", series.sum());
println!("Mean (ignoring NAs): {:?}", series.mean());
println!("Minimum (ignoring NAs): {:?}", series.min());
println!("Maximum (ignoring NAs): {:?}", series.max());
println!("\n--- Handling of NA Values ---");
let dropped = series.dropna()?;
println!("Series after dropping NAs: {dropped:?}");
println!("Length after dropping NAs: {}", dropped.len());
let filled = series.fillna(0)?;
println!("Series after filling NAs with 0: {filled:?}");
println!("\n--- Conversion from Option ---");
let option_data = vec![Some(100), Some(200), None, Some(400), None];
let option_series = NASeries::from_options(option_data, Some("from_options".to_string()))?;
println!("Series from Option: {option_series:?}");
println!("\n--- Numerical Operations with NA Values ---");
let a = NA::Value(10);
let b = NA::Value(5);
let na = NA::<i32>::NA;
println!("{:?} + {:?} = {:?}", a, b, a + b);
println!("{:?} - {:?} = {:?}", a, b, a - b);
println!("{:?} * {:?} = {:?}", a, b, a * b);
println!("{:?} / {:?} = {:?}", a, b, a / b);
println!("{:?} + {:?} = {:?}", a, na, a + na);
println!("{:?} * {:?} = {:?}", b, na, b * na);
println!("=== NA Value Sample Complete ===");
Ok(())
}