Excel oder CSV mit einer KI analysieren locale
Um eine Excel- oder CSV-Datei mit lokaler KI zu analysieren, müssen Sie die Additionen nicht dem Modell überlassen. Diese Anleitung teilt die Arbeit auf: pandas liest die Datei ein und rechnet, ein zweites Skript zählt auf einem anderen Weg nach, und anschließend kommentiert ein über Ollama bereitgestelltes Modell die bereits geprüften Ergebnisse. Der vollständige Code wird für eine CSV-Datei bereitgestellt, zusammen mit den Änderungen, die für eine Excel-Arbeitsmappe nötig sind. Ein eigener Abschnitt gibt genau an, was in der Praxis überprüft wurde und was nicht.
#Excel oder CSV mit einer lokalen KI analysieren: Wer rechnet, wer interpretiert
Eine Tabelle in eine Konversation einzufügen ist verlockend: Die Antwort kommt in ganzen Sätzen, mit Summen, die richtig aussehen. Doch ein LLM erzeugt plausiblen Text und führt keine Berechnung aus, wenn es eine Summe schreibt. Nichts in seiner Antwort unterscheidet eine richtige Zahl von einer falschen. Und je länger die Datei ist, desto eher droht sie den Kontext des Modells zu überschreiten, manchmal ohne klare Meldung.
Die hier vorgeschlagene Aufteilung ist einfach: Alles, was sich identisch neu berechnen lässt, übernimmt ein deterministisches Tool. Dieselbe Datei und dasselbe Skript liefern dasselbe Ergebnis, und dieses Ergebnis lässt sich überprüfen. Dem Modell bleibt, was es kann: Ergebnisse in Worte fassen, auf das hinweisen, was einen genaueren Blick verdient, und Fragen vorschlagen.
- Einlesen und validieren: pandas
- Vorhandene Spalten, leere Zellen, numerische Beträge, Datumsangaben im erwarteten Format. Das Skript bricht ab, statt zu raten.
- Berechnen: pandas
- Summen und Anteile pro Kategorie, in eine Datei faits.json geschrieben.
- Kontrollieren: nur Python
- Ein zweites Skript liest die Quelldatei ohne pandas erneut ein und zählt nach. Jede Abweichung blockiert die weiteren Schritte.
- Interpretieren: das lokale Modell
- Es erhält nur faits.json, nicht die Zeilen der Datei, und verfasst einen Kommentar, ohne selbst auch nur eine einzige Zahl zu schreiben.
- Entscheiden: Sie
- Eine Gesamtsumme belegt eine Summe, keine Ursache. Der Kommentar des Modells bleibt ein zu prüfender Hinweis.
#Unterschied zum Text-to-SQL-Tutorial
Profitiere von unserer Erfahrung und einem geführten Lernpfad, um deinen lokalen Assistenten zu erstellen und deine KI im Alltag zu nutzen.
- Lebenslanger Online-Zugang
- PDF + Dateien
- Erstattung binnen 30 Tagen
QuelLLM bietet bereits ein Tutorial zu lokalem Text-to-SQL an. Beide Anleitungen verhindern, dass das LLM Ergebnisse erfindet, weisen ihm aber nicht dieselbe Rolle zu. Die Wahl hängt vor allem von Ihrem Bedarf ab: unterschiedliche Fragen stellen oder eine bekannte Berechnung wiederholen.
- Text-to-SQL: Rolle des Modells
- Es schreibt die Abfrage anhand einer Frage auf Französisch. Die Datenbank führt diesen generierten Code anschließend aus, daher eine Rolle mit reinem Lesezugriff und eine Validierung des SQL.
- Diese Anleitung: Rolle des Modells
- Es schreibt keinen Code und führt nichts aus. Sie schreiben die Berechnung einmal, anschließend kommentiert das Modell ihr Ergebnis.
- Text-to-SQL: wann es die richtige Wahl ist
- Daten in PostgreSQL oder MySQL und häufig wechselnde Fragen.
- Diese Anleitung: Wann sie die richtige Wahl ist
- Ein Export oder eine Arbeitsmappe mit einer wiederkehrenden Berechnung: Monatsbilanz, Aufschlüsselung nach Kategorie, Ausgabenverfolgung.
- Grenzen dieser Anleitung
- Eine neue Frage erfordert eine Änderung des Skripts. Das ist der Preis für eine geprüfte und reproduzierbare Berechnung.
#Voraussetzungen und Beispieldatei
- Ollama
- Der Dienst muss unter http://localhost:11434 antworten. Die Installationsanleitung ist am Seitenende aufgeführt.
- Python
- Eine virtuelle Umgebung mit Python 3.11 oder neuer für pandas 3.
- Ein Modell
- Das Beispiel verwendet qwen3.5:9b, etwa 6,6 GB in Q4, also eine Größe, die auf eine RTX 3060 12GB passt. Es greift das Modell aus der Anleitung zu strukturierten Ausgaben auf; die Qualität seiner Kommentare zu tabellarischen Daten wurde hier nicht bewertet.
- Eine fiktive Datei
- Beginnen Sie mit der kleinen Datei unten. Ihre Summen können Sie im Kopf nachrechnen und so feststellen, ob der Aufbau funktioniert, bevor Sie echte Daten verwenden.
Dieses Format findet sich häufig in einem französischen Export: Semikolon zwischen den Spalten, Komma für Dezimalstellen, Datum als Tag/Monat/Jahr. Prüfen Sie Ihr eigenes Format in einem Texteditor, nicht in Excel, das die Anzeige umformatiert.
#Schritt 1: Mit pandas berechnen
Das Skript beschreibt das Dateiformat explizit und bricht lieber ab, als eine zweifelhafte Summe zu erzeugen. Die am 03.11.2026 eingesehene Dokumentation von pandas (Version 3.1.0) beschreibt die verwendeten Parameter: sep für das Trennzeichen, decimal für europäische Daten und on_bad_lines, dessen Standardwert „error“ bei einer fehlerhaften Zeile einen Fehler auslöst.
Zwei Entscheidungen bedürfen einer Erklärung. Erstens keep_default_na=False: Die Standardliste von pandas behandelt unter anderem NA, N/A und null als fehlende Werte. Eine als fehlend gelesene Kategorie „NA“ könnte jedoch ohne Warnung aus einer Gruppierung verschwinden. Zweitens werden Duplikate zwar gezählt, aber nicht entfernt: Zwei identische Käufe am selben Tag können legitim sein, und diese Entscheidung liegt bei Ihnen.
Für die Beispieldatei lässt sich das Ergebnis von Hand berechnen: A = 100 + 25 = 125, B = 50, also eine Summe von 175. Ihre Ausgabe muss den folgenden Werten entsprechen.
#Schritt 2: Auf anderem Weg nachzählen
Eine deterministische Berechnung kann auf vollkommen reproduzierbare Weise falsch sein: falsches Trennzeichen, falsch gelesene Spalte, vergessener Filter. Dieses zweite Skript vertraut pandas deshalb nicht: Es liest die Quelldatei mit den Standardmodulen csv und decimal erneut ein, zählt nach und vergleicht dann. Dabei handelt es sich um eine Kontrolle des Einlesens und der Addition. Sie sagt nichts darüber aus, ob die gewählte Berechnung Ihre Frage beantwortet.
Verketten Sie die Schritte mit &&: Schlägt einer fehl, startet der nächste nicht. Das Modell bekommt also niemals Ergebnisse zu sehen, die von der Kontrolle abgelehnt wurden.
#Schritt 3: Die Ergebnisse vom Modell interpretieren lassen
Das Modell erhält den Inhalt von faits.json und antwortet gemäß einem JSON-Schema, mit dem Parameter format von Ollama, der in der Anleitung zu strukturierten Ausgaben erklärt wird. Dieses Schema legt die Form der Antwort fest, nicht ihre Richtigkeit. Die wirksame Schutzvorkehrung liegt woanders: Das Modell sieht die Werte, um sie vergleichen zu können, muss sie aber über ihren Schlüssel zitieren. Die Funktion remplir weist jede direkt geschriebene Zahl sowie jeden erfundenen Schlüssel zurück.
Diese Schutzprüfung deckt nicht alles ab. Sie erkennt weder eine ausgeschriebene Zahl („dreimal so viel“) noch eine falsche Schlussfolgerung, die auf korrekten Werten aufbaut, etwa eine als gesichert dargestellte Ursache. Sie blockiert abgeschriebene oder erfundene Zahlen, die Prüfung durch einen Menschen bleibt aber notwendig. Wird eine Antwort abgelehnt, korrigieren Sie sie nicht von Hand: Starten Sie den Lauf neu oder formulieren Sie die Anweisung um, und dokumentieren Sie anschließend die Ablehnung.
Wenn nur Aggregate gesendet werden, schränkt das auch ein, was das Modell lesen kann: weder Kundennamen noch Freitext aus den Zeilen. Die Kategoriebezeichnungen werden jedoch weiterhin übermittelt und können schädlichen Text enthalten, wenn die Datei von außen stammt. Hier verfügt das Modell über kein Tool und kann nur Text erzeugen, was den möglichen Schaden begrenzt, ohne das Risiko zu beseitigen.
#Schritt 4: Eine Excel-Datei analysieren – was sich ändert
Bei einer .xlsx-Arbeitsmappe ändert sich in calculs.py nur das Einlesen: read_excel ersetzt read_csv, und die Parameter sep, decimal, encoding und on_bad_lines entfallen. Dieser Block wurde nicht mit einer Excel-Datei ausgeführt: Probieren Sie ihn zunächst mit einer kleinen Arbeitsmappe aus, deren Summen Sie kennen.
- Engine
- Laut Dokumentation 3.1.0 wird für .xlsx weiterhin standardmäßig openpyxl verwendet, allerdings ist angekündigt, dass diese Vorgabe in einer künftigen Version zu calamine wechseln soll. Wenn Sie die Engine explizit angeben, vermeiden Sie, dass sie bei einem Update unbemerkt wechselt.
- Feuille
- sheet_name ist standardmäßig 0, also das erste Tabellenblatt. Mit None oder einer Liste gibt read_excel ein Dictionary von Tabellen statt einer einzigen Tabelle zurück: Das obige Skript müsste dann angepasst werden.
- Kopfzeile
- Das Skript geht davon aus, dass die Spaltennamen in der ersten Zeile stehen. Steht ein Titel vor der Tabelle, verwenden Sie den Parameter header oder, besser noch, bereinigen Sie eine Kopie der Arbeitsmappe.
- Dates
- Wenn die Spalte echte Excel-Datumswerte enthält, betrifft das Format Tag/Monat/Jahr des Skripts sie nicht unbedingt. Prüfen Sie date_min und date_max in faits.json.
- Summenzeilen
- Eine Zeile „Total“ am Ende des Tabellenblatts würde als Kategorie gezählt und die Summe verdoppeln. Sie erscheint dann als Schlüssel in faits.json: Prüfen Sie diese Liste.
Die Kontrolle aus Schritt 2 liest eine CSV-Datei. Um sie beizubehalten, exportieren Sie das Tabellenblatt aus Excel (Speichern unter, Format CSV UTF-8) und führen dann python controle.py export.csv aus. Der Export läuft über Excel und nicht über die Lese-Engine von pandas: Das ist ein anderer Leseweg, und genau die Abweichungen sind es, nach denen gesucht wird. Prüfen Sie das Trennzeichen: Das Skript erwartet ein Semikolon. Ein mit seinem Anzeigeformat exportierter Betrag wie „1 250,00 €“ lässt die Kontrolle fehlschlagen, statt unbemerkt durchzugehen: Entfernen Sie dieses Format in der zu exportierenden Kopie. Auch ein in der Anzeige gerundetes Format kann eine Abweichung verursachen, die auf dieselbe Weise zu behandeln ist.
#Was überprüft wurde – und was nicht
Am 30.10.2026 wurde eine fiktive CSV-Datei mit pandas 3.0.2 eingelesen und aggregiert; die Kontrolle ergab A=125 und B=50. Das ist der einzige Praxisnachweis dieser Anleitung. Die obige Beispieldatei übernimmt diese Summen der Lesbarkeit halber, ohne dass dies die Funktionsfähigkeit der veröffentlichten Skripte belegt.
- Überprüft
- Einlesen und Aggregieren einer fiktiven CSV-Datei mit pandas 3.0.2, Summen A=125 und B=50 (30.10.2026).
- Gegengelesen, nicht ausgeführt
- Parameter von read_csv und read_excel in der pandas-Dokumentation 3.1.0, abgerufen am 03.11.2026. Sie ist neuer als die im Test verwendete Version: Prüfen Sie Ihre Version mit pip show pandas.
- Nicht verifiziert
- Vollständige Ausführung von calculs.py, controle.py und interpreter.py in ihrer veröffentlichten Form sowie die Ausgabewerte von faits.json: Die angegebenen Werte sind von Hand berechnet.
- Nicht verifiziert
- Jeder Aufruf eines LLM: Qualität der Kommentare, Einhaltung der Anweisung, Häufigkeit der Ablehnungen. Daher wird kein Antwortbeispiel gezeigt.
- Nicht verifiziert
- Jegliches Einlesen einer Excel-Datei, einschließlich Formeln und CSV-Export.
Hier finden sich weder Laufzeiten noch Fehlerquoten oder Modellvergleiche, da keine Messungen vorliegen. Betrachten Sie diese Skripte als Grundlage, die Sie zunächst mit der fiktiven Datei ausprobieren, bevor Sie Ihre eigenen Daten verwenden. Zu einem sinnvollen Test gehört auch, Fehlschläge gezielt herbeizuführen: Ändern Sie einen Betrag in faits.json, dann muss die Kontrolle das Ergebnis verweigern; geben Sie einen auszufüllenden Text vor, der eine Zahl enthält, dann muss die Antwort abgelehnt werden.
#Fehlerbehebung
- „Die Spalte montant enthält etwas anderes als Zahlen“
- Ein Währungssymbol, ein Text oder ein Tausendertrennzeichen ist noch vorhanden. Wenn die Datei ein Tausendertrennzeichen verwendet, ergänzen Sie read_csv um den Parameter thousands mit dem richtigen Zeichen. In französischen Dateien ist das oft ein geschütztes Leerzeichen, das mit bloßem Auge nicht zu erkennen ist. Die Kontrolle muss anschließend genau dieses Zeichen vor Decimal entfernen.
- Nur eine Spalte gelesen oder Spalten fehlen
- Das Trennzeichen ist falsch. Öffnen Sie die Datei in einem Texteditor und passen Sie sep in calculs.py und delimiter in controle.py an.
- UnicodeDecodeError
- Die Datei ist nicht UTF-8-kodiert. Ein alter Windows-Export liegt oft in cp1252 vor: Ändern Sie encoding in beiden Skripten und prüfen Sie anschließend die Akzente in den Kategorienamen.
- Fehler beim Datumsformat
- Ein Datum entspricht nicht dem Format Tag/Monat/Jahr. Korrigieren Sie den Wert oder passen Sie format an. Vermeiden Sie eine tolerante Konvertierung, die eine Vertauschung von Tag und Monat verschleiern kann.
- Inkonsistente Anteile
- Bei Rückerstattungen oder negativen Beträgen kann ein prozentualer Anteil 100 überschreiten oder seine Aussagekraft verlieren. Das Skript weist nicht darauf hin: Entfernen Sie diese Anteile in diesem Fall aus faits.json.
- Antwort bei jedem Versuch abgelehnt
- Das Modell schreibt die Werte trotz der Anweisung ab. Formulieren Sie die Anweisung um oder probieren Sie ein anderes Modell aus, ohne die Schutzvorkehrung zu entfernen.
- „Connection refused“ auf der Seite von Ollama
- Der Dienst ist nicht gestartet. Prüfen Sie dies mit ollama list und der Adresse http://localhost:11434.
#Weiterführende Informationen
Diese Anleitungen führen den Aufbau weiter: Text-to-SQL, wenn Ihre Daten in einer Datenbank liegen, strukturierte Ausgaben für den Parameter format und die Risiken durch versteckte Anweisungen in Dateien, die von außen stammen.
Haben Sie Feedback, einen Fehler entdeckt oder möchten Sie etwas präzisieren? Geben Sie uns Bescheid – so wird der Guide für alle besser.