Vibe Coding eines privaten KI-Finanzanalysten mit Python und lokalen LLMs

Bild vom Autor
# Einführung
Letzten Monat schaute ich auf meinen Kontoauszug und versuchte herauszufinden, wohin mein Geld eigentlich floss. Tabellenkalkulationen schienen umständlich zu sein. Bestehende Apps sind wie Blackboxen und das Schlimmste ist, dass ich meine sensiblen Finanzdaten auf einen Cloud-Server hochladen muss. Ich wollte etwas anderes. Ich war auf der Suche nach einem KI-Datenanalysten, der meine Ausgaben analysieren, ungewöhnliche Transaktionen erkennen und mir klare Erkenntnisse liefern kann, während meine Daten gleichzeitig zu 100 % lokal bleiben. Also habe ich eins gebaut.
Was als Wochenendprojekt begann, entwickelte sich zu einem tiefen Einblick in die Vorverarbeitung realer Daten, praktisches maschinelles Lernen und die Leistungsfähigkeit selbst entwickelter Technologien. Die wichtigsten Sprachmodelle (LLM). In diesem Artikel erzähle ich Ihnen, wie ich mit eine KI-basierte Finanzanalyseanwendung erstellt habe Python mit „Vibe Coding“. Unterwegs lernen Sie viele praktische Konzepte kennen, die auf jedes Data-Science-Projekt anwendbar sind, unabhängig davon, ob Sie Verkaufsprotokolle, Sensordaten oder Kundenfeedback analysieren.
Am Ende werden Sie verstehen:
- So erstellen Sie eine robuste Datenvorverarbeitungspipeline, die reale, chaotische CSV-Dateien verarbeitet
- So wählen Sie Modelle für maschinelles Lernen aus und implementieren sie, wenn Sie nur über begrenzte Trainingsdaten verfügen
- So entwerfen Sie interaktive Visualisierungen, die tatsächlich Benutzerfragen beantworten
- So integrieren Sie ein lokales LLM, um Erkenntnisse in natürlicher Sprache zu generieren, ohne die Privatsphäre zu beeinträchtigen
Der vollständige Quellcode ist verfügbar unter GitHub. Sie können es gerne erstellen, erweitern oder als Ausgangspunkt für Ihren eigenen KI-Datenanalysten verwenden.

Abb. 1: App-Dashboard mit Ausgabenaufschlüsselung und KI-Einblicken | Bild vom Autor
# Das Problem: Warum ich das gebaut habe
Die meisten persönlichen Finanz-Apps haben einen grundlegenden Fehler: Ihre Daten liegen außerhalb Ihrer Kontrolle. Sie laden Kontoauszüge bei Diensten hoch, die Ihre Informationen speichern, verarbeiten und möglicherweise monetarisieren. Ich wollte ein Werkzeug, das:
- Lassen Sie mich Daten sofort herunterladen und analysieren
- Alles wurde lokal verarbeitet – keine Cloud, keine Datenlecks
- Bereitstellung KI-gestützter Erkenntnisse, nicht nur statischer Diagramme
Dieses Projekt war für mich die Möglichkeit, mehrere Konzepte zu erlernen, die jeder Datenwissenschaftler kennen sollte, wie den Umgang mit inkonsistenten Datenformaten, die Auswahl von Algorithmen, die mit kleinen Datensätzen arbeiten, und die Erstellung datenschutzschützender KI-Funktionen.
# Projektarchitektur
Bevor wir uns mit dem Code befassen, finden Sie hier eine Projektstruktur, die zeigt, wie die Teile zusammenpassen:
project/
├── app.py # Main Streamlit app
├── config.py # Settings (categories, Ollama config)
├── preprocessing.py # Auto-detect CSV formats, normalize data
├── ml_models.py # Transaction classifier + Isolation Forest anomaly detector
├── visualizations.py # Plotly charts (pie, bar, timeline, heatmap)
├── llm_integration.py # Ollama streaming integration
├── requirements.txt # Dependencies
├── README.md # Documentation with "deep dive" lessons
└── sample_data/
├── sample_bank_statement.csv
└── sample_bank_format_2.csv
Wir werden uns den Aufbau jeder Schicht Schritt für Schritt ansehen.
# Schritt 1: Erstellen Sie eine robuste Datenvorverarbeitungspipeline
Die erste Lektion, die ich gelernt habe, ist, dass reale Daten kompliziert sind. Verschiedene Banken exportieren CSVs in völlig unterschiedlichen Formaten. Chase Bank verwendet „Transaktionsdatum“ und „Betrag“. Die Bank of America verwendet separate Spalten „Datum“, „Zahlungsempfänger“ und „Lastschrift“ https://www.kdnuggets.com/„Credit“. Moniepoint und OPay haben jeweils ihren eigenen Stil.
Eine Vorverarbeitungspipeline sollte diese Unterschiede automatisch verarbeiten.
// Spaltenzuordnungen automatisch erkennen
Ich habe ein Mustervergleichssystem erstellt, das Spalten unabhängig von Namenskonventionen identifiziert. Mithilfe regulärer Ausdrücke können wir unklare Spaltennamen auf Standardfelder abbilden.
import re
COLUMN_PATTERNS = {
"date": (r"date", r"trans.*date", r"posting.*date"),
"description": (r"description", r"memo", r"payee", r"merchant"),
"amount": (r"^amount$", r"transaction.*amount"),
"debit": (r"debit", r"withdrawal", r"expense"),
"credit": (r"credit", r"deposit", r"income"),
}
def detect_column_mapping(df):
mapping = {}
for field, patterns in COLUMN_PATTERNS.items():
for col in df.columns:
for pattern in patterns:
if re.search(pattern, col.lower()):
mapping(field) = col
break
return mapping
Der Kerngedanke: Design für Unterschiede, nicht für bestimmte Formate. Dieser Ansatz funktioniert für jede CSV-Datei, die gängige Finanzbegriffe verwendet.
// Normalisierung auf ein Standardschema
Sobald die Spalten erkannt werden, werden wir normalisieren alles in einer zusammenhängenden Struktur. Beispielsweise sollten Banken, die Belastungen und Haben aufteilen, in einer einzigen Betragsspalte zusammengefasst werden (negativ für Ausgaben, positiv für Einnahmen):
if "debit" in mapping and "credit" in mapping:
debit = df(mapping("debit")).apply(parse_amount).abs() * -1
credit = df(mapping("credit")).apply(parse_amount).abs()
normalized("amount") = credit + debit
Zur Erinnerung: Standardisieren Sie Ihre Daten so schnell wie möglich. Es vereinfacht alle nachfolgenden Vorgänge, wie z. B. Feature-Engineering, Modellierung durch maschinelles Lernen und Visualisierung.

Abb. 2: Der Vorverarbeitungsbericht zeigt, was die Pipeline erkannt hat, und bietet Benutzern Transparenz | Bild vom Autor
# Schritt 2: Wählen Sie Modelle für maschinelles Lernen für begrenzte Daten
Die zweite große Herausforderung betrifft die begrenzten Trainingsdaten. Benutzer laden ihre eigenen Aussagen hoch und es gibt keinen umfangreichen beschrifteten Datensatz zum Trainieren eines Deep-Learning-Modells. Wir brauchen Algorithmen, die mit kleinen Stichproben gut funktionieren und durch einfache Regeln ergänzt werden können.
// Klassifizierung von Transaktionen: ein hybrider Ansatz
Anstelle von reinem maschinellem Lernen habe ich ein Hybridsystem aufgebaut:
- Regelbasierter Abgleich für sichere Fälle (z. B. Schlüsselwörter wie „WALMART“ → Lebensmittelgeschäft)
- Modellbasierter Fallback für mehrdeutige Transaktionen
SPENDING_CATEGORIES = {
"groceries": ("walmart", "costco", "whole foods", "kroger"),
"dining": ("restaurant", "starbucks", "mcdonald", "doordash"),
"transportation": ("uber", "lyft", "shell", "chevron", "gas"),
# ... more categories
}
def classify_transaction(description, amount):
for category, keywords in SPENDING_CATEGORIES.items():
if any(kw in description.lower() for kw in keywords):
return category
return "income" if amount > 0 else "other"
Dieser Ansatz funktioniert sofort, ohne Trainingsdaten und ist für Benutzer leicht zu verstehen und anzupassen.
// Anomalieerkennung: Warum ein Isolationswald?
Um ungewöhnliche Ausgaben zu erkennen, brauchte ich einen Algorithmus, der Folgendes konnte:
- Arbeiten Sie mit kleinen Datensätzen (im Gegensatz zu tiefes Lernen)
- Machen Sie keine Annahmen über die Verteilung der Daten (im Gegensatz zu statistischen Methoden wie dem Z-Score allein).
- Stellen Sie schnelle Vorhersagen für eine interaktive Benutzeroberfläche bereit
Isolierter Wald scikit-lernen hat alle Kriterien erfüllt. Es isoliert Anomalien durch zufällige Partitionierung der Daten. Da es nur wenige und unterschiedliche Anomalien gibt, sind für deren Isolierung weniger Abteilungen erforderlich.
from sklearn.ensemble import IsolationForest
detector = IsolationForest(
contamination=0.05, # Expect ~5% anomalies
random_state=42
)
detector.fit(features)
predictions = detector.predict(features) # -1 = anomaly
Ich habe dies auch mit einfachen Z-Score-Prüfungen kombiniert, um offensichtliche Ausreißer zu erkennen. A Z-Score beschreibt die Position eines Rohwerts in Bezug auf die Entfernung vom Mittelwert, gemessen in Standardabweichungen:
\(
z = \frac{x – \mu}{\sigma}
\)
Der kombinierte Ansatz erkennt mehr Anomalien als jede der beiden Methoden allein.
Zur Erinnerung: Manchmal übertreffen einfache, gut ausgewählte Algorithmen komplexe Algorithmen, insbesondere wenn Sie nur über begrenzte Daten verfügen.

Abb. 3: Anomaly Detector markiert ungewöhnliche Transaktionen, die in der Zeitleiste auffallen | Bild vom Autor
# Schritt 3: Entwerfen Sie Visualisierungen, die die Fragen beantworten
Visualisierungen sollten Fragen beantworten und nicht nur Daten anzeigen. Ich habe verwendet Boden für interaktive Diagramme, da es Benutzern ermöglicht, die Daten selbst zu erkunden. Hier sind die Designprinzipien, denen ich gefolgt bin:
- Einheitliche Farbkodierung: Rot für Ausgaben, Grün für Einnahmen
- Kontext durch Vergleich: Sehen Sie Einnahmen und Ausgaben nebeneinander
- Progressive Offenlegung: Zeigen Sie zuerst eine Zusammenfassung an und lassen Sie die Benutzer dann einen Drilldown durchführen
Für die Aufschlüsselung der Ausgaben wird beispielsweise ein Donut-Diagramm mit einem Loch in der Mitte verwendet, um eine klarere Darstellung zu gewährleisten:
import plotly.express as px
fig = px.pie(
category_totals,
values="Amount",
names="Category",
hole=0.4,
color_discrete_map=CATEGORY_COLORS
)
Stromlinienförmig erleichtert das Hinzufügen dieser Grafiken st.plotly_chart() und erstellen Sie ein responsives Dashboard.

Abb. 4: Mehrere Diagrammtypen bieten Benutzern unterschiedliche Perspektiven auf dieselben Daten | Bild vom Autor
# Schritt 4: Integrieren Sie ein großes lokales Sprachmodell für natürlichsprachliche Informationen
Das letzte Element generierte für Menschen lesbare Informationen. Ich habe mich für die Integration entschieden Ollamaein Tool zum lokalen Ausführen von LLMs. Warum vor Ort statt anrufen OpenAI Oder Claude?
- Vertraulichkeit: Bankdaten verlassen nie den Automaten
- Kosten: Unbegrenzte Anfragen, keine API-Gebühren
- Geschwindigkeit: Keine Netzwerklatenz (obwohl die Generierung noch einige Sekunden dauert)
// Streaming für ein besseres Benutzererlebnis
Es kann mehrere Sekunden dauern, bis LLMs eine Antwort generieren. Streamlit zeigt Token an, sobald sie eintreffen, was die Wartezeit verkürzt. Hier ist eine einfache Implementierung mit requests mit Verbreitung:
import requests
import json
def generate(self, prompt):
response = requests.post(
f"{self.base_url}/api/generate",
json={"model": "llama3.2", "prompt": prompt, "stream": True},
stream=True
)
for line in response.iter_lines():
if line:
data = json.loads(line)
yield data.get("response", "")
In Streamlit können Sie es mit anzeigen st.write_stream().
st.write_stream(llm.get_overall_insights(df))
// Schnelles Engineering für Finanzdaten
Der Schlüssel zu einem nützlichen LLM-Ergebnis ist eine strukturierte Eingabeaufforderung, die echte Daten enthält. Zum Beispiel:
prompt = f"""Analyze this financial summary:
- Total Income: ${income:,.2f}
- Total Expenses: ${expenses:,.2f}
- Top Category: {top_category}
- Largest Anomaly: {anomaly_desc}
Provide 2-3 actionable recommendations based on this data."""
Dadurch erhält das Modell konkrete Zahlen, mit denen es arbeiten kann, was zu relevanteren Informationen führt.

Abb. 5: Die Download-Oberfläche ist einfach; Wählen Sie eine CSV-Datei und lassen Sie die KI den Rest erledigen | Bild vom Autor
// Ausführen der Anwendung
Der Einstieg ist einfach. Sie müssen Python installieren und dann Folgendes ausführen:
pip install -r requirements.txt
# Optional, for AI insights
ollama pull llama3.2
streamlit run app.py
Laden Sie eine beliebige Bank-CSV-Datei hoch (die App erkennt das Format automatisch) und in Sekundenschnelle sehen Sie ein Dashboard mit kategorisierten Transaktionen, Anomalien und KI-generierten Erkenntnissen.
# Abschluss
Dieses Projekt hat mich gelehrt, dass der Aufbau von etwas Funktionalem nur der Anfang ist. Das wirkliche Lernen geschah, als ich fragte, warum jedes Stück funktionierte:
- Warum Spalten automatisch erkennen? Weil reale Daten nicht Ihrem Muster folgen. Die Schaffung einer flexiblen Pipeline erspart stundenlanges manuelles Reinigen.
- Wofür Isolationswald? Denn kleine Datensätze erfordern speziell für sie entwickelte Algorithmen. Sie brauchen nicht immer tiefes Lernen.
- Warum lokale LLMs? Weil Datenschutz und Kosten in der Produktion eine Rolle spielen. Das lokale Ausführen von Modellen ist jetzt bequem und leistungsstark.
Diese Lektionen gelten weit über die persönlichen Finanzen hinaus, unabhängig davon, ob Sie Verkaufsdaten, Serverprotokolle oder wissenschaftliche Kennzahlen analysieren. Die gleichen Prinzipien der robusten Vorverarbeitung, der pragmatischen Modellierung und der datenschutzfreundlichen KI werden Ihnen bei jedem Datenprojekt gute Dienste leisten.
Der vollständige Quellcode ist auf GitHub verfügbar. Forken Sie es, erweitern Sie es und passen Sie es an. Wenn du damit etwas Cooles baust, würde ich gerne davon hören.
// Referenzen
Shittu Olumid ist ein Software-Ingenieur und technischer Autor, der sich leidenschaftlich dafür einsetzt, modernste Technologien zu nutzen, um fesselnde Geschichten zu erstellen, mit einem scharfen Blick fürs Detail und einem Talent für die Vereinfachung komplexer Konzepte. Sie können Shittu auch auf finden Twitter.
