lindritdev's picture
Update app.py
fb2c62e verified
raw
history blame
2.8 kB
# 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()