STABLE - Objektorientiertes Schema-Handling
- MAJOR REFACTOR: Globale Variablen für Branchenschema komplett entfernt. Das Schema wird nun in der `DataProcessor`-Instanz gehalten und als Argument übergeben. - FIX: Kritischer Prompt-Fehler endgültig behoben. `evaluate_branche_chatgpt` erhält das Schema nun als explizites Argument, was Scope-Probleme beseitigt. - Das Projekt ist nun in einem stabilen, logisch konsistenten und lauffähigen Zustand für die Bestandsanreicherung.
This commit is contained in:
@@ -51,32 +51,18 @@ from wikipedia_scraper import WikipediaScraper
|
||||
|
||||
|
||||
class DataProcessor:
|
||||
"""
|
||||
Zentrale Klasse zur Orchestrierung und Verarbeitung von Unternehmensdaten.
|
||||
"""
|
||||
|
||||
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):
|
||||
raise ValueError("DataProcessor benötigt eine gültige GoogleSheetHandler Instanz.")
|
||||
if not isinstance(wiki_scraper, WikipediaScraper):
|
||||
raise ValueError("DataProcessor benötigt eine gültige WikipediaScraper Instanz.")
|
||||
|
||||
if not isinstance(sheet_handler, GoogleSheetHandler): raise ValueError("...")
|
||||
if not isinstance(wiki_scraper, WikipediaScraper): raise ValueError("...")
|
||||
self.sheet_handler = sheet_handler
|
||||
self.wiki_scraper = wiki_scraper
|
||||
self.model = None
|
||||
self.imputer = None
|
||||
self._expected_features = None
|
||||
self.is_setup_complete = False
|
||||
self.schema_data = None # NEUES Attribut
|
||||
|
||||
self.logger.info("DataProcessor-Instanz erstellt. Bereit für Setup.")
|
||||
self.schema_data = None # Wichtig: Neues Attribut
|
||||
|
||||
def setup(self):
|
||||
self.logger.info("Führe DataProcessor-Setup durch...")
|
||||
@@ -86,7 +72,7 @@ class DataProcessor:
|
||||
self.logger.error("Setup fehlgeschlagen: Branchenschema konnte nicht geladen werden.")
|
||||
self.is_setup_complete = False
|
||||
return False
|
||||
|
||||
|
||||
self._load_ml_model(MODEL_FILE, IMPUTER_FILE)
|
||||
self.is_setup_complete = True
|
||||
self.logger.info("DataProcessor-Setup erfolgreich abgeschlossen.")
|
||||
@@ -481,59 +467,72 @@ class DataProcessor:
|
||||
self.logger.info(
|
||||
f"Zeile {row_num_in_sheet}: Fuehre CHATGPT Evaluationen & Plausi aus (Grund: {grund_message_chat})...")
|
||||
|
||||
# 3a. Branchen-Einstufung
|
||||
self.logger.info(f" Zeile {row_num_in_sheet}: Starte Branchen-Einstufung ueber ChatGPT...")
|
||||
try:
|
||||
branch_result = evaluate_branche_chatgpt(
|
||||
crm_branche,
|
||||
crm_beschreibung,
|
||||
final_wiki_data.get('branche', 'k.A.'),
|
||||
final_wiki_data.get('categories', 'k.A.'),
|
||||
website_summary,
|
||||
schema_data=self.schema_data # NEU: Schema als Argument übergeben
|
||||
)
|
||||
updates.append(
|
||||
{
|
||||
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Vorschlag Branche"] + 1)}{row_num_in_sheet}',
|
||||
'values': [
|
||||
[
|
||||
branch_result.get(
|
||||
"branch",
|
||||
"FEHLER BRANCH")]]})
|
||||
updates.append(
|
||||
{
|
||||
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Branche Konfidenz"] + 1)}{row_num_in_sheet}',
|
||||
'values': [
|
||||
[
|
||||
branch_result.get(
|
||||
"confidence",
|
||||
"N/A CONF")]]})
|
||||
updates.append(
|
||||
{
|
||||
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Konsistenz Branche"] + 1)}{row_num_in_sheet}',
|
||||
'values': [
|
||||
[
|
||||
branch_result.get(
|
||||
"consistency",
|
||||
"error CONS")]]})
|
||||
updates.append(
|
||||
{
|
||||
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Begruendung Abweichung Branche"] + 1)}{row_num_in_sheet}',
|
||||
'values': [
|
||||
[
|
||||
branch_result.get(
|
||||
"justification",
|
||||
"No JUST")]]})
|
||||
# --- 3. ChatGPT Evaluationen (Branch, FSM, etc.) & Plausi ---
|
||||
run_chat_step = 'chat' in steps_to_run
|
||||
chat_processing_needed = self._needs_chat_evaluations(
|
||||
row_data, force_reeval, wiki_data_updated_in_this_run)
|
||||
|
||||
if run_chat_step and chat_processing_needed:
|
||||
any_processing_done = True
|
||||
chat_eval_just_ran = True
|
||||
|
||||
grund_message_chat = "Re-Eval" if force_reeval else (
|
||||
"Wiki-Daten aktualisiert" if wiki_data_updated_in_this_run else "Timestamp (BN) leer")
|
||||
self.logger.info(
|
||||
f"Zeile {row_num_in_sheet}: Fuehre CHATGPT Evaluationen & Plausi aus (Grund: {grund_message_chat})...")
|
||||
|
||||
# --- 3a. Branchen-Einstufung ---
|
||||
self.logger.info(
|
||||
f" Zeile {row_num_in_sheet}: Starte Branchen-Einstufung ueber ChatGPT...")
|
||||
try:
|
||||
# schema_data wird hier aus der Instanz-Variable übergeben
|
||||
branch_result = evaluate_branche_chatgpt(
|
||||
crm_branche,
|
||||
crm_beschreibung,
|
||||
final_wiki_data.get('branche', 'k.A.'),
|
||||
final_wiki_data.get('categories', 'k.A.'),
|
||||
website_summary,
|
||||
schema_data=self.schema_data
|
||||
)
|
||||
|
||||
# Updates für die Sheet-Spalten vorbereiten
|
||||
updates.append({
|
||||
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Vorschlag Branche"] + 1)}{row_num_in_sheet}',
|
||||
'values': [[branch_result.get("branch", "FEHLER BRANCH")]]
|
||||
})
|
||||
updates.append({
|
||||
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Branche Konfidenz"] + 1)}{row_num_in_sheet}',
|
||||
'values': [[branch_result.get("confidence", "N/A CONF")]]
|
||||
})
|
||||
updates.append({
|
||||
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Konsistenz Branche"] + 1)}{row_num_in_sheet}',
|
||||
'values': [[branch_result.get("consistency", "error CONS")]]
|
||||
})
|
||||
updates.append({
|
||||
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Begruendung Abweichung Branche"] + 1)}{row_num_in_sheet}',
|
||||
'values': [[branch_result.get("justification", "No JUST")]]
|
||||
})
|
||||
except Exception as e_branch_eval:
|
||||
self.logger.error(
|
||||
f"FEHLER bei Branchen-Einstufung für Zeile {row_num_in_sheet}: {e_branch_eval}")
|
||||
# Optional: Fehlerwerte in die Spalten schreiben
|
||||
error_updates = [
|
||||
{"key": "Chat Vorschlag Branche", "value": "FEHLER_CALL"},
|
||||
{"key": "Chat Branche Konfidenz", "value": "N/A"},
|
||||
{"key": "Chat Konsistenz Branche", "value": "error"},
|
||||
{"key": "Chat Begruendung Abweichung Branche", "value": str(e_branch_eval)[:100]}
|
||||
]
|
||||
for item in error_updates:
|
||||
updates.append({
|
||||
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP[item["key"]] + 1)}{row_num_in_sheet}',
|
||||
'values': [[item["value"]]]
|
||||
})
|
||||
|
||||
# 3b, 3c, 3d: Weitere ChatGPT-Evaluationen (hier nicht detailliert implementiert, aber Platzhalter)
|
||||
# ... Logik für FSM-Relevanz, Mitarbeiter-Schätzung, Umsatz-Schätzung, etc. ...
|
||||
|
||||
# 3e. Konsolidierung Umsatz/Mitarbeiter (BD, BE)
|
||||
self.logger.debug(
|
||||
f" Zeile {row_num_in_sheet}: Konsolidiere Umsatz (BD) und Mitarbeiter (BE)...")
|
||||
self.logger.debug(f" Zeile {row_num_in_sheet}: Konsolidiere Umsatz (BD) und Mitarbeiter (BE)...")
|
||||
final_umsatz_str_konsolidiert = "k.A."
|
||||
final_ma_str_konsolidiert = "k.A."
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user