data_processor.py aktualisiert
This commit is contained in:
@@ -5021,61 +5021,6 @@ class DataProcessor:
|
|||||||
self.logger.info(
|
self.logger.info(
|
||||||
f"Parent Account Suggestion Batch abgeschlossen. {processed_count} Zeilen verarbeitet, {skipped_count} Zeilen übersprungen.")
|
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):
|
def _predict_technician_bucket(self, row_data):
|
||||||
"""
|
"""
|
||||||
Führt eine Vorhersage des Servicetechniker-Buckets für eine einzelne Zeile durch.
|
Führt eine Vorhersage des Servicetechniker-Buckets für eine einzelne Zeile durch.
|
||||||
|
|||||||
Reference in New Issue
Block a user