IIS_2023_1/orlov_artem_lab_4/app.py

57 lines
1.8 KiB
Python
Raw Normal View History

from flask import Flask, render_template
import pandas as pd
from sklearn.manifold import TSNE
from sklearn.preprocessing import LabelEncoder
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from io import BytesIO
import base64
app = Flask(__name__)
@app.route('/')
def index():
# Load the dataset
df = pd.read_csv('top_240_restaurants_recommended_in_los_angeles_2.csv')
# Select the columns for clustering
columns_for_clustering = ['Rank', 'StarRating', 'NumberOfReviews', 'Style']
# Encode the 'Style' column
label_encoder = LabelEncoder()
df['Style_encoded'] = label_encoder.fit_transform(df['Style'])
# Select the columns for clustering
data_for_clustering = df[['Rank', 'StarRating', 'NumberOfReviews', 'Style_encoded']]
# Perform t-SNE for dimensionality reduction
tsne = TSNE(n_components=2, random_state=42)
tsne_result = tsne.fit_transform(data_for_clustering)
# Perform k-means clustering
kmeans = KMeans(n_clusters=3, random_state=42)
df['Cluster'] = kmeans.fit_predict(data_for_clustering)
# Add t-SNE results to the DataFrame
df['tsne_1'] = tsne_result[:, 0]
df['tsne_2'] = tsne_result[:, 1]
# Save the figure to a BytesIO object
plt.scatter(df['tsne_1'], df['tsne_2'], c=df['Cluster'], cmap='viridis')
plt.title('t-SNE Clustering')
plt.xlabel('t-SNE Component 1')
plt.ylabel('t-SNE Component 2')
plt.tight_layout()
img_data = BytesIO()
plt.savefig(img_data, format='png')
img_data.seek(0)
# Convert the BytesIO object to base64 for embedding in HTML
img_base64 = base64.b64encode(img_data.getvalue()).decode('utf-8')
# Render the HTML template with the embedded image
return render_template('index.html', img_base64=img_base64)
if __name__ == '__main__':
app.run(debug=True)