File size: 5,029 Bytes
98d9a60
 
 
fee7f0e
 
 
 
a70211f
fee7f0e
 
 
a70211f
98d9a60
fee7f0e
 
a70211f
 
fee7f0e
a70211f
 
 
 
 
 
fee7f0e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fefe649
fee7f0e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a70211f
fee7f0e
 
 
 
 
 
 
 
 
 
 
 
 
 
a70211f
fee7f0e
 
 
 
 
 
 
 
 
a70211f
fee7f0e
 
 
4abfa37
a70211f
fee7f0e
 
 
a9a7e3e
ea61704
 
 
fee7f0e
 
a9a7e3e
c4582c5
fee7f0e
 
 
 
a9a7e3e
ea61704
fee7f0e
ea61704
 
 
 
 
 
fee7f0e
98d9a60
a70211f
fee7f0e
 
 
 
 
 
 
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
'''
Приложение для запуска на Hugging Face Spaces
'''
import gradio as gr
import pandas as pd
from huggingface_hub import hf_hub_download
import joblib
from geopy.geocoders import Nominatim, Photon
from geopy.exc import GeocoderTimedOut, GeocoderUnavailable
import time

# Загрузка модели из репозитория HF
model_path = hf_hub_download(repo_id="Nikgorby/real_estate_predict", filename="random_forest_model (1).pkl")
model = joblib.load(model_path)

def predict(features_lst: list, model):
    """Получение предсказаний от модели

    Args:
        features_lst (list): список фичей
        model (model): обученная модель

    Returns:
        list: предсказание
    """
    # Предсказание
    predictions = model.predict(features_lst)

    return predictions
# end def

def addr_to_coords(addr: str):
    """Функция получения координат по адресу

    Args:
        addr (str): Строка с адресом

    Returns:
        float: координаты широта, долгота
    """
    geolocator = Photon(user_agent="my_geocoder")

    # Геокодирование адреса
    try:
        # попытка получения координат
        location = geolocator.geocode(addr)
        if (location):
        # координаты получены
            return location.latitude, location.longitude
        else:
            # координаты не получены
            return 0, 0
    # end if
    except (GeocoderTimedOut, GeocoderUnavailable) as e:
        print(f"Error: {e}. Retrying...")
        time.sleep(2)  # Добавляем задержку перед повторной попыткой
        return addr_to_coords(addr)
    # end try

def predict_out(baths, square, beds, address, pool, property_type, state, year_built, remodeled_year, avg_school_rating, schools_qty, avg_school_dist):
    """Функция получения предсказания от модели

    Args:
        args: фичи

    Returns:
        float: предсказание модели
    """

    # Формирование признака объекта
    lst = [0]*8
    lst[property_type] = 1
    property_type = ", ".join(map(str, lst))

    # Преобразование адреса в координаты
    coords = addr_to_coords(address)
    coords = ", ".join(map(str, coords))

    # Формирование списка фичей
    features_lst = f'{baths}, {square}, {beds}, {coords}, {pool}, {property_type}, {state}, {year_built}, {remodeled_year}, {avg_school_rating}, {schools_qty}, {avg_school_dist}'
    features_lst = features_lst.split(", ")
    features_lst = [float(num) for num in features_lst]
    features_lst = [features_lst]

    # Предсказание
    predictions = predict(features_lst, model)
    
    # Возвращение предсказаний в виде DataFrame
    result = int(predictions[0])
    return features_lst, result

# Создание интерфейса Gradio
title = "Демо модели"
description = "Введите фичи."

iface = gr.Interface(
    fn=predict_out,
    inputs=[gr.Textbox(label="Кол-во ванных", value=1),
            gr.Textbox(label="Площадь, кв. фут.", value=1),
            gr.Textbox(label="Кол-во спален", value=1),
            gr.Textbox(label="Адрес в виде 32413 Crystal Breeze Ln, Leesburg", value="32413 Crystal Breeze Ln, Leesburg"),
            gr.Radio(
                ["Нет", "Да"], type="index",
                label = "Бассейн",
                value="Нет"
            ),
            gr.Dropdown(
                ["Кондоминиум", "Зем. участок", "На неск. семей", "Другое", "Ранчо", "На одну семью", "Таунхаус", "Традиционное"],
                label='Тип объекта',
                type="index",
                value="Кондоминиум"
            ),
            gr.Textbox(label='Штат (номер)', value=12),
            gr.Textbox(label="Год постройки", value=1999),
            gr.Textbox(label="Год капитального ремонта (0 если не проводился)", value=0),
            gr.Textbox(label="Средний рейтинг школ рядом (от 0 до 1)", value=1),
            gr.Textbox(label="Количество школ рядом", value=1),
            gr.Textbox(label="Среднее расстояние до школы, миль", value=1),
            ],
    outputs=[gr.Textbox(label="Строка фичей, передаваемая в модель (для контроля)"),
             gr.Textbox(label="Предсказание, $")],
    title=title,
    description=description,
    allow_flagging='never'
)

# Запуск приложения
iface.launch()