#[cfg(feature = "optimized")]
use pandrs::error::Result;
#[cfg(feature = "optimized")]
use pandrs::{Column, Float64Column, LazyFrame, OptimizedDataFrame, StringColumn};
#[cfg(not(feature = "optimized"))]
fn main() {
println!("This example requires the 'optimized' feature flag to be enabled.");
println!("Please recompile with:");
println!(" cargo run --example optimized_multi_index_example --features \"optimized\"");
}
#[cfg(feature = "optimized")]
#[allow(clippy::result_large_err)]
fn main() -> Result<()> {
println!("=== Optimized MultiIndex Example ===\n");
println!("--- Simulating Multi-Level Index with Multiple Columns ---");
let mut df = OptimizedDataFrame::new();
let category = vec![
"Electronics".to_string(),
"Electronics".to_string(),
"Electronics".to_string(),
"Electronics".to_string(),
"Furniture".to_string(),
"Furniture".to_string(),
"Furniture".to_string(),
"Furniture".to_string(),
];
let category_col = StringColumn::new(category);
df.add_column("category", Column::String(category_col))?;
let product = vec![
"TV".to_string(),
"TV".to_string(),
"Computer".to_string(),
"Computer".to_string(),
"Table".to_string(),
"Table".to_string(),
"Chair".to_string(),
"Chair".to_string(),
];
let product_col = StringColumn::new(product);
df.add_column("product", Column::String(product_col))?;
let year = vec![
"2022".to_string(),
"2023".to_string(),
"2022".to_string(),
"2023".to_string(),
"2022".to_string(),
"2023".to_string(),
"2022".to_string(),
"2023".to_string(),
];
let year_col = StringColumn::new(year);
df.add_column("year", Column::String(year_col))?;
let sales = vec![1000.0, 1200.0, 1500.0, 1800.0, 800.0, 900.0, 600.0, 700.0];
let sales_col = Float64Column::new(sales);
df.add_column("sales", Column::Float64(sales_col))?;
println!("DataFrame with Multi-Level Index:");
println!("{:?}", df);
println!("\n--- Aggregation Using Multi-Level Index ---");
let result = LazyFrame::new(df.clone())
.aggregate(
vec!["category".to_string(), "product".to_string()],
vec![(
"sales".to_string(),
pandrs::AggregateOp::Sum,
"total_sales".to_string(),
)],
)
.execute()?;
println!("Sales by Category and Product:");
println!("{:?}", result);
let category_result = LazyFrame::new(df.clone())
.aggregate(
vec!["category".to_string()],
vec![(
"sales".to_string(),
pandrs::AggregateOp::Sum,
"total_sales".to_string(),
)],
)
.execute()?;
println!("\nSales by Category:");
println!("{:?}", category_result);
let year_result = LazyFrame::new(df)
.aggregate(
vec!["year".to_string()],
vec![(
"sales".to_string(),
pandrs::AggregateOp::Sum,
"total_sales".to_string(),
)],
)
.execute()?;
println!("\nSales by Year:");
println!("{:?}", year_result);
println!("\n=== MultiIndex Example Complete ===");
Ok(())
}