data_processor.py aktualisiert
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user