Herzlich willkommen zum letzten Teil unserer Leitfadenreihe für den Projekt-Portfolio Kurs bei StackFuel! Nachdem du dich bereits mit VSCode, dem Terminal, dem Paketmanager UV und Git vertraut gemacht hast, geht es in diesem Leitfaden darum, all dieses Wissen zusammenzuführen und ein vollständiges Data Science Projekt aufzusetzen.
Ob du alleine oder in einer Gruppe arbeitest, ob du einen öffentlich verfügbaren Datensatz verwendest oder eigene Daten analysierst – dieser Leitfaden wird dir helfen, dein Projekt professionell zu strukturieren und zu verwalten, damit du dich auf das Wesentliche konzentrieren kannst: die Datenanalyse und die Erkenntnisse, die du daraus gewinnst.
Der erste Schritt bei jedem neuen Projekt ist die Erstellung einer isolierten Python-Umgebung (virtual environment). Mit UV geht das besonders einfach:
-
Erstelle zunächst einen neuen Projektordner und öffne diesen mit VSCode
-
Initialisiere eine neue virtuelle Umgebung mit UV indem du im eingbauten Terminal von VSCode folgenden Befehl ausführst:
uv initDieser Befehl legt eine Reihe von Dateien und Ordner in deinem Projektverzeichnis an. Schaue in den UV Guide um mehr über die Funktionsweise von UV zu erfahren.
Eine gut durchdachte Ordnerstruktur hilft dir dabei, den Überblick zu behalten und macht es anderen leichter, deinen Code zu verstehen. Hier ist eine bewährte Struktur für Data Science Projekte:
mein-data-science-projekt/
│
├── .venv/ # Virtuelle Umgebung (wird automatisch von UV erstellt)
│
├── data/ # Alle Datendateien
│ ├── raw/ # Rohdaten (unverändert)
│ ├── processed/ # Bereinigte und vorverarbeitete Daten
│ └── external/ # Externe Datenquellen (optional)
│
├── notebooks/ # Jupyter Notebooks für Exploration und Präsentation
│
├── src/ # Quellcode für die Verwendung im Projekt
│ ├── __init__.py # Macht src zu einem Python-Paket
│ ├── data/ # Skripte zum Herunterladen oder Generieren von Daten
│ ├── features/ # Skripte zur Feature-Erstellung/-Transformation
│ ├── models/ # Skripte zum Trainieren und Verwenden von Modellen
│ └── visualization/ # Skripte zur Visualisierung
│
├── tests/ # Testcode für src
│
├── .gitignore # Gibt an, welche Dateien nicht unter Versionskontrolle stehen
├── pyproject.toml # Wird von UV erstellt und enthält Projektabhängigkeiten
├── README.md # Projektbeschreibung und Nutzungsanleitung
├── .env # optional für Umgebungsvariablen (z.B. API-Keys, Passwörter, sollten nicht ins Repo)
└── setup.py # Falls du eine Installation deines Pakets ermöglichen möchtest
Du kannst diese Struktur direkt über VSCode erstellen, indem du die Ordner und Dateien manuell anlegst.
Diese Struktur ist flexibel – passe sie an die Bedürfnisse deines spezifischen Projekts an. Für kleine Projekte ist möglicherweise eine vereinfachte Version ausreichend.
Die .gitignore-Datei ist entscheidend, um zu verhindern, dass unnötige oder sensible Dateien ins Repository gelangen. Hier kannst du beliebige Dateien und Ordner angeben, die Git ignorieren soll. Dies ist besonders wichtig für große Dateien, temporäre Dateien oder Umgebungsdateien.
Hier ist ein Beispiel für eine gute .gitignore-Datei für Data Science Projekte. Du musst nicht alle Einträge verstehen, aber sie geben dir eine Vorstellung davon, was du ignorieren solltest:
# Virtuelle Umgebung
.venv/
venv/
ENV/
# Byte-kompilierte / optimierte / DLL-Dateien
__pycache__/
*.py[cod]
*$py.class
*.so
# Distribution / Packaging
dist/
build/
*.egg-info/
# Jupyter Notebook
.ipynb_checkpoints
# Daten (optional, je nach Projektanforderungen)
data/raw/
data/processed/
# Modelle (können groß sein)
*.pkl
*.h5
*.joblib
# Logs
logs/
*.log
# Environment-spezifische Dateien
.env
.env.local
*.env
# IDE-spezifische Dateien
.idea/
.vscode/
*.swp
*.swo
# Betriebssystem-spezifische Dateien
.DS_Store
Thumbs.db
Wichtig: Die Entscheidung, ob du Daten und Modelle in das Repository aufnehmen möchtest, hängt von verschiedenen Faktoren ab:
- Datengröße: Git ist nicht für große Dateien optimiert. Dateien über 100MB sollten normalerweise nicht ins Repository.
- Datenschutz: Sensible oder private Daten sollten nie in ein öffentliches Repository.
Empfehlung: Erstelle Skripte, die deine Daten herunterladen oder generieren, anstatt die Rohdaten selbst zu speichern. Ein Beispiel für ein solches Script findest du in unserem Referenzprojekt.
UV vereinfacht die Installation und Verwaltung von Python-Paketen für dein Projekt erheblich. Hier sind die wichtigsten Befehle:
Um ein neues Paket zu installieren und zur pyproject.toml hinzuzufügen:
uv add ipykernel pandas numpy matplotlib scikit-learnDieser Befehl installiert die angegebenen Pakete und aktualisiert automatisch deine pyproject.toml-Datei.
Hier ist eine Liste der gängigsten Bibliotheken für Data Science Projekte:
-
Datenmanipulation und -analyse:
pandas: Für Datenverarbeitung und -analysenumpy: Für numerische Berechnungen
-
Datenvisualisierung:
matplotlib: Grundlegende Visualisierungenseaborn: Statistik-Visualisierungen auf Basis von matplotlibplotly: Interaktive Grafikenbokeh: Interaktive Web-Visualisierungen
-
Machine Learning:
scikit-learn: Für klassische ML-Algorithmentensorflowoderpytorch: Für Deep Learningxgboostoderlightgbm: Für Gradient Boosting
-
Datenzugriff und -speicherung:
sqlalchemy: Allgemeine SQL-Datenbankinteraktionduckdb: Moderne SQL-Datenbank für Analyticspymongo: MongoDB-Zugriffpyarrowoderfastparquet: Parquet-Dateiformate
-
Statistik und wissenschaftliche Berechnungen:
scipy: Wissenschaftliche Berechnungenstatsmodels: Statistische Modelle und Tests
-
Projektunterstützung:
jupyter: Für Notebooks inklusive Jupyter Serveripykernel: Für Jupyter Notebooks in VSCodeipywidgets: Für interaktive Elemente in Notebookspytest: Für Testautomatisierungblackundruff: Für Code-Formatierung und Linting
Du wirst nur einen kleinen Teil dieser Pakete in deinem Projekt benötigen. Installiere nur die Pakete, die du tatsächlich verwendest, um die Größe deines Projekts zu minimieren.
Wenn du mit anderen zusammenarbeitest, ist es wichtig, dass alle Teammitglieder dieselben Pakete und Versionen verwenden.
- Installiere Pakete immer mit
uv add, damit sie in derpyproject.toml-Datei gespeichert werden. Du findest im Internet oft Beispiele, wie du Pakete mitpipinstallierst. Diese werden nicht in derpyproject.tomlgespeichert und sind daher nicht reproduzierbar. - Wenn du neue Pakete installiert hast und deine
pyproject.toml-Datei aktualisiert wurde, erstelle einen Commit zu dieser Änderung, pushe dein Projekt auf GitHub und teile dies deinem Team mit, damit sie ihre Umgebung synchronisieren können. - Teammitglieder können ihre Umgebung mit dem folgenden Befehl synchronisieren:
uv syncDieser Befehl installiert alle Pakete, die in der pyproject.toml-Datei aufgeführt sind, und stellt sicher, dass alle Teammitglieder dieselben Versionen verwenden.
Du bist mit der Arbeit an Jupyter Notebooks bereits aus unseren Trainings im DataLab vertraut. In der Softwareentwicklung und auch in der Data Science wird darüber hinaus mit normalen Python Scripten gearbeitet. Dies sind einfache Textdateien mit der Endung .py (Jupyter Notebooks haben die Endung .ipynb). Python Scripte können direkt vom Python Interpreter ausgeführt werden während für Jupyter Notebooks ein sogenannter Kernel installiert werden muss.
Jupyter Notebooks und Python-Skripte haben unterschiedliche Anwendungsbereiche und Vorteile. Hier ist ein Überblick, wann welches Format sinnvoll ist:
Jupyter Notebooks eignen sich besonders für:
- Explorative Datenanalyse: Wenn du Daten untersuchen und visualisieren möchtest, sind Notebooks ideal, da du Code und Ergebnisse direkt nebeneinander siehst.
- Dokumentation: Durch die Kombination von Markdown-Text und Code kannst du deine Analyse gut dokumentieren.
- Präsentationen: Notebooks eignen sich hervorragend, um Analysen und Ergebnisse zu präsentieren.
- Lernen und Unterrichten: Die interaktive Natur von Notebooks macht sie ideal für Lernzwecke.
- Prototyping: Schnelles Testen von Ideen und Konzepten.
Python-Skripte (.py) sind besser geeignet für:
- Produktionscode: Skripte lassen sich leichter in Produktionssysteme integrieren.
- Wiederverwendbare Module: Wenn du Code schreiben möchtest, der in anderen Projekten oder Scripten verwendet werden soll.
- Größere Projekte: Bei umfangreichen Projekten mit mehreren Dateien ist eine strukturierte Organisation mit Skripten übersichtlicher.
- Performance: Skripte werden in der Regel effizienter ausgeführt als Notebooks.
- Versionskontrolle: Python-Skripte sind einfacher mit Git zu verfolgen, da sie reiner Text sind.
- Automatisierung: Für regelmäßig laufende Tasks oder Batch-Verarbeitungen.
Für dein Projekt-Portfolio empfehlen wir einen hybriden Ansatz: Verwende Notebooks für die Exploration und Analyse deiner Daten und refaktoriere dann den Code in strukturierte Python-Module, wenn du eine wiederverwendbare Lösung erstellen möchtest.
Wenn du Jupyter Notebooks mit Git versionierst, ist es wichtig, die Ausgaben vor dem Commit zu bereinigen. Hier sind die Gründe dafür:
- Dateigröße: Notebooks mit vielen oder großen Ausgaben (besonders Grafiken) können das Repository unnötig aufblähen da die outputs mit in die Notebook-Datei geschrieben werden.
- Versionskontrolle: Änderungen in den Ausgaben erschweren es, die tatsächlichen Codeänderungen zu erkennen.
- Saubere Diff-Ansicht: Ohne Ausgaben sind die Unterschiede zwischen Versionen klarer erkennbar.
Es gibt mehrere Möglichkeiten, Notebook-Ausgaben zu bereinigen:
Manuell in VSCode:
- Öffne das Notebook in VSCode
- Klicke auf die drei Punkte (...) in der oberen Leiste
- Wähle "Clear All Outputs"
Wenn du in einer Gruppe arbeitest, ist ein strukturierter Git-Workflow besonders wichtig. Hier ist ein einfacher, aber effektiver Workflow:
Hinweis: Alle folgenden Schritte lassen sich auch direkt in VSCode über das Source Control Panel durchführen, siehe dazu hier. Zur einfacheren Dokumentation verwenden wir hier die Terminal-Befehle für Git.
-
Repository einrichten:
- Ein Teammitglied erstellt das Repository auf GitHub
- Dieses Mitglied fügt alle anderen als Collaborators hinzu (unter Settings > Collaborators)
- Jeder klont das Repository:
git clone [repository-url]
-
Feature-Branch-Workflow (Optional):
- Erstelle für jedes Feature oder jede Aufgabe einen neuen Branch:
git checkout -b feature/datenbereinigung - Arbeite an deinen Änderungen und committe regelmäßig:
git commit -m "Beschreibender Commit-Text" - Synchronisiere deinen Branch mit dem Remote-Repository:
git push origin feature/datenbereinigung - Wenn das Feature fertig ist, erstelle einen Pull Request auf GitHub
- Erstelle für jedes Feature oder jede Aufgabe einen neuen Branch:
-
Code Review und Merge:
- Ein anderes Teammitglied überprüft den Code im Pull Request
- Nach der Genehmigung wird der Branch in den Hauptbranch (main/master) gemergt
- Alle Teammitglieder aktualisieren ihre lokalen Repositories:
git pull origin main
Solltest du alleine Arbeiten oder nur ein kleines Team haben, kannst du auch direkt im
mainBranch arbeiten. In diesem Fall ist es wichtig, dass du regelmäßig deine Änderungen committest und pushst um Merge-Konflikte zu vermeiden.
Um sicherzustellen, dass alle Teammitglieder mit denselben Paketversionen arbeiten:
- Wenn ein Teammitglied ein neues Paket installiert:
uv add paketname pyproject.tomlpushen:git add pyproject.toml && git commit -m "Add new dependency" && git push- Andere Teammitglieder synchronisieren ihre Umgebung:
uv sync
Bei der gemeinsamen Arbeit an Jupyter Notebooks gibt es einige Herausforderungen:
-
Notebook-Konflikte vermeiden:
- Teile die Arbeit klar auf (z.B. verschiedene Notebooks für verschiedene Analysen)
- Vermeide es, gleichzeitig am selben Notebook zu arbeiten
-
Dokumentation und Kommentare:
- Verwende Markdown-Zellen ausgiebig, um deinen Code zu dokumentieren
- Füge Kommentare hinzu, die anderen Teammitgliedern helfen, deinen Code zu verstehen
-
Vermeide zu große Notebooks:
- Halte Notebooks klein und fokussiert
- Teile große Analysen in mehrere Notebooks auf
- Verwende Python-Skripte für wiederverwendbaren Code und importiere diese in Notebooks
Verwende Linting-Tools, um deinen Code sauber und konsistent zu halten:
uv add black ruffblack: Formatiert deinen Code automatischruff: Prüft deinen Code auf Fehler und Verbesserungsmöglichkeiten
Diese Tools kannst du in VSCode einrichten, sodass sie automatisch beim Speichern ausgeführt werden.
Random Seeds setzen:
import numpy as np
import random
import torch
# Setze Seeds für Reproduzierbarkeit
SEED = 42
random.seed(SEED)
np.random.seed(SEED)
torch.manual_seed(SEED)Datenpipelines dokumentieren:
- Speichere Zwischen- und Endversionen deiner Daten
- Dokumentiere jeden Transformationsschritt ausführlich
- Verwende Download Scipte für die Rohdaten und speichere die Daten in
data/raw/ - Verwende Scripte zum verarbeiten der Daten und speichere die verarbeiteten Daten in
data/processed/ - auf diese weise können andere deine Datenpipelines nachvollziehen und reproduzieren auch wenn der
dataOrdner nicht im Repository ist.
Eine gute README.md Datei ist entscheidend. Sie sollte enthalten:
- Projekttitel und -beschreibung
- Installation und Setup:
# Installation git clone https://github.com/username/projektname.git cd projektname uv init - Nutzung: Beispiele, wie das Projekt verwendet wird
- Datenquellen: Woher stammen die Daten, wie kann man sie erhalten
- Projektstruktur: Kurze Erklärung der Ordnerstruktur
- Teammitglieder: Bei Gruppenprojekten
Nachdem du dein Projekt aufgesetzt hast, stehen dir viele Wege offen:
-
Deployment deiner Modelle:
- Als REST-API mit FastAPI oder Flask
- Als Streamlit- oder Dash-Anwendung
-
Automatisierte Tests hinzufügen:
- Unit-Tests mit pytest
- Integration Tests für Datenpipelines
-
CI/CD-Pipeline einrichten:
- Automatisierte Tests bei jedem Push
- Automatisches Deployment deiner Anwendung
-
Kennzahlen und Monitoring:
- MLflow für Experiment-Tracking
- Prometheus/Grafana für Monitoring
Ein gut strukturiertes Projekt ist der Grundstein für erfolgreiche Data Science Arbeit. Mit den in diesem Leitfaden vorgestellten Werkzeugen und Methoden kannst du von Anfang an professionell arbeiten – egal ob allein oder im Team.
Denk daran, dass die perfekte Projektstruktur nicht existiert. Passe die Vorschläge an deine spezifischen Bedürfnisse und an die Größe deines Projekts an. Das Wichtigste ist, dass du und dein Team produktiv arbeiten können und eure Ergebnisse leicht reproduzierbar und verständlich sind.
Viel Erfolg bei deinem Data Science Projekt!