gapura-ai / inspect_data.py
gapura-dev's picture
Gapura OneClick ML Service v2.2.0
3d54467
Raw
History Blame Contribute Delete
2.01 kB
"""
Fetch real data and print a full diagnostic report.
Run: python inspect_data.py
"""
import os, sys
from pathlib import Path
# Load .env
env_path = Path(__file__).parent / ".env"
if env_path.exists():
for line in env_path.read_text().splitlines():
line = line.strip()
if line and not line.startswith("#") and "=" in line:
k, v = line.split("=", 1)
os.environ.setdefault(k.strip(), v.strip())
import warnings; warnings.filterwarnings("ignore")
import pandas as pd
from data_fetcher import fetch_sheet
from schema_detector import detect_schema, validate_schema
print("Fetching from Google Sheets...")
df = fetch_sheet()
print(f"\n{'='*60}\nDATA OVERVIEW\n{'='*60}")
print(f"Total rows : {len(df)}")
print(f"Columns : {len(df.columns)}")
if "_sheet" in df.columns:
print(f"By tab : {df['_sheet'].value_counts().to_dict()}")
print(f"\n{'─'*60}\nCOLUMN NAMES\n{'─'*60}")
for c in df.columns:
null_pct = df[c].isna().mean() * 100
n_unique = df[c].nunique()
sample = df[c].dropna().astype(str).head(1).values
sample_s = sample[0][:60] if len(sample) else "(empty)"
print(f" {c:<40} null={null_pct:4.0f}% uniq={n_unique:4d} eg: {sample_s}")
schema = detect_schema(df)
schema = validate_schema(schema, df)
print(f"\n{'─'*60}\nAUTO-DETECTED SCHEMA\n{'─'*60}")
for role, col in schema.items():
print(f" {role:<15}{col}")
print(f"\n{'─'*60}\nLABEL DISTRIBUTIONS\n{'─'*60}")
for role in ["category", "subcategory", "root_cause", "status", "airline", "branch"]:
col = schema.get(role)
if col and col in df.columns:
vc = df[col].dropna().value_counts()
print(f"\n [{role}] — {col!r} ({len(vc)} unique values, {df[col].notna().sum()} non-null)")
for label, cnt in vc.head(15).items():
bar = "█" * min(int(cnt / max(vc) * 30), 30)
print(f" {str(label):<40} {cnt:4d} {bar}")
if len(vc) > 15:
print(f" ... ({len(vc)-15} more)")