Compare commits

...

4 Commits

Author SHA1 Message Date
weygoldt
5545b0623a added additional formats to gitignore (for safety purposes) 2024-10-18 15:31:25 +02:00
weygoldt
e2c773491a fixed link to german version 2024-10-18 15:24:07 +02:00
weygoldt
082bd27d0a deleted wrong german version 2024-10-18 15:23:37 +02:00
weygoldt
4696fdc701 added german versions 2024-10-18 15:21:58 +02:00
7 changed files with 742 additions and 5 deletions

413
.gitignore vendored
View File

@@ -1,4 +1,315 @@
# ---> Python
### LaTeX ###
## Core latex/pdflatex auxiliary files:
*.aux
*.lof
*.log
*.lot
*.fls
*.out
*.toc
*.fmt
*.fot
*.cb
*.cb2
.*.lb
## Intermediate documents:
*.dvi
*.xdv
*-converted-to.*
# these rules might exclude image files for figures etc.
# *.ps
# *.eps
# *.pdf
## Generated if empty string is given at "Please type another file name for output:"
.pdf
## Bibliography auxiliary files (bibtex/biblatex/biber):
*.bbl
*.bcf
*.blg
*-blx.aux
*-blx.bib
*.run.xml
## Build tool auxiliary files:
*.fdb_latexmk
*.synctex
*.synctex(busy)
*.synctex.gz
*.synctex.gz(busy)
*.pdfsync
## Build tool directories for auxiliary files
# latexrun
latex.out/
## Auxiliary and intermediate files from other packages:
# algorithms
*.alg
*.loa
# achemso
acs-*.bib
# amsthm
*.thm
# beamer
*.nav
*.pre
*.snm
*.vrb
# changes
*.soc
# comment
*.cut
# cprotect
*.cpt
# elsarticle (documentclass of Elsevier journals)
*.spl
# endnotes
*.ent
# fixme
*.lox
# feynmf/feynmp
*.mf
*.mp
*.t[1-9]
*.t[1-9][0-9]
*.tfm
#(r)(e)ledmac/(r)(e)ledpar
*.end
*.?end
*.[1-9]
*.[1-9][0-9]
*.[1-9][0-9][0-9]
*.[1-9]R
*.[1-9][0-9]R
*.[1-9][0-9][0-9]R
*.eledsec[1-9]
*.eledsec[1-9]R
*.eledsec[1-9][0-9]
*.eledsec[1-9][0-9]R
*.eledsec[1-9][0-9][0-9]
*.eledsec[1-9][0-9][0-9]R
# glossaries
*.acn
*.acr
*.glg
*.glo
*.gls
*.glsdefs
*.lzo
*.lzs
*.slg
*.slo
*.sls
# uncomment this for glossaries-extra (will ignore makeindex's style files!)
# *.ist
# gnuplot
*.gnuplot
*.table
# gnuplottex
*-gnuplottex-*
# gregoriotex
*.gaux
*.glog
*.gtex
# htlatex
*.4ct
*.4tc
*.idv
*.lg
*.trc
*.xref
# hyperref
*.brf
# knitr
*-concordance.tex
# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files
# *.tikz
*-tikzDictionary
# listings
*.lol
# luatexja-ruby
*.ltjruby
# makeidx
*.idx
*.ilg
*.ind
# minitoc
*.maf
*.mlf
*.mlt
*.mtc[0-9]*
*.slf[0-9]*
*.slt[0-9]*
*.stc[0-9]*
# minted
_minted*
*.pyg
# morewrites
*.mw
# newpax
*.newpax
# nomencl
*.nlg
*.nlo
*.nls
# pax
*.pax
# pdfpcnotes
*.pdfpc
# sagetex
*.sagetex.sage
*.sagetex.py
*.sagetex.scmd
# scrwfile
*.wrt
# svg
svg-inkscape/
# sympy
*.sout
*.sympy
sympy-plots-for-*.tex/
# pdfcomment
*.upa
*.upb
# pythontex
*.pytxcode
pythontex-files-*/
# tcolorbox
*.listing
# thmtools
*.loe
# TikZ & PGF
*.dpth
*.md5
*.auxlock
# titletoc
*.ptc
# todonotes
*.tdo
# vhistory
*.hst
*.ver
# easy-todo
*.lod
# xcolor
*.xcp
# xmpincl
*.xmpi
# xindy
*.xdy
# xypic precompiled matrices and outlines
*.xyc
*.xyd
# endfloat
*.ttt
*.fff
# Latexian
TSWLatexianTemp*
## Editors:
# WinEdt
*.bak
*.sav
# Texpad
.texpadtmp
# LyX
*.lyx~
# Kile
*.backup
# gummi
.*.swp
# KBibTeX
*~[0-9]*
# TeXnicCenter
*.tps
# auto folder when using emacs and auctex
./auto/*
*.el
# expex forward references with \gathertags
*-tags.tex
# standalone packages
*.sta
# Makeindex log files
*.lpz
# xwatermark package
*.xwm
# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib
# option is specified. Footnotes are the stored in a file with suffix Notes.bib.
# Uncomment the next line to have this generated file ignored.
#*Notes.bib
### LaTeX Patch ###
# LIPIcs / OASIcs
*.vtc
# glossaries
*.glstex
### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
@@ -57,7 +368,6 @@ cover/
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
@@ -160,3 +470,102 @@ cython_debug/
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
### Python Patch ###
# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
poetry.toml
# ruff
.ruff_cache/
# LSP config files
pyrightconfig.json
# Audio files
*.mp3
*.wav
*.flac
*.aac
*.ogg
*.m4a
*.wma
# Video files
*.mp4
*.mov
*.avi
*.mkv
*.flv
*.wmv
*.webm
*.mpeg
*.mpg
*.m4v
# Image files
*.jpg
*.jpeg
*.png
*.gif
*.bmp
*.tiff
*.tif
*.svg
*.webp
# RAW image formats
*.cr2
*.nef
*.arw
*.dng
*.rw2
# Video project files (optional)
*.proj
*.prproj
*.aep
*.veg
*.imovieproj
# 3D Model and animation formats (optional)
*.obj
*.fbx
*.dae
*.blend
*.3ds
*.stl
# Word processor documents
*.doc
*.docx
*.odt
*.rtf
*.wps
# Spreadsheet documents
*.xls
*.xlsx
*.ods
*.csv
# Presentation documents
*.ppt
*.pptx
*.odp
# PDF files
*.pdf
# Other office-related formats
*.pub
*.vsd
*.vsdx
*.key
*.numbers
*.pages
# Archive and compressed files (optional, in case they generate them)
*.zip
*.rar
*.tar
*.gz
*.7z

View File

@@ -1,6 +1,6 @@
# Data Analysis Structure Guide
**German version**: [README_DE.md](README_DE.md)
**German version**: [README_DE.md](README_de.md)
Welcome to our Project Structure Guide! This guide is designed to
help new students understand how to structure data analysis projects in Python

View File

@@ -1,5 +1,7 @@
# Writing a Good Python Script: A Primer
German version: [README_de.md](README_de.md)
This primer will guide you through best practices to write effective and clean
Python scripts. Whether you're working on a data processing pipeline, a machine
learning model, or a simple utility script, following these guidelines will

275
code/README_de.md Normal file
View File

@@ -0,0 +1,275 @@
# Ein Leitfaden zum Schreiben eines guten Python-Skripts
Dieser Leitfaden hilft dir dabei, effektive und saubere Python-Skripte zu schreiben. Egal, ob du an einer Datenverarbeitungspipeline, einem Machine-Learning-Modell oder einem einfachen Hilfsskript arbeitest wenn du diese Richtlinien befolgst, erstellst du lesbaren code, der leicht zu warten und zu erweitern ist.
## 1. Verwende einen aussagekräftigen und deklarativen Skriptnamen
Wähle einen Skriptnamen, der klar beschreibt, was das Skript tut. So ist es für andere (und dich selbst) einfacher zu verstehen, was das Skript macht, ohne den Code lesen zu müssen.
**Beispiele:**
- `datenbereinigung.py` statt `skript1.py`
- `bericht_generieren.py` statt `run.py`
## 2. Beginne mit einer kurzen Erklärung (Docstring)
Füge am Anfang deines Skripts einen Docstring ein, der kurz erklärt, was das Skript macht. Das hilft Nutzern, die Funktionalität des Skripts schnell zu erfassen.
```python
"""
Dieses Skript lädt Rohdaten, bereinigt sie durch Entfernen von Nullwerten und Duplikaten und speichert die verarbeiteten Daten in einer neuen Datei.
"""
```
## 3. Importiere alle benötigten Pakete am Anfang
Liste alle deine Importe am Anfang des Skripts auf. Das macht Abhängigkeiten klar und vereinfacht die Wartung.
```python
import sys # Pakete, die von Python bereitgestellt werden
from pathlib import Path
import numpy as np # Pakete, die heruntergeladen und in requirements.txt angegeben sind
import pandas as pd
import mein_modul # Module, die du selbst geschrieben hast
```
## 4. Organisiere Code in Funktionen und Klassen
Organisiere deinen Code, indem du Funktionalitäten in Funktionen oder Klassen einbettest. Das fördert Code-Wiederverwendung, Testbarkeit und Lesbarkeit. Idealerweise sollten Funktionen eine Aufgabe erledigen und diese gut machen. Klassen können für komplexere Logik oder wenn du einen Zustand beibehalten musst, verwendet werden. Saubere Funktionen und Klassen enthalten _Type-Hints_ und _Docstrings_, um ihren Zweck sowie Eingaben/Ausgaben zu erklären.
**Beispiele für Funktionen:**
```python
def lade_daten(dateipfad: str) -> pd.DataFrame:
"""Lädt Daten aus einer CSV-Datei.
Parameters:
----------
dateipfad : str
Pfad zur CSV-Datei.
Returns:
-------
pd.DataFrame
Geladene Daten als DataFrame.
"""
return pd.read_csv(dateipfad)
def bereinige_daten(df: pd.DataFrame) -> pd.DataFrame:
"""Bereinigt den DataFrame durch Entfernen von Nullwerten und Duplikaten.
Parameters:
----------
df : pd.DataFrame
Eingabe-DataFrame.
Returns:
-------
pd.DataFrame
Bereinigter DataFrame.
"""
df = df.dropna()
df = df.drop_duplicates()
return df
def speichere_daten(df: pd.DataFrame, ausgabepfad: str) -> None:
"""Speichert den DataFrame in einer CSV-Datei.
Parameters:
----------
df : pd.DataFrame
Zu speichernder DataFrame.
ausgabepfad : str
Pfad zum Speichern der CSV-Datei.
"""
df.to_csv(ausgabepfad, index=False)
```
**Beispiel für eine Klasse:**
```python
class DatenVerarbeiter:
"""Eine Klasse zur Datenverarbeitung."""
def __init__(self, dateipfad):
self.daten = self.lade_daten(dateipfad)
def lade_daten(self, dateipfad):
return pd.read_csv(dateipfad)
def bereinige_daten(self):
self.daten.dropna(inplace=True)
self.daten.drop_duplicates(inplace=True)
def speichere_daten(self, ausgabepfad):
self.daten.to_csv(ausgabepfad, index=False)
```
## 5. Definiere eine `main()`-Funktion
Erstelle eine `main()`-Funktion, die als Einstiegspunkt deines Skripts dient. Diese Funktion sollte den Ablauf deines Programms orchestrieren.
```python
def main():
"""Hauptfunktion, die die Datenverarbeitung steuert."""
eingabedatei = 'data/raw/data.csv'
ausgabedatei = 'data/processed/bereinigte_daten.csv'
# Verwendung von Funktionen
daten = lade_daten(eingabedatei)
bereinigte_daten = bereinige_daten(daten)
speichere_daten(bereinigte_daten, ausgabedatei)
# Oder Verwendung einer Klasse
# verarbeiter = DatenVerarbeiter(eingabedatei)
# verarbeiter.bereinige_daten()
# verarbeiter.speichere_daten(ausgabedatei)
print("Datenverarbeitung abgeschlossen.")
```
## 6. Verwende die `if __name__ == "__main__":`-Anweisung
Dies ist ein gängiges Python-Idiom, mit dem du prüfen kannst, ob das Skript als Hauptprogramm ausgeführt wird. So stellst du sicher, dass die `main()`-Funktion nur aufgerufen wird, wenn das Skript direkt ausgeführt wird. Wenn du die `main()`-Funktion direkt ausführst, wird sie nicht ausgeführt, wenn das Modul oder Teile davon in einem anderen Skript importiert werden.
Füge also am Ende deines Skripts hinzu:
```python
if __name__ == "__main__":
main()
```
Dies prüft, ob das Skript als Hauptprogramm ausgeführt wird, und ruft entsprechend `main()` auf.
## Alles zusammenführen
So könnte dein Skript aussehen, wenn du all diese Best Practices kombinierst:
```python
"""
Dieses Skript lädt Rohdaten, bereinigt sie durch Entfernen von Nullwerten und Duplikaten, und speichert die verarbeiteten Daten in einer neuen Datei.
"""
import os
import sys
import pandas as pd
import numpy as np
def lade_daten(dateipfad: str) -> pd.DataFrame:
"""Lädt Daten aus einer CSV-Datei.
Parameter:
----------
dateipfad : str
Pfad zur CSV-Datei.
Rückgabe:
-------
pd.DataFrame
Geladene Daten als DataFrame.
"""
return pd.read_csv(dateipfad)
def bereinige_daten(df: pd.DataFrame) -> pd.DataFrame:
"""Bereinigt den DataFrame durch Entfernen von Nullwerten und Duplikaten.
Parameter:
----------
df : pd.DataFrame
Eingabe-DataFrame.
Rückgabe:
-------
pd.DataFrame
Bereinigter DataFrame.
"""
df = df.dropna()
df = df.drop_duplicates()
return df
def speichere_daten(df: pd.DataFrame, ausgabepfad: str) -> None:
"""Speichert den DataFrame in einer CSV-Datei.
Parameter:
----------
df : pd.DataFrame
Zu speichernder DataFrame.
ausgabepfad : str
Pfad zum Speichern der CSV-Datei.
"""
df.to_csv(ausgabepfad, index=False)
def main():
"""Hauptfunktion, die die Datenverarbeitung steuert."""
eingabedatei = 'data/raw/data.csv'
ausgabedatei = 'data/processed/bereinigte_daten.csv'
daten = lade_daten(eingabedatei)
bereinigte_daten = bereinige_daten(daten)
speichere_daten(bereinigte_daten, ausgabedatei)
print("Datenverarbeitung abgeschlossen.")
if __name__ == "__main__":
main()
```
## Zusätzliche Tipps
- **Kommentiere deinen Code:** Verwende Kommentare, um nicht offensichtliche Teile deines Codes zu erklären. Strebe jedoch danach, Code zu schreiben, der selbsterklärend ist.
- **Befolge die PEP 8-Richtlinien:** Halte dich an den [PEP 8](https://www.python.org/dev/peps/pep-0008/)-Styleguide für Python-Code, um die Lesbarkeit zu verbessern. Um dies zu erleichtern, verwende einen Auto-Formatter wie `black` oder `ruff`.
- **Verwende aussagekräftige Variablen-, Funktions- und Klassennamen:** Wähle Namen, die ihren Zweck vermitteln. Vermeide Ein-Buchstaben-Variablennamen, außer für einfache Iteratoren. Statt `x` und `y` verwende z.B. `zeit` und `signal`.
- **Behandle Ausnahmen:** Verwende try-except-Blöcke, um potenzielle Fehler elegant zu handhaben.
```python
try:
daten = lade_daten(eingabedatei)
except FileNotFoundError:
print(f"Fehler: Die Datei {eingabedatei} wurde nicht gefunden.")
sys.exit(1)
```
- **Verwende Logging anstelle von Print-Anweisungen:** Für größere Skripte solltest du das `logging`-Modul verwenden, um eine bessere Kontrolle über Logging-Level und -Ausgaben zu haben.
```python
import logging
logging.basicConfig(level=logging.INFO)
logging.info("Datenverarbeitung abgeschlossen.")
```
- **Parameterisiere deine Skripte:** Verwende Kommandozeilenargumente oder eine Konfigurationsdatei, um dein Skript flexibler zu gestalten.
```python
import argparse
def parse_arguments():
parser = argparse.ArgumentParser(description="Daten verarbeiten und bereinigen.")
parser.add_argument('--input', required=True, help='Pfad zur Eingabedatei')
parser.add_argument('--output', required=True, help='Pfad zur Ausgabedatei')
return parser.parse_args()
def main():
args = parse_arguments()
daten = lade_daten(args.input)
bereinigte_daten = bereinige_daten(daten)
speichere_daten(bereinigte_daten, args.output)
```
- **Mache deinen Code modular:** Zerlege dein Skript in mehrere Dateien oder Module für bessere Organisation und Wiederverwendbarkeit. Verschiebe beispielsweise Datenverarbeitungsfunktionen, die in mehreren Skripten verwendet werden, in ein separates Modul namens `datenverarbeitung.py`.
- **Coding einer Abbildung:** Wenn du eine Abbildung codest, kannst du unserem [Leitfaden zum Codieren einer Abbildung](https://github.com/bendalab/plottools/blob/master/docs/guide.md) folgen. Wenn du die gleichen Prinzipien auf deinen Abbildungscode anwendest, wird es einfacher, ihn zu modifizieren und wiederzuverwenden.
## Fazit
Wenn du diese Best Practices befolgst, erstellst du Python-Skripte, die:
- **Lesbar** sind: Klare Struktur und Benennung machen deinen Code leicht verständlich.
- **Wartbar** sind: Kapselung und Modularität vereinfachen Updates und Debugging.
- **Wiederverwendbar** sind: Funktionen und Klassen können in anderen Skripten importiert und verwendet werden.
- **Robust** sind: Fehlerbehandlung stellt sicher, dass dein Skript unerwartete Situationen handhaben kann.
Denke daran, dass gute Codingraktiken nicht nur dir das Leben erleichtern, sondern auch anderen helfen, die vielleicht mit deinem Code arbeiten. Die Mühe, die du in das Schreiben sauberer und effektiver Skripte steckst, wird sich langfristig auszahlen.
Viel Spaß beim Programmieren!

View File

@@ -1,3 +1,28 @@
# Tips and Tricks for the data directory
# Structuring the `/data` Directory
The filename should contain information about the date
German version: [README_de.md](README_de.md)
```
project-name/
├── data/
├── raw/ # Original, unmodified data
├── processed/ # Data derived from raw data
└── models/ # Model weights and outputs (if applicable)
```
## Guidelines
- **`raw/`**:
- Store all original data exactly as collected.
- **Do not modify** these files to preserve data integrity.
- Include metadata or use clear filenames with dates to indicate when the data was recorded.
- **`processed/`**:
- Place cleaned or transformed data here.
- Generate these files using scripts.
- Document processing steps if necessary.
- **`models/`** (if you are training models):
- Save model weights, checkpoints, and outputs.
- Organize by experiment or model version if needed.
- Include metadata about training parameters or results.

26
data/README_de.md Normal file
View File

@@ -0,0 +1,26 @@
# Strukturierung des `/data`-Verzeichnisses
```
project-name/
├── data/
├── raw/ # Originale, unveränderte Daten
├── processed/ # Aus Rohdaten abgeleitete Daten
└── models/ # Modellgewichte und Ausgaben (optional)
```
## Richtlinien
- **`raw/`**:
- Speichere alle originalen Daten genau so, wie sie gesammelt wurden.
- **Verändere diese Dateien nicht**, um die Datenintegrität zu bewahren.
- Füge Metadaten hinzu oder verwende klare Dateinamen mit Datumsangaben, um anzugeben, wann die Daten aufgezeichnet wurden.
- **`processed/`**:
- Lege hier bereinigte oder transformierte Daten ab.
- Erstelle diese Dateien mithilfe von Skripten.
- Dokumentiere bei Bedarf die Verarbeitungsschritte.
- **`models/`** (falls du machine learning verwendest):
- Speichere Modellgewichte, Checkpoints und Ausgaben.
- Organisiere nach Experiment oder Modellversion, falls erforderlich.
- Füge Metadaten über Trainingsparameter oder Ergebnisse hinzu.