|
|
|
|
|
import gradio as gr |
|
|
from model import Model |
|
|
|
|
|
|
|
|
model = Model("sgd_model_pipeline.joblib") |
|
|
|
|
|
|
|
|
def predict_price( |
|
|
squere, |
|
|
dist_1, |
|
|
dist_2, |
|
|
dist_3, |
|
|
category_encoded, |
|
|
floor_, |
|
|
offer_type, |
|
|
series, |
|
|
condition, |
|
|
building_type, |
|
|
year |
|
|
): |
|
|
""" |
|
|
Make apartment price prediction based on input features. |
|
|
""" |
|
|
|
|
|
features = { |
|
|
'squere': int(squere), |
|
|
'dist_1': float(dist_1), |
|
|
'dist_2': float(dist_2), |
|
|
'dist_3': float(dist_3), |
|
|
'CategoryEncoded': float(category_encoded), |
|
|
'floor_': str(floor_), |
|
|
'Тип предложения': offer_type, |
|
|
'Серия': series, |
|
|
'Состояние': condition, |
|
|
'dom': building_type, |
|
|
'year': int(year) |
|
|
} |
|
|
|
|
|
|
|
|
try: |
|
|
predicted_price = model.predict(features) |
|
|
return f"Predicted Price: ${predicted_price:,.2f} USD" |
|
|
except Exception as e: |
|
|
return f"Error: {str(e)}" |
|
|
|
|
|
|
|
|
|
|
|
offer_types = ['от агента', 'от собственника'] |
|
|
|
|
|
building_series = [ |
|
|
'индивид. планировка', |
|
|
'элитка', |
|
|
'106 серия', |
|
|
'хрущевка', |
|
|
'106 серия улучшенная', |
|
|
'104 серия', |
|
|
'108 серия', |
|
|
'105 серия', |
|
|
'104 серия улучшенная', |
|
|
'105 серия улучшенная', |
|
|
'пентхаус', |
|
|
'малосемейка', |
|
|
'сталинка', |
|
|
'107 серия' |
|
|
] |
|
|
|
|
|
conditions = [ |
|
|
'евроремонт', |
|
|
'под самоотделку (псо)', |
|
|
'хорошее', |
|
|
'среднее', |
|
|
'не достроено' |
|
|
] |
|
|
|
|
|
building_types = ['кирпичный', 'монолитный', 'панельный'] |
|
|
|
|
|
|
|
|
|
|
|
with gr.Blocks(theme=gr.themes.Ocean()) as demo: |
|
|
gr.Markdown("# Bishkek Apartment Price Prediction") |
|
|
gr.Markdown("Enter apartment details to get a price prediction") |
|
|
|
|
|
with gr.Row(): |
|
|
with gr.Column(): |
|
|
gr.Markdown("### Basic Information") |
|
|
squere = gr.Number( |
|
|
label="Area (square meters)", |
|
|
value=50, |
|
|
minimum=10, |
|
|
maximum=500 |
|
|
) |
|
|
floor_ = gr.Textbox( |
|
|
label="Floor Number", |
|
|
value="1", |
|
|
placeholder="e.g., 1, 3, 6" |
|
|
) |
|
|
year = gr.Number( |
|
|
label="Building Year", |
|
|
value=2010, |
|
|
minimum=1950, |
|
|
maximum=2025 |
|
|
) |
|
|
|
|
|
gr.Markdown("### Location Features") |
|
|
category_encoded = gr.Number( |
|
|
label="Category Encoded (mean square for location)", |
|
|
value=60.0 |
|
|
) |
|
|
dist_1 = gr.Number( |
|
|
label="Distance 1 (km)", |
|
|
value=1.0, |
|
|
minimum=0 |
|
|
) |
|
|
dist_2 = gr.Number( |
|
|
label="Distance 2 (km)", |
|
|
value=2.0, |
|
|
minimum=0 |
|
|
) |
|
|
dist_3 = gr.Number( |
|
|
label="Distance 3 (km)", |
|
|
value=3.0, |
|
|
minimum=0 |
|
|
) |
|
|
|
|
|
with gr.Column(): |
|
|
gr.Markdown("### Building Characteristics") |
|
|
offer_type = gr.Dropdown( |
|
|
choices=offer_types, |
|
|
label="Offer Type", |
|
|
value=offer_types[0] |
|
|
) |
|
|
series = gr.Dropdown( |
|
|
choices=building_series, |
|
|
label="Building Series", |
|
|
value=building_series[0] |
|
|
) |
|
|
condition = gr.Dropdown( |
|
|
choices=conditions, |
|
|
label="Condition", |
|
|
value=conditions[0] |
|
|
) |
|
|
building_type = gr.Dropdown( |
|
|
choices=building_types, |
|
|
label="Building Type", |
|
|
value=building_types[0] |
|
|
) |
|
|
|
|
|
|
|
|
with gr.Row(): |
|
|
predict_btn = gr.Button("Predict Price", variant="primary", size="lg") |
|
|
|
|
|
with gr.Row(): |
|
|
output = gr.Textbox(label="Prediction Result", scale=2) |
|
|
|
|
|
|
|
|
predict_btn.click( |
|
|
fn=predict_price, |
|
|
inputs=[ |
|
|
squere, |
|
|
dist_1, |
|
|
dist_2, |
|
|
dist_3, |
|
|
category_encoded, |
|
|
floor_, |
|
|
offer_type, |
|
|
series, |
|
|
condition, |
|
|
building_type, |
|
|
year |
|
|
], |
|
|
outputs=output |
|
|
) |
|
|
|
|
|
|
|
|
gr.Markdown("---") |
|
|
gr.Markdown("### Example Values") |
|
|
gr.Markdown(""" |
|
|
- **Area**: 60-80 sq meters (typical 2-room apartment) |
|
|
- **Floor**: 1-16 (depending on building) |
|
|
- **Year**: 1960-2024 |
|
|
- **Distances**: 0.5-5 km to points of interest |
|
|
""") |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
demo.launch(share=True) |
|
|
|