Add off_by_3_fix/src/off_by_3_fix/core.py
This commit is contained in:
commit
8b1fcca4c9
1 changed files with 50 additions and 0 deletions
50
off_by_3_fix/src/off_by_3_fix/core.py
Normal file
50
off_by_3_fix/src/off_by_3_fix/core.py
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
import json
|
||||
import logging
|
||||
from typing import List, Dict
|
||||
|
||||
try:
|
||||
import trace_agg # vorhandenes Modul, falls für Analyse benötigt
|
||||
except ImportError:
|
||||
trace_agg = None # optionaler Fallback, falls Modul zur Laufzeit nicht vorhanden ist
|
||||
|
||||
|
||||
def fix_off_by_3(trace_data: List[Dict]) -> List[Dict]:
|
||||
"""Korrigiert den Off-By-3-Fehler in Trace-Daten.
|
||||
|
||||
Wandelt Float-Bucket-Grenzen in Integer-Buckets um, um Rundungsfehler
|
||||
bei der Gruppenaggregation zu vermeiden.
|
||||
|
||||
Args:
|
||||
trace_data: Liste von Trace-Daten mit möglichen Float-Buckets.
|
||||
|
||||
Returns:
|
||||
Liste von korrigierten Trace-Daten mit Integer-Buckets.
|
||||
"""
|
||||
if not isinstance(trace_data, list):
|
||||
raise ValueError("trace_data muss eine Liste von Dicts sein.")
|
||||
|
||||
corrected = []
|
||||
for entry in trace_data:
|
||||
if not isinstance(entry, dict):
|
||||
raise ValueError("Jeder Eintrag in trace_data muss ein Dict sein.")
|
||||
|
||||
group = entry.get("group")
|
||||
bucket = entry.get("bucket")
|
||||
value = entry.get("value")
|
||||
|
||||
if group is None or bucket is None or value is None:
|
||||
raise ValueError("Einträge müssen 'group', 'bucket' und 'value' enthalten.")
|
||||
|
||||
# Primäre Korrektur: Float-Grenzen in stabile Integer-Buckets umwandeln
|
||||
try:
|
||||
bucket_int = int(round(bucket))
|
||||
except (TypeError, ValueError):
|
||||
raise ValueError(f"Bucket-Wert ungültig: {bucket}")
|
||||
|
||||
corrected.append({
|
||||
"group": str(group),
|
||||
"bucket": bucket_int,
|
||||
"value": float(value)
|
||||
})
|
||||
|
||||
return corrected
|
||||
Loading…
Reference in a new issue