Skip to main content

data_06_visual_readiness_summary/
data_06_visual_readiness_summary.rs

1//! # data_06 - Visual readiness summary
2//!
3//! Run: `cargo run -p matten-data --example data_06_visual_readiness_summary`
4//!
5//! ## What this shows
6//! A compact terminal summary of table-to-Tensor readiness: source columns,
7//! selected columns, left-out columns, missing counts, strict conversion, and
8//! the final row-major tensor values after explicit cleanup.
9
10use matten_data::{MattenDataError, Table};
11
12fn print_schema(summary: &matten_data::SchemaSummary) {
13    println!("rows             {}", summary.rows);
14    println!("columns          {}", summary.columns);
15    for col in summary.column_summaries() {
16        println!(
17            "column {:<8} kind={:<7} missing={}",
18            col.name, col.kind, col.missing
19        );
20    }
21}
22
23fn main() -> Result<(), MattenDataError> {
24    let csv = "\
25region,sales,cost,note
26north,100,40,ok
27south,150,,review
28east,120,55,ok";
29
30    let table = Table::from_csv_str(csv)?;
31    let source = table.schema_summary();
32
33    println!("== Source table ==");
34    println!("source columns   {:?}", table.column_names());
35    print_schema(&source);
36    assert_eq!(table.column_names(), &["region", "sales", "cost", "note"]);
37    assert_eq!(source.rows, 3);
38    assert_eq!(source.columns, 4);
39    assert_eq!(
40        source
41            .column_summaries()
42            .iter()
43            .find(|col| col.name == "cost")
44            .map(|col| col.missing),
45        Some(1)
46    );
47
48    println!();
49    println!("== Selection ==");
50    let selected = table.select_columns(["sales", "cost"])?;
51    println!("selected columns {:?}", selected.column_names());
52    println!("left out         [\"region\", \"note\"]");
53    assert_eq!(selected.column_names(), &["sales", "cost"]);
54
55    match selected.try_numeric() {
56        Err(MattenDataError::MissingValue { column, row }) => {
57            println!("strict numeric   Err: missing column={column}, csv_line={row}");
58            assert_eq!(column, "cost");
59            assert_eq!(row, 3);
60        }
61        other => panic!("expected MissingValue, got {other:?}"),
62    }
63
64    println!();
65    println!("== Explicit cleanup ==");
66    let filled = selected.fill_missing(0.0)?;
67    let numeric = filled.try_numeric()?;
68    println!("numeric rows     {}", numeric.row_count());
69    println!("numeric columns  {}", numeric.column_count());
70    println!("numeric names    {:?}", numeric.column_names());
71    assert_eq!(numeric.row_count(), 3);
72    assert_eq!(numeric.column_count(), 2);
73    assert_eq!(numeric.column_names(), &["sales", "cost"]);
74
75    let tensor = numeric.to_tensor()?;
76    println!("tensor shape     {:?}", tensor.shape());
77    println!("row-major values {:?}", tensor.as_slice());
78    assert_eq!(tensor.shape(), &[3, 2]);
79    assert_eq!(tensor.as_slice(), &[100.0, 40.0, 150.0, 0.0, 120.0, 55.0]);
80
81    println!();
82    println!("data_06_visual_readiness_summary: OK");
83    Ok(())
84}