From 68bfd117b48236a516bb74770726f3985a92a2eb Mon Sep 17 00:00:00 2001 From: Floke Date: Thu, 19 Jun 2025 09:25:07 +0000 Subject: [PATCH] bugfix --- brancheneinstufung.py | 53 ++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 35dcf5e79..bef44a3ea 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -109,49 +109,42 @@ PATTERNS_FILE_TXT = "technician_patterns.txt" # Alt (Optional beibehalten) PATTERNS_FILE_JSON = "technician_patterns.json" # Neu (Empfohlen) def load_branch_mapping(file_path='Branchen.csv'): - """ - Lädt das Mapping von Detail-Branche zu Branchen-Gruppe aus einer CSV-Datei. - Behandelt UTF-8-BOM-Kodierung und normalisiert die Spaltennamen und Keys. - """ logger = logging.getLogger(__name__) - try: - # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - # +++ KORREKTUR: encoding='utf-8-sig' verwenden, um BOM zu behandeln +++ - # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - # Wir lesen jetzt alle Spalten ein und benennen sie dann um, was robuster ist - # als sich auf exakte Header-Namen in `usecols` zu verlassen. df_mapping = pd.read_csv(file_path, sep=';', encoding='utf-8-sig') - - # Spaltennamen bereinigen (entfernt BOM und andere unsichtbare Zeichen) df_mapping.columns = [str(col).strip() for col in df_mapping.columns] - - # Erwartete Spaltennamen (jetzt ohne BOM) - expected_cols = ['Branch Group', 'Branch'] - # Prüfen, ob die erwarteten Spalten nach der Bereinigung vorhanden sind + expected_cols = ['Branch Group', 'Branch'] if not all(col in df_mapping.columns for col in expected_cols): - logger.error(f"FEHLER: Die erwarteten Spalten {expected_cols} wurden in '{file_path}' nicht gefunden. " - f"Gefundene Spalten: {list(df_mapping.columns)}") + logger.error(f"FEHLER: Erwartete Spalten {expected_cols} in '{file_path}' nicht gefunden.") return {} - # Dictionary erstellen: { 'branch-detail-lowercase': 'Branch-Group' } + # Verwende die neue Normalisierungsfunktion für die Keys branch_map_dict = pd.Series( df_mapping['Branch Group'].str.strip().values, - index=df_mapping['Branch'].str.strip().str.lower() # Keys werden kleingeschrieben und bereinigt + index=df_mapping['Branch'].apply(normalize_for_mapping) # HIER ANWENDEN ).to_dict() - logger.info(f"Branchen-Mapping aus '{file_path}' erfolgreich geladen ({len(branch_map_dict)} Einträge).") + logger.info(f"Branchen-Mapping aus '{file_path}' geladen ({len(branch_map_dict)} Einträge).") return branch_map_dict - - except FileNotFoundError: - logger.error(f"FEHLER: Branchen-Mapping-Datei '{file_path}' nicht gefunden.") - return {} except Exception as e: - logger.error(f"FEHLER beim Laden oder Verarbeiten der Branchen-Mapping-Datei '{file_path}': {e}") - logger.debug(traceback.format_exc()) + logger.error(f"FEHLER beim Laden der Branchen-Mapping-Datei '{file_path}': {e}") return {} + +def normalize_for_mapping(text): + """ + Normalisiert einen String aggressiv für Mapping-Zwecke. + Entfernt Leerzeichen, macht alles klein, ersetzt gängige Sonderzeichen. + """ + if not isinstance(text, str): + return "" + text = text.lower() + text = text.strip() + # Ersetze gängige Trennzeichen und Varianten durch nichts, um sie zu ignorieren + text = re.sub(r'[\s/,-]+', '', text) + return text + # In Config-Klasse oder global aufrufen: BRANCH_MAPPING = load_branch_mapping() @@ -9149,7 +9142,9 @@ class DataProcessor: # --- Kategoriale Features vorbereiten (Branche) --- branche_col_internal = "branche_ki" # Name der Spalte mit den Detail-Branchen - self.logger.info(f"Verarbeite kategoriales Feature '{branche_col_internal}' (aus Spalte AL) und mappe es zu 'Branchen_Gruppe'...") + self.logger.info(f"Verarbeite kategoriales Feature '{branche_col_internal}' und mappe es zu 'Branchen_Gruppe'...") + + normalized_sheet_branches = df_filtered[branche_col_internal].apply(normalize_for_mapping) if branche_col_internal not in df_filtered.columns: self.logger.critical(f"FEHLER: Spalte '{branche_col_internal}' nicht im DataFrame gefunden.") @@ -9170,7 +9165,7 @@ class DataProcessor: # Erstelle eine normalisierte Version des Mapping-Dictionaries mapping_lower = {k.lower(): v for k, v in BRANCH_MAPPING.items()} # Wende dieses normalisierte Mapping auf die normalisierte Branchenspalte an - df_filtered.loc[:, 'Branchen_Gruppe'] = cleaned_branches.str.lower().map(mapping_lower).fillna('Sonstige') + df_filtered.loc[:, 'Branchen_Gruppe'] = normalized_sheet_branches.map(BRANCH_MAPPING).fillna('Sonstige') self.logger.info("Mapping zu 'Branchen_Gruppe' durchgeführt.")