|
|
|
|
|
import gradio as gr
|
|
|
import tensorflow as tf
|
|
|
import numpy as np
|
|
|
import pandas as pd
|
|
|
|
|
|
|
|
|
|
|
|
model_path = "kia_apartment_keras_model.keras"
|
|
|
model = tf.keras.models.load_model(model_path)
|
|
|
|
|
|
df_bfs_data = pd.read_csv('bfs_municipality_and_tax_data.csv', sep=',', encoding='utf-8')
|
|
|
df_bfs_data['tax_income'] = df_bfs_data['tax_income'].str.replace("'", "").astype(float)
|
|
|
|
|
|
|
|
|
locations = {
|
|
|
"Zürich": 261,
|
|
|
"Kloten": 62,
|
|
|
"Uster": 198,
|
|
|
"Illnau-Effretikon": 296,
|
|
|
"Feuerthalen": 27,
|
|
|
"Pfäffikon": 177,
|
|
|
"Ottenbach": 11,
|
|
|
"Dübendorf": 191,
|
|
|
"Richterswil": 138,
|
|
|
"Maur": 195,
|
|
|
"Embrach": 56,
|
|
|
"Bülach": 53,
|
|
|
"Winterthur": 230,
|
|
|
"Oetwil am See": 157,
|
|
|
"Russikon": 178,
|
|
|
"Obfelden": 10,
|
|
|
"Wald (ZH)": 120,
|
|
|
"Niederweningen": 91,
|
|
|
"Dällikon": 84,
|
|
|
"Buchs (ZH)": 83,
|
|
|
"Rüti (ZH)": 118,
|
|
|
"Hittnau": 173,
|
|
|
"Bassersdorf": 52,
|
|
|
"Glattfelden": 58,
|
|
|
"Opfikon": 66,
|
|
|
"Hinwil": 117,
|
|
|
"Regensberg": 95,
|
|
|
"Langnau am Albis": 136,
|
|
|
"Dietikon": 243,
|
|
|
"Erlenbach (ZH)": 151,
|
|
|
"Kappel am Albis": 6,
|
|
|
"Stäfa": 158,
|
|
|
"Zell (ZH)": 231,
|
|
|
"Turbenthal": 228,
|
|
|
"Oberglatt": 92,
|
|
|
"Winkel": 72,
|
|
|
"Volketswil": 199,
|
|
|
"Kilchberg (ZH)": 135,
|
|
|
"Wetzikon (ZH)": 121,
|
|
|
"Zumikon": 160,
|
|
|
"Weisslingen": 180,
|
|
|
"Elsau": 219,
|
|
|
"Hettlingen": 221,
|
|
|
"Rüschlikon": 139,
|
|
|
"Stallikon": 13,
|
|
|
"Dielsdorf": 86,
|
|
|
"Wallisellen": 69,
|
|
|
"Dietlikon": 54,
|
|
|
"Meilen": 156,
|
|
|
"Wangen-Brüttisellen": 200,
|
|
|
"Flaach": 28,
|
|
|
"Regensdorf": 96,
|
|
|
"Niederhasli": 90,
|
|
|
"Bauma": 297,
|
|
|
"Aesch (ZH)": 241,
|
|
|
"Schlieren": 247,
|
|
|
"Dürnten": 113,
|
|
|
"Unterengstringen": 249,
|
|
|
"Gossau (ZH)": 115,
|
|
|
"Oberengstringen": 245,
|
|
|
"Schleinikon": 98,
|
|
|
"Aeugst am Albis": 1,
|
|
|
"Rheinau": 38,
|
|
|
"Höri": 60,
|
|
|
"Rickenbach (ZH)": 225,
|
|
|
"Rafz": 67,
|
|
|
"Adliswil": 131,
|
|
|
"Zollikon": 161,
|
|
|
"Urdorf": 250,
|
|
|
"Hombrechtikon": 153,
|
|
|
"Birmensdorf (ZH)": 242,
|
|
|
"Fehraltorf": 172,
|
|
|
"Weiach": 102,
|
|
|
"Männedorf": 155,
|
|
|
"Küsnacht (ZH)": 154,
|
|
|
"Hausen am Albis": 4,
|
|
|
"Hochfelden": 59,
|
|
|
"Fällanden": 193,
|
|
|
"Greifensee": 194,
|
|
|
"Mönchaltorf": 196,
|
|
|
"Dägerlen": 214,
|
|
|
"Thalheim an der Thur": 39,
|
|
|
"Uetikon am See": 159,
|
|
|
"Seuzach": 227,
|
|
|
"Uitikon": 248,
|
|
|
"Affoltern am Albis": 2,
|
|
|
"Geroldswil": 244,
|
|
|
"Niederglatt": 89,
|
|
|
"Thalwil": 141,
|
|
|
"Rorbas": 68,
|
|
|
"Pfungen": 224,
|
|
|
"Weiningen (ZH)": 251,
|
|
|
"Bubikon": 112,
|
|
|
"Neftenbach": 223,
|
|
|
"Mettmenstetten": 9,
|
|
|
"Otelfingen": 94,
|
|
|
"Flurlingen": 29,
|
|
|
"Stadel": 100,
|
|
|
"Grüningen": 116,
|
|
|
"Henggart": 31,
|
|
|
"Dachsen": 25,
|
|
|
"Bonstetten": 3,
|
|
|
"Bachenbülach": 51,
|
|
|
"Horgen": 295
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def predict_apartment(rooms, area, town):
|
|
|
bfs_number = locations[town]
|
|
|
df = df_bfs_data[df_bfs_data['bfs_number']==bfs_number]
|
|
|
|
|
|
if len(df) != 1:
|
|
|
return -1
|
|
|
|
|
|
input_data = np.array([rooms, area, df['pop'].iloc[0], df['pop_dens'].iloc[0], df['frg_pct'].iloc[0], df['emp'].iloc[0], df['tax_income'].iloc[0]])
|
|
|
input_data = input_data.reshape(1, 7)
|
|
|
prediction = model.predict(input_data)
|
|
|
return float(np.round(prediction[0][0], 0))
|
|
|
|
|
|
|
|
|
|
|
|
iface = gr.Interface(
|
|
|
fn=predict_apartment,
|
|
|
inputs=["number", "number", gr.Dropdown(choices=locations.keys(), label="Town", type="value")],
|
|
|
outputs=gr.Number(),
|
|
|
examples=[[4.5, 120, "Dietlikon"], [3.5, 60, "Winterthur"]]
|
|
|
)
|
|
|
|
|
|
iface.launch()
|
|
|
|
|
|
|
|
|
|