Add report_generator/src/report_generator/core.py
This commit is contained in:
parent
4640adb334
commit
339b75d473
1 changed files with 80 additions and 0 deletions
80
report_generator/src/report_generator/core.py
Normal file
80
report_generator/src/report_generator/core.py
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
from __future__ import annotations
|
||||
import json
|
||||
from dataclasses import dataclass, asdict
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
import os
|
||||
|
||||
|
||||
@dataclass
|
||||
class DriftMetrics:
|
||||
warn_count: int
|
||||
fail_count: int
|
||||
total_runs: int
|
||||
window_size: int
|
||||
|
||||
def validate(self) -> None:
|
||||
assert isinstance(self.warn_count, int) and self.warn_count >= 0, "warn_count muss eine nicht-negative Ganzzahl sein."
|
||||
assert isinstance(self.fail_count, int) and self.fail_count >= 0, "fail_count muss eine nicht-negative Ganzzahl sein."
|
||||
assert isinstance(self.total_runs, int) and self.total_runs > 0, "total_runs muss eine positive Ganzzahl sein."
|
||||
assert isinstance(self.window_size, int) and self.window_size > 0, "window_size muss eine positive Ganzzahl sein."
|
||||
assert self.warn_count <= self.total_runs, "warn_count darf total_runs nicht überschreiten."
|
||||
|
||||
|
||||
@dataclass
|
||||
class DriftReport:
|
||||
warn_rate: float
|
||||
threshold: float
|
||||
alert: bool
|
||||
timestamp: str
|
||||
|
||||
|
||||
class InputValidationError(Exception):
|
||||
"""Wird ausgelöst, wenn Eingangsparameter ungültig sind."""
|
||||
pass
|
||||
|
||||
|
||||
def generate_report(warn_count: int, total_runs: int, threshold: float) -> str:
|
||||
"""Berechnet die Warnrate und erstellt einen Bericht über WARN-/FAIL-Raten in Drift-Analysen.
|
||||
|
||||
Args:
|
||||
warn_count (int): Anzahl der WARN-Ergebnisse im Rolling-Window.
|
||||
total_runs (int): Gesamtanzahl der Runs im betrachteten Rolling-Window.
|
||||
threshold (float): Schwellenwert, ab welcher WARN-Rate ein Alarm ausgelöst wird.
|
||||
|
||||
Returns:
|
||||
str: Pfad zur generierten Berichtdatei im JSON-Format.
|
||||
"""
|
||||
|
||||
# Input Validation
|
||||
if not isinstance(warn_count, int) or not isinstance(total_runs, int) or not isinstance(threshold, (int, float)):
|
||||
raise InputValidationError("Ungültige Typen für Eingabeparameter.")
|
||||
if total_runs <= 0:
|
||||
raise InputValidationError("total_runs muss größer als 0 sein.")
|
||||
if warn_count < 0 or warn_count > total_runs:
|
||||
raise InputValidationError("warn_count darf nicht negativ sein und total_runs nicht überschreiten.")
|
||||
if not (0 <= threshold <= 1):
|
||||
raise InputValidationError("threshold muss zwischen 0 und 1 liegen.")
|
||||
|
||||
# Berechnung
|
||||
warn_rate = warn_count / total_runs if total_runs > 0 else 0.0
|
||||
alert = warn_rate > threshold
|
||||
|
||||
# Bericht erstellen
|
||||
report = DriftReport(
|
||||
warn_rate=float(round(warn_rate, 4)),
|
||||
threshold=float(threshold),
|
||||
alert=alert,
|
||||
timestamp=datetime.now().isoformat(),
|
||||
)
|
||||
|
||||
# Zielpfad
|
||||
output_path = Path("output/drift_report.json")
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Schreiben im JSON-Format
|
||||
with output_path.open("w", encoding="utf-8") as f:
|
||||
json.dump(asdict(report), f, indent=2, ensure_ascii=False)
|
||||
|
||||
return str(output_path.resolve())
|
||||
Loading…
Reference in a new issue