from __future__ import annotations import argparse from pathlib import Path from credexp.monitoring.drift import ( align_reference_and_current, build_drift_report, load_current_dataframe, load_reference_dataframe, save_drift_report, ) def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="Generate Evidently data drift report.") parser.add_argument( "--limit", type=int, default=5000, help="Number of latest production rows to pull from PostgreSQL.", ) parser.add_argument( "--output-html", type=str, default="reports/monitoring/evidently_drift.html", help="Output path for the HTML report.", ) parser.add_argument( "--output-meta", type=str, default="reports/monitoring/evidently_drift_meta.json", help="Output path for metadata JSON.", ) return parser.parse_args() def main() -> None: args = parse_args() reference_df = load_reference_dataframe() current_df = load_current_dataframe(limit=args.limit) reference_df, current_df = align_reference_and_current(reference_df, current_df) report = build_drift_report(reference_df, current_df) output_html = Path(args.output_html) output_meta = Path(args.output_meta) save_drift_report( report, output_html=output_html, output_meta_json=output_meta, n_reference=len(reference_df), n_current=len(current_df), n_features=len(reference_df.columns), ) print(f"Drift report saved to: {output_html}") print(f"Metadata saved to: {output_meta}") print(f"Reference rows: {len(reference_df)}") print(f"Current rows: {len(current_df)}") print(f"Common features: {len(reference_df.columns)}") if __name__ == "__main__": main()