use greeners_core::dataframe::DataFrame;
fn main() {
println!("=== PIVOT TABLES - Reshape Data ===\n");
println!("=== PIVOT TABLE - Long to Wide Format ===\n");
let sales_long = DataFrame::builder()
.add_column("date", vec![1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0])
.add_column("product", vec![1.0, 2.0, 3.0, 1.0, 2.0, 3.0, 1.0, 2.0, 3.0])
.add_column("region", vec![1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 1.0])
.add_column(
"sales",
vec![
100.0, 150.0, 200.0, 120.0, 180.0, 220.0, 110.0, 160.0, 210.0,
],
)
.build()
.unwrap();
println!("Original data (LONG format):");
println!("{}\n", sales_long);
println!("--- Pivot: Products (rows) × Regions (columns) ---");
let pivot1 = sales_long
.pivot_table("product", "region", "sales", "sum")
.unwrap();
println!("Total sales by product and region:");
println!("{}\n", pivot1);
println!("--- Pivot: Dates (rows) × Products (columns) ---");
let pivot2 = sales_long
.pivot_table("date", "product", "sales", "sum")
.unwrap();
println!("Total sales by date and product:");
println!("{}\n", pivot2);
println!("--- Pivot with MEAN aggregation ---");
let pivot_mean = sales_long
.pivot_table("product", "region", "sales", "mean")
.unwrap();
println!("Average sales by product and region:");
println!("{}\n", pivot_mean);
println!("--- Pivot with COUNT aggregation ---");
let pivot_count = sales_long
.pivot_table("product", "region", "sales", "count")
.unwrap();
println!("Number of transactions by product and region:");
println!("{}\n", pivot_count);
println!("--- Pivot with MAX aggregation ---");
let pivot_max = sales_long
.pivot_table("date", "product", "sales", "max")
.unwrap();
println!("Maximum sales by date and product:");
println!("{}\n", pivot_max);
println!("\n=== MELT - Wide to Long Format ===\n");
let revenue_wide = DataFrame::builder()
.add_column("product", vec![1.0, 2.0, 3.0])
.add_column("Jan", vec![100.0, 150.0, 200.0])
.add_column("Feb", vec![120.0, 160.0, 210.0])
.add_column("Mar", vec![110.0, 170.0, 220.0])
.build()
.unwrap();
println!("Original data (WIDE format - spreadsheet style):");
println!("{}\n", revenue_wide);
println!("--- After MELT (long format) ---");
let revenue_long = revenue_wide
.melt(&["product"], None, "month", "revenue")
.unwrap();
println!("Melted data (better for analysis):");
println!("{}\n", revenue_long);
println!("\n=== REAL-WORLD EXAMPLE - Store Performance ===\n");
let store_sales = DataFrame::builder()
.add_column("store", vec![1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0])
.add_column(
"department",
vec![1.0, 2.0, 3.0, 1.0, 2.0, 3.0, 1.0, 2.0, 3.0],
)
.add_column(
"revenue",
vec![
1000.0, 1500.0, 2000.0, 1200.0, 1600.0, 2200.0, 900.0, 1400.0, 1900.0,
],
)
.add_column(
"customers",
vec![50.0, 75.0, 100.0, 60.0, 80.0, 110.0, 45.0, 70.0, 95.0],
)
.build()
.unwrap();
println!("Store performance data:");
println!("{}\n", store_sales);
println!("--- Revenue Matrix: Stores × Departments ---");
let revenue_matrix = store_sales
.pivot_table("store", "department", "revenue", "sum")
.unwrap();
println!("{}\n", revenue_matrix);
println!("--- Customer Matrix: Stores × Departments ---");
let customer_matrix = store_sales
.pivot_table("store", "department", "customers", "sum")
.unwrap();
println!("{}\n", customer_matrix);
println!("--- Average Revenue per Customer: Stores × Departments ---");
let avg_per_customer = store_sales
.pivot_table("store", "department", "revenue", "mean")
.unwrap();
println!("{}\n", avg_per_customer);
println!("\n=== ROUNDTRIP: Pivot → Melt → Original ===\n");
println!("1. Start with LONG format:");
let original = DataFrame::builder()
.add_column("id", vec![1.0, 1.0, 2.0, 2.0])
.add_column("category", vec![1.0, 2.0, 1.0, 2.0])
.add_column("value", vec![10.0, 20.0, 30.0, 40.0])
.build()
.unwrap();
println!("{}\n", original);
println!("2. Pivot to WIDE format:");
let pivoted = original
.pivot_table("id", "category", "value", "sum")
.unwrap();
println!("{}\n", pivoted);
println!("3. Melt back to LONG format:");
let melted = pivoted.melt(&["id"], None, "category", "value").unwrap();
println!("{}\n", melted);
println!("\n=== COMMON USE CASES ===\n");
println!("✅ PIVOT TABLE:");
println!(" - Sales reports (products × regions)");
println!(" - Time series analysis (dates × metrics)");
println!(" - Cross-tabulation (demographics × behavior)");
println!(" - Dashboard summaries");
println!(" - Excel-style pivot tables");
println!("\n✅ MELT:");
println!(" - Prepare spreadsheet data for analysis");
println!(" - Normalize denormalized data");
println!(" - Convert wide to long for plotting");
println!(" - Database import preparation");
println!(" - Time series from wide format");
println!("\n=== AGGREGATION FUNCTIONS AVAILABLE ===");
println!(" • sum - Total");
println!(" • mean - Average");
println!(" • count - Number of records");
println!(" • min - Minimum value");
println!(" • max - Maximum value");
println!(" • median - Middle value");
println!("\n=== Demo Complete! ===");
}