Spaces:
Sleeping
Sleeping
Commit
·
2e9c8f6
1
Parent(s):
b5fff1b
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import tensorflow as tf
|
3 |
+
import numpy as np
|
4 |
+
import pandas as pd
|
5 |
+
from datasets import load_dataset
|
6 |
+
|
7 |
+
model = tf.keras.models.load_model('model/price_model.h5')
|
8 |
+
location_mapping = {1: 'Астрахань', 2: 'Волгоград', 3: 'Краснодар', 4: 'Ростов-на-Дону', 5: 'Майкоп', 6: 'Элиста'}
|
9 |
+
district_mapping = {
|
10 |
+
1: [11, 12, 13, 14, 15],
|
11 |
+
2: [21, 22, 23, 24, 25, 26, 27, 28],
|
12 |
+
3: [31, 32, 33, 34],
|
13 |
+
4: [41, 42, 43, 44, 45, 46, 47, 48],
|
14 |
+
5: [51],
|
15 |
+
6: [61]
|
16 |
+
}
|
17 |
+
district_names = {
|
18 |
+
11: 'Астрахань - Кировский', 12: 'Астрахань - Ленинский', 13: 'Астрахань - Советский', 14: 'Астрахань - Трусовский', 15: 'Астрахань - Центральный',
|
19 |
+
21: 'Волгоград - Ворошиловский', 22: 'Волгоград - Дзержинский', 23: 'Волгоград - Кировский', 24: 'Волгоград - Красноармейский', 25: 'Волгоград - Краснооктябрьский', 26: 'Волгоград - Советский', 27: 'Волгоград - Тракторозаводский', 28: 'Волгоград - Центральный',
|
20 |
+
31: 'Краснодар - Западный', 32: 'Краснодар - Карасунский', 33: 'Краснодар - Прикубанский', 34: 'Краснодар - Центральный',
|
21 |
+
41: 'Ростов-на-Дону - Ворошиловский', 42: 'Ростов-на-Дону - Железнодорожный', 43: 'Ростов-на-Дону - Кировский', 44: 'Ростов-на-Дону - Ленинский', 45: 'Ростов-на-Дону - Октябрьский', 46: 'Ростов-на-Дону - Первомайский', 47: 'Ростов-на-Дону - Пролетарский', 48: 'Ростов-на-Дону - Советский',
|
22 |
+
51: 'Майкоп - Центральный',
|
23 |
+
61: 'Элиста - Центральный'
|
24 |
+
}
|
25 |
+
author_type_mapping = {0: 'Риелтор', 1: 'Частный владелец'}
|
26 |
+
dataset = load_dataset("1sozidatel1/sfd_housing_prices_november_2024")
|
27 |
+
data = pd.DataFrame(dataset['train'])
|
28 |
+
feature_cols = ['author_type_id', 'location_id', 'district_id', 'floor', 'rooms_count', 'total_meters']
|
29 |
+
|
30 |
+
X = data[feature_cols]
|
31 |
+
X_min = X.min()
|
32 |
+
X_max = X.max()
|
33 |
+
y = data['price'].values.reshape(-1, 1)
|
34 |
+
y_min = np.min(y)
|
35 |
+
y_max = np.max(y)
|
36 |
+
|
37 |
+
def predict_price(author_type, location, district, floor, rooms_count, total_meters):
|
38 |
+
author_type_id = list(author_type_mapping.keys())[list(author_type_mapping.values()).index(author_type)]
|
39 |
+
location_id = list(location_mapping.keys())[list(location_mapping.values()).index(location)]
|
40 |
+
district_id = list(district_names.keys())[list(district_names.values()).index(district)]
|
41 |
+
input_data = np.array([[author_type_id, location_id, district_id, floor, rooms_count, total_meters]])
|
42 |
+
input_data_normalized = (input_data - X_min.values) / (X_max.values - X_min.values)
|
43 |
+
prediction = model.predict(input_data_normalized)
|
44 |
+
prediction_unscaled = prediction * (y_max - y_min) + y_min
|
45 |
+
return np.round(prediction_unscaled.flatten()[0], 1)
|
46 |
+
|
47 |
+
def update_districts(location):
|
48 |
+
location_id = list(location_mapping.keys())[list(location_mapping.values()).index(location)]
|
49 |
+
districts = [district_names[district_id] for district_id in district_mapping[location_id]]
|
50 |
+
return gr.update(choices=districts)
|
51 |
+
|
52 |
+
with gr.Blocks() as demo:
|
53 |
+
gr.Markdown("# Модель предсказания цен на недвижимость")
|
54 |
+
gr.Markdown("Этот интерфейс позволяет предсказать цену на недвижимость на основе различных параметров, таких как тип продавца, город, район, этаж, количество комнат и площадь. Введите необходимые данные и нажмите кнопку 'Предсказать цену', чтобы получить предсказание 💵")
|
55 |
+
with gr.Row():
|
56 |
+
with gr.Column():
|
57 |
+
author_type = gr.Dropdown(choices=list(author_type_mapping.values()), label="Тип продавца")
|
58 |
+
location = gr.Dropdown(choices=list(location_mapping.values()), label="Город")
|
59 |
+
district = gr.Dropdown(label="Район")
|
60 |
+
floor = gr.Number(label="Этаж", minimum=1, maximum=50)
|
61 |
+
rooms_count = gr.Dropdown(choices=[1, 2, 3, 4, 5], label="Количество комнат")
|
62 |
+
total_meters = gr.Number(label="Площадь, кв.м")
|
63 |
+
predict_btn = gr.Button("Предсказать цену")
|
64 |
+
with gr.Column():
|
65 |
+
price = gr.Number(label="Предсказанная цена, (тыс. руб.)")
|
66 |
+
|
67 |
+
location.change(update_districts, inputs=location, outputs=district)
|
68 |
+
predict_btn.click(predict_price, inputs=[author_type, location, district, floor, rooms_count, total_meters], outputs=price)
|
69 |
+
|
70 |
+
demo.launch()
|