diff --git a/data_processor.py b/data_processor.py index 8ed4a204..717c8b94 100644 --- a/data_processor.py +++ b/data_processor.py @@ -58,20 +58,15 @@ class DataProcessor: def __init__(self, sheet_handler, wiki_scraper): """ Initialisiert den DataProcessor mit Instanzen von Handler-Klassen. + Die eigentliche Konfiguration erfolgt in der setup() Methode. """ self.logger = logging.getLogger(__name__ + ".DataProcessor") self.logger.info("Initialisiere DataProcessor...") if not isinstance(sheet_handler, GoogleSheetHandler): - self.logger.critical( - "DataProcessor Init FEHLER: Kein gueltiger GoogleSheetHandler uebergeben!") - raise ValueError( - "DataProcessor benoetigt eine gueltige GoogleSheetHandler Instanz.") + raise ValueError("DataProcessor benötigt eine gültige GoogleSheetHandler Instanz.") if not isinstance(wiki_scraper, WikipediaScraper): - self.logger.critical( - "DataProcessor Init FEHLER: Kein gueltiger WikipediaScraper uebergeben!") - raise ValueError( - "DataProcessor benoetigt eine gueltige WikipediaScraper Instanz.") + raise ValueError("DataProcessor benötigt eine gültige WikipediaScraper Instanz.") self.sheet_handler = sheet_handler self.wiki_scraper = wiki_scraper @@ -79,18 +74,30 @@ class DataProcessor: self.model = None self.imputer = None self._expected_features = None + self.is_setup_complete = False - self.logger.info("DataProcessor initialisiert mit Handlern.") + self.logger.info("DataProcessor-Instanz erstellt. Bereit für Setup.") - self._step_status_map = { - 'wiki_verify': "Wiki Verif. Timestamp", - 'website_scrape': "Website Scrape Timestamp", - 'summarize_website': "Website Scrape Timestamp", - 'branch_eval': "Timestamp letzte Pruefung", - 'find_wiki_serp': "SerpAPI Wiki Search Timestamp", - 'contact_search': "Contact Search Timestamp", - 'wiki_updates_from_chatgpt': "Chat Wiki Konsistenzpruefung", - } + def setup(self): + """ + Führt die notwendigen Initialisierungen durch, die von externen Konfigurationen abhängen. + Muss nach Config.load_api_keys() aufgerufen werden. + """ + self.logger.info("Führe DataProcessor-Setup durch...") + # Lade das Branchenschema explizit. + schema_loaded = load_target_schema() + if not schema_loaded: + self.logger.error("Setup fehlgeschlagen: Branchenschema konnte nicht geladen werden.") + self.is_setup_complete = False + return False + + # Lade das ML-Modell. + self._load_ml_model(MODEL_FILE, IMPUTER_FILE) + # Überprüfen, ob das Modell geladen wurde, ist optional, da _load_ml_model bereits loggt. + + self.is_setup_complete = True + self.logger.info("DataProcessor-Setup erfolgreich abgeschlossen.") + return True def _get_cell_value_safe(self, row, column_key): """ @@ -5417,13 +5424,10 @@ class DataProcessor: self.logger.debug( f"Versuche ML-Schaetzung fuer Zeile ({company_name[:50]}...)") - if self.model is None or self.imputer is None or self._expected_features is None: - self.logger.info("Lade ML-Modell, Imputer und Feature-Spalten...") - self._load_ml_model(MODEL_FILE, IMPUTER_FILE) - if self.model is None or self.imputer is None or self._expected_features is None: - self.logger.error( - "Laden von Modell, Imputer oder Feature-Spalten fehlgeschlagen.") - return "FEHLER Schaetzung (Modell-Laden)" + # 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!) ===