from flask import Flask, render_template import pandas as pd from scipy.cluster.hierarchy import linkage, dendrogram import seaborn as sns import io import base64 import matplotlib.pyplot as plt import numpy as np app = Flask(__name__) # Загрузка данных из файла bgg_dataset.csv data = pd.read_csv("bgg_dataset.csv", delimiter=";") # Обработка данных: преобразование строк в числа и замена ',' на '.' data['Rating Average'] = data['Rating Average'].str.replace(',', '.').astype(float) data['Complexity Average'] = data['Complexity Average'].str.replace(',', '.').astype(float) data['Year Published'] = pd.to_numeric(data['Year Published'], errors='coerce') # Если есть строки, которые не являются числами, они будут заменены на NaN # Замена пропущенных значений средними значениями по столбцам features = data[['Year Published', 'Users Rated', 'Rating Average', 'BGG Rank', 'Owned Users', 'Complexity Average']] features = features.fillna(features.mean()) # Проверка наличия бесконечных значений if not features.applymap(np.isfinite).all().all(): raise ValueError("Data contains infinite values") # Вычисление матрицы расстояний и построение кластеров с использованием модели linkage linkage_matrix = linkage(features, method='ward') @app.route('/') def index(): # Создание изображения кластеризации sns.set(style='white') g = sns.clustermap(features, row_linkage=linkage_matrix, col_cluster=False, figsize=(18, 12)) # Сохранение изображения в буфер img_buffer = io.BytesIO() g.savefig(img_buffer, format='png') img_buffer.seek(0) # Преобразование изображения в base64 строку img_base64 = base64.b64encode(img_buffer.read()).decode() # Освобождение ресурсов plt.close(g.fig) return render_template('index.html', cluster_image=img_base64) if __name__ == '__main__': app.run(port=5000, debug=True)