Spaces:
Sleeping
Sleeping
# app.py | |
import gradio as gr | |
import joblib | |
import json | |
import pandas as pd | |
import numpy as np | |
# --- 1. Modell & Metadaten laden --- | |
# Passe den Pfad an, falls nötig | |
MODEL_PATH = "model.pkl" # oder "random_forest_model.joblib" | |
FEATURES_PATH = "features.json" | |
model = joblib.load(MODEL_PATH) | |
features = json.load(open(FEATURES_PATH, "r")) | |
# Extrahiere die Modell-Kürzel aus den Feature-Namen | |
model_dummies = [ | |
feat.replace("Model_group_", "") | |
for feat in features | |
if feat.startswith("Model_group_") | |
] | |
# Median-PS zum Auffüllen, falls notwendig | |
# Hier setzen wir als Default das Median-PS aus Trainingsdaten; | |
# Du kannst hier auch einen festen Wert angeben | |
med_ps = np.median([ # Beispiel: ersetze durch echten Median | |
# Du kannst das eigentlich in deinem Notebook ausrechnen und hier fest eintragen | |
300, # Platzhalter | |
]) | |
# --- 2. Vorhersage-Funktion --- | |
def predict_price(model_main: str, kilometer: float, ps: float, year: int): | |
# 2.1 Basis-Input-Vector erstellen | |
x = dict.fromkeys(features, 0.0) | |
x['Kilometer'] = float(kilometer) | |
x['PS'] = float(ps) | |
x['month'] = 1 # Standard-Januar; nur für Alter nötig | |
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: per Default Automatik (gear_Schaltgetriebe = 0) | |
# Wenn du willst, kannst du hier noch ein Dropdown für Getriebe hinzufügen | |
# 2.2 Modell-Dummy setzen | |
key = f"Model_group_{model_main}" | |
if key in x: | |
x[key] = 1.0 | |
else: | |
x['Model_group_Other'] = 1.0 | |
# 2.3 DataFrame bauen | |
df_input = pd.DataFrame([x], columns=features) | |
# 2.4 Vorhersage | |
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), | |
gr.Number(label="PS", value=med_ps), | |
gr.Number(label="Baujahr", value=2020, precision=0) | |
], | |
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 und Baujahr ein – " | |
"und erhalte eine geschätzte Preisprognose in CHF." | |
), | |
examples=[ | |
["M3", 20000, 450, 2021], | |
["X5", 50000, 300, 2019], | |
["M4", 10000, 480, 2023], | |
] | |
) | |
if __name__ == "__main__": | |
iface.launch() | |