Spaces:
Runtime error
Runtime error
Download simulator/cli.py from autodrive/dq-simulator: direct link, hf CLI and curl.
- Browser
- Download file 5.43 kB
-
https://huggingface.co/spaces/autodrive/dq-simulator/resolve/main/simulator/cli.py
- Command line
-
hf download hf://spaces/autodrive/dq-simulator/simulator/cli.py
-
curl -L -o cli.py https://huggingface.co/spaces/autodrive/dq-simulator/resolve/main/simulator/cli.py
5.43 kB
| """CLI entry point.""" | |
| import sys | |
| import click | |
| from . import generator, injector, writer | |
| from .issues import REGISTRY, list_issues | |
| def cli(): | |
| """Data Quality Issue Simulator — generate synthetic user events with injected DQ issues.""" | |
| def list_issues_cmd(category, severity): | |
| """List all available data quality issues.""" | |
| issues = list_issues(category) | |
| if severity: | |
| issues = [i for i in issues if i.severity == severity] | |
| categories = {} | |
| for issue in issues: | |
| categories.setdefault(issue.category, []).append(issue) | |
| total = 0 | |
| for cat, cat_issues in sorted(categories.items()): | |
| click.echo(f"\n{'─'*60}") | |
| click.echo(f" {cat.upper().replace('_', ' ')} ({len(cat_issues)} issues)") | |
| click.echo(f"{'─'*60}") | |
| for i in cat_issues: | |
| sev_color = {"low": "white", "medium": "yellow", "high": "red", "critical": "bright_red"} | |
| sev = click.style(f"[{i.severity.upper():8s}]", fg=sev_color.get(i.severity, "white")) | |
| click.echo(f" {sev} {i.id}") | |
| click.echo(f" {i.description}") | |
| total += len(cat_issues) | |
| click.echo(f"\nTotal: {total} issues") | |
| def generate_cmd(rows, issues, exclude, category, severity, rate, output, | |
| glue_database, glue_table, region, seed, no_issues, quiet): | |
| """Generate synthetic user events and inject data quality issues.""" | |
| click.echo(f"\n{'='*60}") | |
| click.echo(f" DQ Issue Simulator") | |
| click.echo(f"{'='*60}") | |
| # 1. Generate clean data | |
| click.echo(f"\n[1/3] Generating {rows:,} clean user events (seed={seed}) ...") | |
| df = generator.generate(rows, seed=seed) | |
| click.echo(f" Shape: {df.shape[0]:,} rows × {df.shape[1]} columns") | |
| # 2. Inject issues | |
| if no_issues: | |
| applied = [] | |
| click.echo("\n[2/3] Skipping issue injection (--no-issues)") | |
| else: | |
| # Resolve issue list | |
| if issues.lower() == "all": | |
| issue_ids = None # let injector pick all | |
| else: | |
| issue_ids = [i.strip() for i in issues.split(",") if i.strip()] | |
| # Validate explicit issue IDs | |
| if issue_ids: | |
| for iid in issue_ids: | |
| if iid not in REGISTRY: | |
| click.echo(f"Error: unknown issue '{iid}'. Run 'list-issues' to see all.", err=True) | |
| sys.exit(1) | |
| exclude_ids = [i.strip() for i in exclude.split(",") if i.strip()] | |
| # Apply category/severity filters when using 'all' | |
| if issue_ids is None: | |
| filtered = list_issues(category) | |
| if severity: | |
| filtered = [i for i in filtered if i.severity == severity] | |
| issue_ids = [i.id for i in filtered] | |
| n_issues = len(issue_ids) - len([e for e in exclude_ids if e in (issue_ids or [])]) | |
| click.echo(f"\n[2/3] Injecting {n_issues} issues ...") | |
| df, applied = injector.inject( | |
| df, | |
| issue_ids=issue_ids, | |
| exclude_ids=exclude_ids or None, | |
| rate_override=rate, | |
| seed=seed, | |
| verbose=not quiet, | |
| ) | |
| click.echo(f"\n Applied: {len(applied)} issues | Final shape: {df.shape[0]:,} rows × {df.shape[1]} columns") | |
| # 3. Write output | |
| click.echo(f"\n[3/3] Writing parquet to: {output}") | |
| out_path = writer.write( | |
| df, | |
| output=output, | |
| glue_database=glue_database, | |
| glue_table=glue_table, | |
| region=region, | |
| ) | |
| click.echo(f" Written: {out_path}") | |
| if glue_database: | |
| click.echo(f" Glue table updated: {glue_database}.{glue_table}") | |
| click.echo(f"\n{'='*60}") | |
| click.echo(f" Done. {len(applied)} issues injected into {df.shape[0]:,} rows.") | |
| click.echo(f"{'='*60}\n") | |