From 46a7b6284860871850f0808abd612a030427e32c Mon Sep 17 00:00:00 2001 From: Floke Date: Tue, 1 Apr 2025 18:28:40 +0000 Subject: [PATCH] v1.2.7: Verbesserte numerische Bereinigung; robustere Umwandlung von Umsatz & Mitarbeiterzahlen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Verbesserte Numerische Extraktion: In extract_numeric_value werden nun führende Nicht-Ziffern entfernt. Es wird unterschieden, ob ein Komma als Dezimaltrennzeichen oder als Tausendertrenner genutzt wird. Dadurch werden Werte wie "2,395 Mrd. Euro" korrekt in 2395 Mio. Euro umgerechnet und Mitarbeiterzahlen wie "ca. 800" werden korrekt extrahiert. Erweiterte Debug-Ausgabe: Die bereinigten Vergleichswerte für CRM- und Wikipedia-Umsätze werden im Log ausgegeben, um Formatierungsprobleme schneller zu erkennen. Fallback-Handling: Bei fehlerhafter Umwandlung wird der Originaltext als Fallback zurückgegeben. --- brancheneinstufung.py | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 6414a8fe..c0e8df0f 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -14,7 +14,7 @@ import csv # ==================== KONFIGURATION ==================== class Config: - VERSION = "v1.2.6" # v1.2.6: Erweiterte String-Bereinigung und robustere Umwandlung von Umsatz/Mitarbeiterwerten + VERSION = "v1.2.7" # v1.2.7: Verbesserte numerische Extraktion für Umsatz und Mitarbeiterzahlen LANG = "de" CREDENTIALS_FILE = "service_account.json" SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo" @@ -72,34 +72,36 @@ def normalize_company_name(name): return normalized.lower() def extract_numeric_value(raw_value, is_umsatz=False): - # Erweiterte Vorverarbeitung: Entferne gängige Zusätze und unerwünschte Zeichen. raw_value = raw_value.strip() if not raw_value: return "k.A." - # Entferne häufige Zusätze + # Entferne gängige Zusätze raw_value = re.sub(r'\b(ca\.?|circa|etwa|über|rund)\b', '', raw_value, flags=re.IGNORECASE) - # Entferne unnötige Leerzeichen und Sonderzeichen raw_value = raw_value.replace("\xa0", " ").strip() - raw = raw_value.lower() - match = re.search(r'([\d.,]+)', raw, flags=re.UNICODE) - if not match or not match.group(1).strip(): + # Entferne führende Nicht-Ziffern + num_str = re.sub(r'^[^\d]+', '', raw_value) + # Extrahiere die Zahl (Ziffern, Komma und Punkt) + match = re.search(r'([\d.,]+)', num_str) + if not match: debug_print(f"Keine numerischen Zeichen gefunden im Rohtext: '{raw_value}'") return "k.A." num_str = match.group(1) - # Prüfe, ob Komma als Dezimaltrennzeichen genutzt wird (deutsches Format) - if ',' in num_str and num_str.count(',') == 1 and len(num_str.split(',')[1]) <= 2: - num_str = num_str.replace('.', '').replace(',', '.') + # Prüfe, ob ein einzelnes Komma als Dezimaltrennzeichen verwendet wird (wenn kein Punkt vorhanden) + if ',' in num_str and '.' not in num_str and len(num_str.split(',')[1]) <= 2: + num_str = num_str.replace(',', '.') else: - num_str = num_str.replace(' ', '').replace('.', '') + # Entferne alle Kommas als Tausendertrennzeichen + num_str = num_str.replace(',', '') try: num = float(num_str) except Exception as e: debug_print(f"Fehler bei der Umwandlung von '{num_str}' (Rohtext: '{raw_value}'): {e}") return raw_value if is_umsatz: - if "mrd" in raw or "milliarden" in raw: + raw_lower = raw_value.lower() + if "mrd" in raw_lower or "milliarden" in raw_lower: num *= 1000 - elif "mio" in raw or "millionen" in raw: + elif "mio" in raw_lower or "millionen" in raw_lower: pass else: num /= 1e6 @@ -402,11 +404,6 @@ class DataProcessor: if i >= self.sheet_handler.get_start_index(): self._process_single_row(i, row) def _process_single_row(self, row_num, row_data): - # Neues Schema: - # B: Firmenname, C: Website, CRM-Umsatz in Spalte I (Index 8) - # Wikipedia-Daten: Spalten K bis Q - # ChatGPT Umsatz in Spalte AF, Vergleich in Spalte AG, - # Timestamp in Spalte AH, Version in Spalte AI. company_name = row_data[1] if len(row_data) > 1 else "" website = row_data[2] if len(row_data) > 2 else "" wiki_update_range = f"K{row_num}:Q{row_num}" @@ -429,7 +426,7 @@ class DataProcessor: 'full_infobox': 'k.A.' } wiki_values = [ - "k.A.", # Vorschlag Wiki URL + "k.A.", # Vorschlag Wiki URL (spalte K) company_data.get('url', 'k.A.'), company_data.get('first_paragraph', 'k.A.'), company_data.get('branche', 'k.A.'), @@ -438,15 +435,13 @@ class DataProcessor: company_data.get('categories', 'k.A.') ] self.sheet_handler.sheet.update(values=[wiki_values], range_name=wiki_update_range) - time.sleep(1) # 1 Sekunde Pause, um sicherzustellen, dass die Daten gespeichert wurden - # ChatGPT API: Umsatzbewertung + time.sleep(1) # 1 Sekunde Pause für Datensynchronisation wiki_umsatz = company_data.get('umsatz', 'k.A.') if wiki_umsatz != "k.A.": chatgpt_umsatz = evaluate_umsatz_chatgpt(company_name, wiki_umsatz) else: chatgpt_umsatz = "k.A." self.sheet_handler.sheet.update(values=[[chatgpt_umsatz]], range_name=chatgpt_range) - # Umsatz-Abgleich: CRM-Umsatz (Spalte I) vs. Wikipedia-Umsatz crm_umsatz = row_data[8] if len(row_data) > 8 else "k.A." debug_print(f"Bereinigte Vergleichswerte vor Umwandlung: CRM Umsatz: '{crm_umsatz}', Wiki Umsatz: '{wiki_umsatz}'") abgleich_result = compare_umsatz_values(crm_umsatz, wiki_umsatz)