IIS_2023_1/volkov_rafael_lab_4/app.py
2023-12-05 12:28:13 +04:00

52 lines
2.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)