|
|
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 = 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 = input.reshape(1, 7) |
|
|
prediction = model.predict(input) |
|
|
return 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() |
|
|
) |
|
|
|
|
|
iface.launch() |