Spaces:
Running
Running
| import pandas as pd | |
| from pathlib import Path | |
| from datetime import datetime, timedelta | |
| import json | |
| from typing import Dict, Any | |
| class MonitoringReportGenerator: | |
| def __init__(self, monitoring_dir: Path): | |
| self.monitoring_dir = Path(monitoring_dir) | |
| self.monitoring_dir.mkdir(parents=True, exist_ok=True) | |
| def generate_daily_report(self, | |
| predictions_df: pd.DataFrame, | |
| drift_report: Dict[str, Any], | |
| performance_metrics: Dict[str, float]) -> Dict[str, Any]: | |
| """Generate comprehensive daily monitoring report""" | |
| report = { | |
| "report_date": datetime.now().strftime('%Y-%m-%d'), | |
| "generated_at": datetime.now().isoformat(), | |
| "predictions": { | |
| "total_predictions": len(predictions_df), | |
| "prediction_distribution": predictions_df['prediction'].value_counts().to_dict() if 'prediction' in predictions_df.columns else {} | |
| }, | |
| "drift": drift_report, | |
| "performance": performance_metrics, | |
| "status": "healthy" if not drift_report.get("drift_detected", False) else "warning" | |
| } | |
| report_path = self.monitoring_dir / f"report_{datetime.now().strftime('%Y%m%d')}.json" | |
| with open(report_path, 'w') as f: | |
| json.dump(report, f, indent=2) | |
| return report | |
| def get_weekly_summary(self) -> Dict[str, Any]: | |
| """Get summary of past week's monitoring data""" | |
| end_date = datetime.now() | |
| start_date = end_date - timedelta(days=7) | |
| reports = [] | |
| for i in range(7): | |
| date = (start_date + timedelta(days=i)).strftime('%Y%m%d') | |
| report_path = self.monitoring_dir / f"report_{date}.json" | |
| if report_path.exists(): | |
| with open(report_path, 'r') as f: | |
| reports.append(json.load(f)) | |
| if not reports: | |
| return {"status": "no_data", "period": "last_7_days"} | |
| return { | |
| "period": "last_7_days", | |
| "total_reports": len(reports), | |
| "days_with_drift": sum(1 for r in reports if r.get('drift', {}).get('drift_detected', False)), | |
| "avg_predictions_per_day": sum(r.get('predictions', {}).get('total_predictions', 0) for r in reports) / len(reports), | |
| "status": "healthy" if all(r.get('status') == 'healthy' for r in reports) else "needs_attention" | |
| } | |