FD logo
Federico D'Ubaldi
Builder • Data • Automation • Web
Live • demo-first • reproducible

Smart Data Cleaning & Reporting

Da export sporchi (e-commerce/CRM) a dataset puliti + KPI + report, con pipeline riproducibile e quality checks.

Output: cleaned.csv + kpi.json + quality.json + report.md.

Python Data Quality Reporting CLI Tool

Preview output reali (quality.json)

data quality proof
Rows in
123.600
Rows out
118.772
Dropped
4828
Duplicates
3600

Top missing columns

top 5

Dataset pulito: nessun missing significativo rilevato.

Fonte: quality.json

Problema (real world)

Export CSV/Excel reali sono spesso incompleti, incoerenti e pieni di valori “sporchi”. Il rischio non è solo “sporcare il dataset”: è generare KPI sbagliate e decisioni sbagliate.

  • • colonne con nomi diversi o mancanti (schema drift)
  • • date in formati misti (YYYY-MM-DD / DD/MM/YYYY)
  • • numeri come stringhe, prezzi con virgola
  • • duplicati silenziosi che gonfiano i totali
  • • null sparsi e righe “rotte”

Soluzione (approccio)

Una pipeline “idiot-proof” che standardizza lo schema, normalizza i tipi, applica regole chiare di cleaning e produce output separati: dati puliti, KPI e report di qualità.

  • • parsing difensivo + normalizzazione tipi
  • • regole esplicite (drop motivati, dedup su chiavi)
  • • quality report leggibile (cosa è successo e perché)
  • • output “business-ready” per condivisione e audit

Live demo (real input → real output)

Input sporco + output pulito generati dalla pipeline. File pronti da scaricare.

Come riprodurre

Input (sporco)

Schema drift + date miste + prezzi con virgola + duplicati + missing (synthetic noise controllato).

Output (pulito + report)

Dataset pulito + KPI + quality summary + report leggibile.

kpi.json (real)

{
  "rows": 118772,
  "orders": 115620,
  "customers": 70171,
  "products": 17415,
  "total_value": 372620.57999999996,
  "avg_item_value": 3.1372762940760444,
  "aov": 3.222803840166062,
  "median_order_value": 3.05,
  "repeat_rate": 0.3652363511992133,
  "top_departments": [
    {
      "department": "produce",
      "items": 34453
    },
    {
      "department": "dairy eggs",
      "items": 20022
    },
    {
      "department": "snacks",
      "items": 10525
    },
    {
      "department": "beverages",
      "items": 9888
    },
    {
      "department": "frozen",
      "items": 8032
    }
  ]
}

quality.json (real)

{
  "rows": {
    "raw": 123600,
    "normalized": 123600,
    "clean": 118772,
    "dropped": 4828
  },
  "duplicates_removed": 3600,
  "missing_cells_raw": 3708,
  "missing_cells_clean": 120580,
  "top_missing_columns_clean": [
    {
      "column": "order_hour",
      "missing": 118772
    },
    {
      "column": "product_name",
      "missing": 617
    },
    {
      "column": "aisle",
      "missing": 596
    },
    {
      "column": "department",
      "missing": 595
    }
  ],
  "notes": [
    "Renamed column 'Order ID' -> 'order_id'",
    "Renamed column 'CustomerID' -> 'user_id'",
    "Renamed column 'OrderDate' -> 'order_date'",
    "Renamed column 'Unit Price' -> 'unit_price'",
    "Renamed column 'Order Value' -> 'order_value'",
    "Removed duplicates on (order_id, product_id): 3600",
    "Dropped rows missing critical fields ['order_id', 'user_id', 'product_id', 'order_date']: 614",
    "Dropped rows with invalid unit_price: 614",
    "Rows: 123600 -> 118772 (delta -4828)"
  ]
}

report.md (preview)

# Smart Data Cleaning + Reporting

## Execution summary
- Rows (raw): 123,600
- Rows (clean): 118,772
- Dropped: 4,828
- Duplicates removed (estimate): 3,600
- Missing cells (raw): 3,708
- Missing cells (clean): 120,580

## KPI snapshot
- **orders**: 115620
- **customers**: 70171
- **products**: 17415
- **total_value**: 372620.57999999996
- **aov**: 3.222803840166062
- **repeat_rate**: 0.3652363511992133

## Top departments (by items)
- produce: 34453
- dairy eggs: 20022
- snacks: 10525
- beverages: 9888
- frozen: 8032

## Data quality notes (top missing columns)
- order_hour: 118772
- product_name: 617

Cosa dimostra

  • • gestione schema variabile (colonne rinominate / mancanti)
  • • normalizzazione tipi (date miste, prezzi “1,47”, numeri come stringhe)
  • • dedup e drop rules esplicite (con motivazione)
  • • data quality checks misurabili (missing, duplicati, scarti)
  • • output “auditabile”: dati + KPI + quality + report separati
  • • design “idiot-proof”: messaggi chiari, niente crash incomprensibili

Come riprodurre

Comandi minimi per rigenerare input/output (dataset Kaggle escluso dal repo).

python tools/smart-data-cleaning/src/synth/sample_base.py
python tools/smart-data-cleaning/src/synth/inject_noise.py
python tools/smart-data-cleaning/src/run_pipeline.py

Tip: se vuoi rifare tutto da zero, rigenera anche la base con generate_clean_base.py.

Why this matters

Nei progetti reali, i dati “sporchi” raramente fanno crash: più spesso alterano i KPI in silenzio. Qui l’obiettivo è rendere la data quality esplicita, misurabile e riproducibile.

← Torna ai progetti