data_processor.py aktualisiert

This commit is contained in:
2025-08-04 14:28:30 +00:00
parent 406285ebfc
commit a555a8d9a9

View File

@@ -5022,61 +5022,6 @@ class DataProcessor:
f"Parent Account Suggestion Batch abgeschlossen. {processed_count} Zeilen verarbeitet, {skipped_count} Zeilen übersprungen.")
def _predict_technician_bucket(self, row_data):
"""
Führt eine Vorhersage des Servicetechniker-Buckets für eine einzelne Zeile durch.
"""
company_name = self._get_cell_value_safe(row_data, 'CRM Name').strip()
self.logger.debug(
f"Versuche ML-Schaetzung fuer Zeile ({company_name[:50]}...)")
# Die Überprüfung findet jetzt in der setup() Methode statt.
if not self.is_setup_complete or self.model is None:
self.logger.error("ML-Modell nicht initialisiert. Setup nicht ausgeführt oder fehlgeschlagen. Überspringe Vorhersage.")
return "FEHLER Schaetzung (Setup fehlt)"
try:
# === Feature Erstellung (muss exakt zum Training passen!) ===
# 1. Konsolidierte numerische Werte holen
final_umsatz_val_str = self._get_cell_value_safe(
row_data, "Finaler Umsatz (Wiki>CRM)")
final_ma_val_str = self._get_cell_value_safe(
row_data, "Finaler Mitarbeiter (Wiki>CRM)")
umsatz_for_pred = get_numeric_filter_value(
final_umsatz_val_str, is_umsatz=True)
ma_for_pred = get_numeric_filter_value(
final_ma_val_str, is_umsatz=False)
umsatz_for_pred = np.nan if umsatz_for_pred == 0 else umsatz_for_pred
ma_for_pred = np.nan if ma_for_pred == 0 else ma_for_pred
# 2. 'is_part_of_group' Feature erstellen
parent_d_val = self._get_cell_value_safe(
row_data, "Parent Account Name").strip().lower()
parent_o_val = self._get_cell_value_safe(
row_data, "System Vorschlag Parent Account").strip().lower()
parent_p_val = self._get_cell_value_safe(
row_data, "Parent Vorschlag Status").strip().lower()
cond1_pred = bool(parent_d_val and parent_d_val != 'k.a.')
cond2_pred = bool(parent_o_val and parent_o_val !=
'k.a.' and parent_p_val == 'x')
is_group_val = 1 if cond1_pred or cond2_pred else 0
# 3. Zusätzliche Features (Ratio, Log) erstellen
# Log-Transformationen
log_umsatz_val = np.log1p(umsatz_for_pred) if pd.notna(
umsatz_for_pred) else np.nan
log_ma_val = np.log1p(ma_for_pred) if pd.notna(
ma_for_pred) else np.nan
# Umsatz pro MA
umsatz_pro_ma_val = np.nan
if pd.notna(umsatz_for_pred) and pd.notna(
ma_for_pred) and ma_for_pred > 0:
umsatz_pro_ma_val = umsatz_for_pred / ma_for_pred
return
def _predict_technician_bucket(self, row_data):
"""
Führt eine Vorhersage des Servicetechniker-Buckets für eine einzelne Zeile durch.
Die Feature-Erstellung ist exakt auf den Trainingsprozess abgestimmt.