Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import pandas as pd | |
| import numpy as np | |
| import pickle | |
| MODEL_PATH = "model.pkl" | |
| with open(MODEL_PATH, 'rb') as f: | |
| model_package = pickle.load(f) | |
| if isinstance(model_package, dict): | |
| model = model_package['model'] | |
| scaler = model_package.get('scaler', None) | |
| features = model_package.get('features', None) | |
| else: | |
| model = model_package | |
| scaler = None | |
| features = None | |
| def create_features(rooms, area, postalcode, pop, pop_dens, frg_pct, emp, tax_income): | |
| """Create engineered features from input""" | |
| data = { | |
| 'rooms': rooms, | |
| 'area': area, | |
| 'pop': pop, | |
| 'pop_dens': pop_dens, | |
| 'frg_pct': frg_pct, | |
| 'emp': emp, | |
| 'tax_income': tax_income, | |
| 'rooms_per_sqm': rooms / area, | |
| 'wealth_index': (tax_income / 100000) * (emp / 100000), | |
| 'is_zurich_city': 1 if (postalcode >= 8000 and postalcode < 8100) else 0, | |
| 'pop_emp_ratio': pop / (emp + 1), | |
| 'log_area': np.log1p(area), | |
| 'log_pop': np.log1p(pop), | |
| 'log_tax_income': np.log1p(tax_income) | |
| } | |
| return pd.DataFrame([data]) | |
| def predict_price(rooms, area, postalcode, pop, pop_dens, frg_pct, emp, tax_income): | |
| """Predict apartment rental price based on input features""" | |
| input_data = create_features(rooms, area, postalcode, pop, pop_dens, frg_pct, emp, tax_income) | |
| if features is not None: | |
| input_data = input_data[features] | |
| if scaler is not None: | |
| input_data_scaled = scaler.transform(input_data) | |
| prediction = model.predict(input_data_scaled)[0] | |
| else: | |
| prediction = model.predict(input_data)[0] | |
| return f"Geschätzter Mietpreis: CHF {prediction:.2f}/Monat" | |
| with gr.Blocks(title="Zürich Apartment Price Predictor") as demo: | |
| gr.Markdown("# Zürich Apartment Rent Predictor") | |
| gr.Markdown("Vorhersage von Mietpreisen für Wohnungen im Kanton Zürich") | |
| with gr.Row(): | |
| with gr.Column(): | |
| rooms = gr.Number(label="Anzahl Zimmer", value=3.5, minimum=1, maximum=10) | |
| area = gr.Number(label="Wohnfläche (m²)", value=75, minimum=10, maximum=500) | |
| postalcode = gr.Number(label="Postleitzahl", value=8001, minimum=8000, maximum=8999) | |
| with gr.Column(): | |
| pop = gr.Number(label="Bevölkerung (Gemeinde)", value=420000) | |
| pop_dens = gr.Number(label="Bevölkerungsdichte", value=5000) | |
| frg_pct = gr.Number(label="Ausländeranteil (%)", value=30) | |
| emp = gr.Number(label="Anzahl Arbeitsplätze", value=490000) | |
| tax_income = gr.Number(label="Durchschn. Steuereinkommen", value=85000) | |
| predict_btn = gr.Button("Preis berechnen", variant="primary") | |
| output = gr.Textbox(label="Ergebnis", lines=2) | |
| predict_btn.click( | |
| fn=predict_price, | |
| inputs=[rooms, area, postalcode, pop, pop_dens, frg_pct, emp, tax_income], | |
| outputs=output | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch(theme=gr.themes.Soft()) | |