from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
from sklearn.preprocessing import StandardScaler

# Загрузка датасета MLB
mlb_data = pd.read_csv('SOCR_Data_MLB_HeightsWeights.txt', sep='\t')
mlb_data.columns = ['Name', 'Team', 'Position', 'Height', 'Weight', 'Age']

# Создаем 3D визуализацию
fig = plt.figure(figsize=(10, 7))
ax = plt.axes(projection='3d')

# Простая scatter plot без разбивки по позициям
ax.scatter3D(mlb_data['Height'], mlb_data['Weight'], mlb_data['Age'])
ax.set_title('3D Scatter Plot: MLB Players')
ax.set_xlabel('Height (inches)')
ax.set_ylabel('Weight (pounds)')
ax.set_zlabel('Age (years)')

plt.show()


# ТЕПЛОВЫЕ КАРТЫ

# Функция для вычисления матрицы частных корреляций
def partial_correlation_matrix(df):
    """
    Вычисляет матрицу частных корреляций
    """
    # Вычисляем матрицу ковариаций
    cov_matrix = np.cov(df.T)

    # Вычисляем обратную матрицу ковариаций
    try:
        inv_cov_matrix = np.linalg.inv(cov_matrix)
    except np.linalg.LinAlgError:
        # Если матрица вырождена, используем псевдообратную
        inv_cov_matrix = np.linalg.pinv(cov_matrix)

    # Вычисляем частные корреляции
    n_features = inv_cov_matrix.shape[0]
    partial_corr_matrix = np.zeros((n_features, n_features))

    for i in range(n_features):
        for j in range(n_features):
            partial_corr_matrix[i, j] = -inv_cov_matrix[i, j] / np.sqrt(inv_cov_matrix[i, i] * inv_cov_matrix[j, j])

    # Диагональные элементы устанавливаем в 1
    np.fill_diagonal(partial_corr_matrix, 1)

    return partial_corr_matrix


# Создаем фигуру для тепловых карт
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))

# 1. Тепловая карта парных коэффициентов корреляции
numeric_data = mlb_data[['Height', 'Weight', 'Age']]
correlation_matrix = numeric_data.corr()

sns.heatmap(correlation_matrix,
            annot=True,
            cmap='coolwarm',
            center=0,
            vmin=-1,
            vmax=1,
            square=True,
            fmt='.2f',
            cbar_kws={'label': 'Correlation Coefficient'},
            ax=ax1)

ax1.set_title('Тепловая карта парных коэффициентов корреляции\n(Pearson Correlation)')

# 2. Тепловая карта частных коэффициентов корреляции
# Стандартизация данных для частных корреляций
scaler = StandardScaler()
data_scaled = scaler.fit_transform(numeric_data)

# Вычисляем матрицу частных корреляций
partial_corr_matrix = partial_correlation_matrix(data_scaled)
partial_corr_df = pd.DataFrame(partial_corr_matrix,
                               index=numeric_data.columns,
                               columns=numeric_data.columns)

sns.heatmap(partial_corr_df,
            annot=True,
            cmap='coolwarm',
            center=0,
            vmin=-1,
            vmax=1,
            square=True,
            fmt='.2f',
            cbar_kws={'label': 'Partial Correlation Coefficient'},
            ax=ax2)

ax2.set_title('Тепловая карта частных коэффициентов корреляции\n(Partial Correlation)')

plt.tight_layout()
plt.show()

# Вывод числовых значений для анализа
print("=" * 60)
print("АНАЛИЗ КОРРЕЛЯЦИЙ MLB ДАННЫХ")
print("=" * 60)

print("\nПАРНЫЕ КОРРЕЛЯЦИИ (Pearson):")
print(correlation_matrix.round(3))

print("\nЧАСТНЫЕ КОРРЕЛЯЦИИ:")
print(partial_corr_df.round(3))

print("\nИНТЕРПРЕТАЦИЯ:")
print("- Положительные значения: прямая связь между признаками")
print("- Отрицательные значения: обратная связь между признаками")
print("- Близкие к 1 или -1: сильная связь")
print("- Близкие к 0: слабая связь")