From 4f7f659f8107bed6ec20441b4cfadc24a8cbab2c Mon Sep 17 00:00:00 2001 From: Floke Date: Thu, 19 Jun 2025 06:55:05 +0000 Subject: [PATCH] bugfix --- brancheneinstufung.py | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 4caeb6fe..8ee506aa 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -9124,23 +9124,29 @@ class DataProcessor: self.logger.info(f"Verteilung der neuen Techniker-Buckets:\n{df_filtered['Techniker_Bucket'].value_counts(normalize=True, dropna=False).sort_index().round(3)}") # --- Kategoriale Features vorbereiten (Branche) --- - branche_col_internal = "branche_ki" # << KORRIGIERT: Den neuen internen Namen verwenden - self.logger.info(f"Verarbeite kategoriales Feature '{branche_col_internal}' (aus Spalte AL) fuer One-Hot Encoding...") + 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'...") - # Sicherstellen, dass die Spalte existiert if branche_col_internal not in df_filtered.columns: - self.logger.critical(f"FEHLER: Spalte '{branche_col_internal}' nicht im DataFrame fuer One-Hot Encoding gefunden.") + self.logger.critical(f"FEHLER: Spalte '{branche_col_internal}' nicht im DataFrame gefunden.") return None - # Greife auf 'branche_ki' zu und weise das Ergebnis auch wieder 'branche_ki' zu - df_filtered.loc[:, branche_col_internal] = df_filtered[branche_col_internal].astype(str).fillna('Unbekannt').str.strip() + # Bereinige die Branchennamen in der Spalte für das Mapping + # Wichtig: .str.strip().str.title() oder .str.lower() anwenden, je nachdem wie das Mapping-Dict aufgebaut ist + cleaned_branches = df_filtered[branche_col_internal].astype(str).str.strip() - # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - # +++ NEU: Mapping von Detail-Branche zu Branch-Group +++++++++++++++++++ - # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - # Wende das Mapping an. Wenn eine Branche nicht im Mapping ist, wird sie als 'Sonstige' oder 'Unbekannt' behandelt. - # Verwende das global geladene BRANCH_MAPPING Dictionary - df_filtered.loc[:, 'Branchen_Gruppe'] = df_filtered[branche_col_internal].map(BRANCH_MAPPING).fillna('Sonstige') + # Erstelle das Mapping-Dictionary ebenfalls bereinigt (idealerweise schon in load_branch_mapping) + # Für jetzt gehen wir davon aus, BRANCH_MAPPING hat bereinigte Keys + + # Wende das Mapping an. + # .map() ist case-sensitive. Um das zu umgehen, können wir die Keys des Mappings und die Werte in der Spalte normalisieren, + # z.B. alles in Kleinbuchstaben. + + # Sicherere Methode: + # 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') self.logger.info("Mapping zu 'Branchen_Gruppe' durchgeführt.") self.logger.debug(f"Verteilung der Branchen-Gruppen:\n{df_filtered['Branchen_Gruppe'].value_counts(normalize=True).sort_index().round(3)}") @@ -9148,12 +9154,13 @@ class DataProcessor: # +++ ENDE NEUER BLOCK ++++++++++++++++++++++++++++++++++++++++++++++++++++ # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - # Verwende den korrekten internen Namen für das One-Hot Encoding - df_encoded = pd.get_dummies(df_filtered, columns=[branche_col_internal], prefix='Branche', dummy_na=False) - self.logger.info(f"One-Hot Encoding fuer '{branche_col_internal}' durchgefuehrt...") - + # One-Hot Encoding auf der neuen 'Branchen_Gruppe'-Spalte durchführen + df_encoded = pd.get_dummies(df_filtered, columns=['Branchen_Gruppe'], prefix='Gruppe', dummy_na=False) # << KORRIGIERT + self.logger.info(f"One-Hot Encoding fuer 'Branchen_Gruppe' durchgefuehrt...") + # --- Finale Auswahl der Features fuer das Modell --- - feature_columns_ml = [col for col in df_encoded.columns if col.startswith('Branche_')] + # Passe die Feature-Auswahl an, um die neuen Gruppen-Features zu verwenden + feature_columns_ml = [col for col in df_encoded.columns if col.startswith('Gruppe_')] # << KORRIGIERT feature_columns_ml.extend([ 'Log_Finaler_Umsatz_ML', 'Log_Finaler_Mitarbeiter_ML',