58 lines
2.5 KiB
Python
58 lines
2.5 KiB
Python
|
import pandas as pd
|
|||
|
from sklearn.cluster import DBSCAN
|
|||
|
from sklearn.preprocessing import StandardScaler
|
|||
|
import matplotlib.pyplot as plt
|
|||
|
from sklearn.preprocessing import LabelEncoder
|
|||
|
import streamlit as st
|
|||
|
import numpy as np
|
|||
|
|
|||
|
# Загрузка данных
|
|||
|
data = pd.read_csv('data.csv')
|
|||
|
|
|||
|
# Просматриваем нет ли пустых данных
|
|||
|
columns_to_check = ['Жанр', 'Поджанр', 'Количество заказов']
|
|||
|
data = data.dropna(subset=columns_to_check)
|
|||
|
|
|||
|
# Выбираем только строки с жанром животные, так как будем кластеризировать именно в этом жанре
|
|||
|
data = data[data['Жанр'] == 'Животные']
|
|||
|
|
|||
|
# Преобразуем строки в числа
|
|||
|
label_encoder = LabelEncoder()
|
|||
|
data['Поджанр'] = label_encoder.fit_transform(data['Поджанр'])
|
|||
|
|
|||
|
X = data[['Количество заказов', 'Поджанр']]
|
|||
|
|
|||
|
# Масштабирование данных (стандартизация)
|
|||
|
scaler = StandardScaler()
|
|||
|
X_scaled = scaler.fit_transform(X)
|
|||
|
|
|||
|
# Применение DBSCAN
|
|||
|
eps = 0.7 # Радиус окрестности
|
|||
|
min_samples = 1 # Минимальное количество точек в окрестности
|
|||
|
|
|||
|
dbscan = DBSCAN(eps=eps, min_samples=min_samples)
|
|||
|
labels = dbscan.fit_predict(X_scaled)
|
|||
|
|
|||
|
# Добавление меток кластеров в исходные данные
|
|||
|
data['cluster'] = labels
|
|||
|
|
|||
|
# Вывод результата
|
|||
|
st.write(data[['Количество заказов', 'Поджанр', 'cluster']])
|
|||
|
|
|||
|
# Обратное преобразование шкалы для первых двух признаков
|
|||
|
original_data = scaler.inverse_transform(X_scaled[:, :2])
|
|||
|
|
|||
|
# Получение списка сопоставления числовых значений поджанров и их текстовых меток
|
|||
|
label_mapping = dict(zip(label_encoder.transform(label_encoder.classes_), label_encoder.classes_))
|
|||
|
|
|||
|
# Преобразование числовых типов данных NumPy в стандартные Python типы
|
|||
|
label_mapping_serializable = {str(k): v for k, v in label_mapping.items()}
|
|||
|
st.write(label_mapping_serializable)
|
|||
|
|
|||
|
# Визуализация кластеров с изначальными данными на осях
|
|||
|
fig, ax = plt.subplots()
|
|||
|
ax.scatter(original_data[:, 1], original_data[:, 0], c=labels, cmap='viridis')
|
|||
|
ax.set_title('DBSCAN Clustering')
|
|||
|
ax.set_xlabel('Поджанр')
|
|||
|
ax.set_ylabel('Количество заказов')
|
|||
|
st.pyplot(fig)
|