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