No description
| assets | ||
| calculations | ||
| gaspreisrechner.egg-info | ||
| .dockerignore | ||
| .pdm-python | ||
| app.py | ||
| docker-compose.yml | ||
| dockerfile | ||
| export_temp.json | ||
| pdm.lock | ||
| pyproject.toml | ||
| README.md | ||
| requirements.txt | ||
| update_repo.sh | ||
💡 Gaspreis-Simulationsrechner
Ein interaktives Dash-Dashboard zur Simulation und Analyse von Gaspreisverträgen
mit Folgeverträgen, Boni, Rabatten, Teuerungsraten und dynamischer Ergebnisvisualisierung.
🚀 Features
- Eingabe beliebig vieler Verträge (interaktiv über Dash-Table)
- Automatische Berechnung von Folgeverträgen (Varianten A, B, C)
- Dynamische Simulation über beliebige Simulationsjahre
- Teuerungstabelle (mit Default 5 %)
- Import & Export (CSV)
- PDF-Bericht mit:
- formatierten Ergebnistabellen
- markiertem Gewinnervertrag
- Plot
- zweispaltiger Erläuterungsseite mit Annahmen
- Responsives Tailwind-Layout mit Kartenoptik
🧩 Projektstruktur
project_root/
├── app.py # Haupt-Dash-App (Layout + Callbacks)
├── calculations.py # Berechnungslogik
├── engine.py # Simulation, Erklärungstext, Ergebnismodellierung
├── models.py # Definition von Simulationsvarianten
├── utils.py # Import/Export, Standardwerte etc.
├── assets/
│ └── style.css # Globales Styling
├── requirements.txt
├── Dockerfile
└── README.md
⚙️ Installation (lokal)
# 1. Umgebung vorbereiten
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 2. Abhängigkeiten installieren
pip install -r requirements.txt
# 3. Starten
python app.py
App läuft danach unter http://localhost:8050
🐳 Mit Docker starten
# Image bauen
docker build -t gaspreisrechner .
# Container starten
docker run -p 8050:8050 gaspreisrechner
App erreichbar unter http://localhost:8050
🧠 Simulationen in models.py
In models.py sind die Berechnungsmodelle für Folgeverträge definiert.
Jede Simulation beschreibt, wie Preise, Laufzeiten, Boni und Rabatte über die Jahre fortgeschrieben werden.
Ein typischer Ausschnitt:
# models.py
def simulate_variant_a(contract, avg_bonuses, avg_discounts, sim_years):
"""Variante A:
- gleiche Laufzeit wie Originalvertrag
- Durchschnittsboni und Rabatte aller Verträge
- konstante Preise während der Laufzeit
"""
results = []
price = contract["Arbeitspreis"]
base = contract["Grundpreis"]
for year in range(sim_years):
total = base + price * contract["Verbrauch"]
total *= (1 - avg_discounts)
total -= avg_bonuses
results.append(total)
return results
def simulate_variant_b(contract, sim_years):
"""Variante B:
- Laufzeit = 1 Jahr
- keine Boni oder Rabatte
"""
results = []
for year in range(sim_years):
total = contract["Grundpreis"] + contract["Arbeitspreis"] * contract["Verbrauch"]
results.append(total)
return results
def simulate_variant_c(contract, avg_duration, avg_bonus, avg_discount, sim_years):
"""Variante C:
- abgerundete Durchschnittslaufzeit
- Durchschnittsboni und Rabatte
"""
duration = round(avg_duration)
results = []
for year in range(sim_years):
total = contract["Grundpreis"] + contract["Arbeitspreis"] * contract["Verbrauch"]
if (year + 1) % duration == 0:
total *= (1 - avg_discount)
total -= avg_bonus
results.append(total)
return results
🧩 Eine neue Simulation hinzufügen
1️⃣ Öffne models.py
2️⃣ Füge eine neue Funktion hinzu, z. B.:
def simulate_variant_d(contract, inflation, sim_years):
"""Variante D:
- Preise steigen jährlich gemäß Inflationsrate
- keine Boni oder Rabatte
"""
results = []
base = contract["Grundpreis"]
price = contract["Arbeitspreis"]
for year in range(sim_years):
total = base + price * contract["Verbrauch"]
results.append(total)
# Preise für nächstes Jahr anpassen
base *= (1 + inflation)
price *= (1 + inflation)
return results
3️⃣ Registriere die Variante in engine.py:
from models import simulate_variant_a, simulate_variant_b, simulate_variant_c, simulate_variant_d
SIMULATION_VARIANTS = {
"A": simulate_variant_a,
"B": simulate_variant_b,
"C": simulate_variant_c,
"D": simulate_variant_d, # <--- neue Variante
}
4️⃣ Starte die App neu
→ Die Variante „D“ erscheint automatisch im PDF & in der Ergebnislogik.
📄 PDF-Export
Exportiert automatisch:
- Ergebnistabelle
- Gewinner farblich markiert
- Plot (PNG via Kaleido)
- Zweispaltige Erläuterungsseite
aus_cached_explanation(z. B. Dict mitheader+bullets)
Beispiel:
app._cached_explanation = {
"header": "Simulationsvarianten & Annahmen",
"bullets": [
"Variante A – gleiche Laufzeit wie der Originalvertrag, Durchschnittsboni und Rabatte.",
"Variante B – 1 Jahr Laufzeit ohne Boni oder Rabatte.",
"Variante C – Durchschnittslaufzeit mit Durchschnittsboni und Rabatten.",
"Während der Laufzeit bleiben Grund- und Arbeitspreise fix.",
"Nach Ablauf werden sie gemäß den Teuerungsraten fortgeschrieben."
]
}
📚 Lizenz
MIT License
(c) 2025 Gaspreisrechner Project Team