# 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()