This commit is contained in:
2025-06-19 06:55:05 +00:00
parent ff1e3904e3
commit 4f7f659f81

View File

@@ -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',