Spaces:
Sleeping
Sleeping
#import libraries | |
import gradio as gr | |
import pandas as pd | |
import joblib | |
from math import radians, sin, cos, sqrt, atan2 | |
import folium | |
# Load saved scaler and model | |
scaler = joblib.load('scaler.pkl') | |
kmeans_model = joblib.load('kmeans_model.pkl') | |
# Load the dataset | |
csv_file_path = 'properties.csv' | |
df = pd.read_csv(csv_file_path) | |
# Define the haversine function for distance calculation | |
def haversine(lat1, lon1, lat2, lon2): | |
R = 6371 # Radius of the Earth in kilometers | |
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 | |
# Calculate the centroid for distance computation | |
centroid_lat = df['Latitude'].mean() | |
centroid_lon = df['Longitude'].mean() | |
# OneHotEncoder category mapping | |
property_type_mapping = joblib.load('encoder_categories.pkl') | |
# Cluster descriptions | |
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" | |
} | |
# Gradio prediction function | |
def predict_cluster(property_name, star_rating, latitude, longitude, property_type): | |
# Validate inputs | |
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." | |
# Calculate distance from the center | |
distance_from_center = haversine(latitude, longitude, centroid_lat, centroid_lon) | |
# One-hot encode the property type | |
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." | |
# Create a one-hot-encoded vector with the correct length | |
encoded_property_type = [0] * len(property_type_mapping) | |
encoded_property_type[property_type_index] = 1 | |
# Prepare the feature vector | |
feature_vector = [star_rating, distance_from_center] + encoded_property_type | |
# Standardize the feature vector | |
try: | |
scaled_features = scaler.transform([feature_vector]) | |
except ValueError as e: | |
return f"Error during scaling: {e}" | |
# Predict the cluster | |
cluster = kmeans_model.predict(scaled_features)[0] | |
description = cluster_descriptions.get(cluster, "Unknown cluster") | |
# Create a map | |
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 | |
# Create the Gradio interface | |
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" | |
) | |
# Run the Gradio app | |
app.launch() |