lindritdev's picture
Update app.py
2811ae6 verified
# app.py
import gradio as gr
import joblib
import json
import pandas as pd
import numpy as np
from datetime import datetime
# --- 1. Modell & Metadaten laden ---
MODEL_PATH = "model.pkl"
FEATURES_PATH = "features.json"
model = joblib.load(MODEL_PATH)
features = json.load(open(FEATURES_PATH, "r"))
# BMW-Modell-Kürzel extrahieren
model_dummies = [
feat.replace("Model_group_", "")
for feat in features
if feat.startswith("Model_group_")
]
# Median-PS als Default-Wert
med_ps = 300 # Hier am besten aus deinem Notebook übernehmen
# Aktuelles Jahr für Slider-Maximalwert
CURRENT_YEAR = datetime.now().year
# --- 2. Vorhersage-Funktion ---
def predict_price(model_main: str, kilometer: float, ps: float, year: int, gearbox: str):
x = dict.fromkeys(features, 0.0)
x['Kilometer'] = float(kilometer)
x['PS'] = float(ps)
x['month'] = 1
x['year'] = int(year)
# Alter berechnen
today = pd.Timestamp('2025-05-24')
dt = pd.Timestamp(year=year, month=1, day=1)
age_days = (today - dt).days
x['age_days'] = float(age_days)
x['age_years'] = float(age_days) / 365.0
# Getriebe-Dummy: nur 'gear_Schaltgetriebe' existiert (drop_first)
if gearbox == "Schaltgetriebe":
x['gear_Schaltgetriebe'] = 1.0
else:
x['gear_Schaltgetriebe'] = 0.0
# Modell-Dummy setzen
key = f"Model_group_{model_main}"
if key in x:
x[key] = 1.0
else:
x['Model_group_Other'] = 1.0
df_input = pd.DataFrame([x], columns=features)
pred = model.predict(df_input)[0]
return round(float(pred), 2)
# --- 3. Gradio-Interface ---
iface = gr.Interface(
fn=predict_price,
inputs=[
gr.Dropdown(
choices=sorted(model_dummies),
label="BMW Modell-Kürzel",
value=model_dummies[0]
),
gr.Number(label="Kilometer", value=50000, precision=0),
gr.Number(label="PS", value=med_ps, precision=0),
gr.Slider(2000, CURRENT_YEAR, step=1, value=2020, label="Baujahr"),
gr.Radio(
["Automatikgetriebe", "Schaltgetriebe"],
label="Getriebeart",
value="Automatikgetriebe"
)
],
outputs=gr.Number(label="Geschätzter Preis (CHF)"),
title="BMW Price Predictor",
description=(
"Wähle das BMW-Kürzel (z.B. M3, X5, 120i), gib Kilometer, PS, Baujahr und Getriebeart ein – "
"und erhalte eine Preisprognose in CHF."
),
examples=[
["M3", 20000, 450, 2021, "Automatikgetriebe"],
["X5", 50000, 300, 2019, "Schaltgetriebe"],
["M4", 10000, 480, 2023, "Automatikgetriebe"],
]
)
if __name__ == "__main__":
iface.launch()