Last active 1753297680

bc100_fgr.py Raw
1import pandas as pd
2import re
3
4from datetime import datetime, date, timedelta
5
6BC_START_DATE = date(2025, 3, 6)
7FGR_AVERAGE_PROCESSING_TIME = timedelta(days=5)
8PRICE = 2988.00
9FILENAME = "Transaktionen.csv"
10
11TODAY = date.today() - FGR_AVERAGE_PROCESSING_TIME
12BC_END_DATE = BC_START_DATE + timedelta(days=365)
13
14def parse_journey_date(value):
15 match = re.search(r"Bahnreise am (\d{1,2}\.\d{1,2}\.\d{4})", str(value))
16 if match:
17 return datetime.strptime(match.groups()[0], "%d.%m.%Y").date()
18
19df = pd.read_csv(
20 FILENAME,
21 converters={
22 "Betrag": lambda x: float(x.replace(",", ".")),
23 "Buchungsdatum": lambda x: datetime.strptime(x, "%d.%m.%Y").date()
24 }
25)
26
27df["Reisedatum"] = df["Verwendungszweck"].map(parse_journey_date)
28
29df = df[
30 (df["Zahlungsempfänger"] == "Deutsche Bahn") &
31 (df["Verwendungszweck"].str.contains("Fahrgastrechtsfall", case=False)) &
32 (df["Betrag"] == 10) &
33 (df["Buchungsdatum"] > BC_START_DATE) &
34 (df["Reisedatum"] >= BC_START_DATE)
35]
36
37current_amount = df["Betrag"].sum()
38bc_use_percentage= ((TODAY - BC_START_DATE).days / 365)
39max_amount = bc_use_percentage * PRICE * 0.25
40
41effective_price = PRICE - (current_amount * (1 / bc_use_percentage))
42
43print("Fahrgastrechte: {:.2f}€ von {:.2f}€ ({:.0f}%)".format(
44 current_amount,
45 max_amount,
46 (current_amount / max_amount) * 100
47))
48
49print("Effektiver Preis der BC100 wird statt {:.2f}{:.2f}€ sein ({:.0f}% Rabatt)".format(
50 PRICE,
51 effective_price,
52 (1 - (effective_price / PRICE)) * 100
53))