Spaces:
Sleeping
Sleeping
# 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() | |