File size: 2,801 Bytes
fb2c62e
 
4d736c4
fb2c62e
 
4d736c4
fb2c62e
 
 
 
 
 
4d736c4
fb2c62e
 
4d736c4
fb2c62e
 
 
 
 
 
4d736c4
fb2c62e
 
 
 
 
 
 
4d736c4
fb2c62e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4d736c4
fb2c62e
 
4d736c4
fb2c62e
 
 
4d736c4
fb2c62e
4d736c4
fb2c62e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4d736c4
 
fb2c62e
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# 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()