52 lines
2.2 KiB
Python
52 lines
2.2 KiB
Python
|
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)
|