|
|
|
import gradio as gr |
|
import pandas as pd |
|
import joblib |
|
from math import radians, sin, cos, sqrt, atan2 |
|
import folium |
|
|
|
|
|
scaler = joblib.load('scaler.pkl') |
|
kmeans_model = joblib.load('kmeans_model.pkl') |
|
|
|
|
|
csv_file_path = 'properties.csv' |
|
df = pd.read_csv(csv_file_path) |
|
|
|
|
|
def haversine(lat1, lon1, lat2, lon2): |
|
R = 6371 |
|
dlat = radians(lat2 - lat1) |
|
dlon = radians(lon2 - lon1) |
|
a = sin(dlat / 2) ** 2 + cos(radians(lat1)) * cos(radians(lat2)) * sin(dlon / 2) ** 2 |
|
c = 2 * atan2(sqrt(a), sqrt(1 - a)) |
|
return R * c |
|
|
|
|
|
centroid_lat = df['Latitude'].mean() |
|
centroid_lon = df['Longitude'].mean() |
|
|
|
|
|
property_type_mapping = joblib.load('encoder_categories.pkl') |
|
|
|
|
|
cluster_descriptions = { |
|
0: "Hotel/Others - Away from City Center", |
|
1: "Apartments", |
|
2: "Medium-large hotels - Close to the city centre", |
|
3: "Guest House", |
|
4: "Homestay", |
|
5: "Resorts", |
|
6: "Villa", |
|
7: "Apart-hotels", |
|
8: "Lodge", |
|
9: "Small hotels - Close to the city centre" |
|
} |
|
|
|
|
|
def predict_cluster(property_name, star_rating, latitude, longitude, property_type): |
|
|
|
if not (-90 <= latitude <= 90) or not (-180 <= longitude <= 180): |
|
return "Error: Latitude must be between -90 and 90, and longitude must be between -180 and 180." |
|
if not (0 <= star_rating <= 5): |
|
return "Error: Star rating must be between 0 and 5." |
|
|
|
|
|
distance_from_center = haversine(latitude, longitude, centroid_lat, centroid_lon) |
|
|
|
|
|
try: |
|
property_type_index = property_type_mapping.index(property_type) |
|
except ValueError: |
|
return f"Error: Property type '{property_type}' is not in the recognized categories." |
|
|
|
|
|
encoded_property_type = [0] * len(property_type_mapping) |
|
encoded_property_type[property_type_index] = 1 |
|
|
|
|
|
feature_vector = [star_rating, distance_from_center] + encoded_property_type |
|
|
|
|
|
try: |
|
scaled_features = scaler.transform([feature_vector]) |
|
except ValueError as e: |
|
return f"Error during scaling: {e}" |
|
|
|
|
|
cluster = kmeans_model.predict(scaled_features)[0] |
|
description = cluster_descriptions.get(cluster, "Unknown cluster") |
|
|
|
|
|
m = folium.Map(location=[latitude, longitude], zoom_start=12) |
|
folium.Marker([latitude, longitude], popup=f"Cluster {cluster}: {description}").add_to(m) |
|
map_html = m._repr_html_() |
|
|
|
return f"The property '{property_name}' belongs to cluster {cluster}: {description}", map_html |
|
|
|
|
|
inputs = [ |
|
gr.Textbox(label="Property Name"), |
|
gr.Slider(minimum=0, maximum=5, step=0.1, label="Star Rating", value=3.0), |
|
gr.Number(label="Latitude"), |
|
gr.Number(label="Longitude"), |
|
gr.Dropdown(choices=property_type_mapping, label="Property Type") |
|
] |
|
|
|
outputs = [ |
|
gr.Textbox(label="Cluster Prediction"), |
|
gr.HTML(label="Property Location on Map") |
|
] |
|
|
|
examples = [ |
|
["HOTEL SHREEMAN", 0, 22.719764, 75.861520, "Hotel"], |
|
["Playotel Premier Vijay Nagar", 4, 22.756761, 75.903342, "Hotel"], |
|
["Papaya Tree", 3, 22.626778, 75.804808, "Hotel"], |
|
["ENRISE BY SAYAJI", 4, 22.625697, 75.803255, "Hotel"], |
|
["Chokhi Dhani Indore", 3, 22.589608, 75.900815, "Resort"] |
|
] |
|
|
|
app = gr.Interface( |
|
fn=predict_cluster, |
|
inputs=inputs, |
|
outputs=outputs, |
|
examples=examples, |
|
title="Property Clustering Prediction", |
|
description=( |
|
"Enter the details of a property to predict its cluster. " |
|
"The model uses star rating, geographical location, and property type for clustering. " |
|
"Clusters represent property categories such as hotels, apartments, resorts, etc." |
|
), |
|
theme="default" |
|
) |
|
|
|
|
|
app.launch() |