bugfix
This commit is contained in:
@@ -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)}")
|
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) ---
|
# --- Kategoriale Features vorbereiten (Branche) ---
|
||||||
branche_col_internal = "branche_ki" # << KORRIGIERT: Den neuen internen Namen verwenden
|
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) fuer One-Hot Encoding...")
|
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:
|
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
|
return None
|
||||||
|
|
||||||
# Greife auf 'branche_ki' zu und weise das Ergebnis auch wieder 'branche_ki' zu
|
# Bereinige die Branchennamen in der Spalte für das Mapping
|
||||||
df_filtered.loc[:, branche_col_internal] = df_filtered[branche_col_internal].astype(str).fillna('Unbekannt').str.strip()
|
# 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()
|
||||||
|
|
||||||
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
# Erstelle das Mapping-Dictionary ebenfalls bereinigt (idealerweise schon in load_branch_mapping)
|
||||||
# +++ NEU: Mapping von Detail-Branche zu Branch-Group +++++++++++++++++++
|
# Für jetzt gehen wir davon aus, BRANCH_MAPPING hat bereinigte Keys
|
||||||
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
# Wende das Mapping an. Wenn eine Branche nicht im Mapping ist, wird sie als 'Sonstige' oder 'Unbekannt' behandelt.
|
# Wende das Mapping an.
|
||||||
# Verwende das global geladene BRANCH_MAPPING Dictionary
|
# .map() ist case-sensitive. Um das zu umgehen, können wir die Keys des Mappings und die Werte in der Spalte normalisieren,
|
||||||
df_filtered.loc[:, 'Branchen_Gruppe'] = df_filtered[branche_col_internal].map(BRANCH_MAPPING).fillna('Sonstige')
|
# 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.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)}")
|
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 ++++++++++++++++++++++++++++++++++++++++++++++++++++
|
# +++ ENDE NEUER BLOCK ++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
# Verwende den korrekten internen Namen für das One-Hot Encoding
|
# One-Hot Encoding auf der neuen 'Branchen_Gruppe'-Spalte durchführen
|
||||||
df_encoded = pd.get_dummies(df_filtered, columns=[branche_col_internal], prefix='Branche', dummy_na=False)
|
df_encoded = pd.get_dummies(df_filtered, columns=['Branchen_Gruppe'], prefix='Gruppe', dummy_na=False) # << KORRIGIERT
|
||||||
self.logger.info(f"One-Hot Encoding fuer '{branche_col_internal}' durchgefuehrt...")
|
self.logger.info(f"One-Hot Encoding fuer 'Branchen_Gruppe' durchgefuehrt...")
|
||||||
|
|
||||||
# --- Finale Auswahl der Features fuer das Modell ---
|
# --- 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([
|
feature_columns_ml.extend([
|
||||||
'Log_Finaler_Umsatz_ML',
|
'Log_Finaler_Umsatz_ML',
|
||||||
'Log_Finaler_Mitarbeiter_ML',
|
'Log_Finaler_Mitarbeiter_ML',
|
||||||
|
|||||||
Reference in New Issue
Block a user