#   *Дополнительные задания:

#   1). Загрузите датасет Wine из встроенных датасетов sklearn.datasets с помощью функции load_wine в переменную data.
import pandas as pd
import numpy as np

from sklearn.datasets import load_wine

Wine = load_wine()

#   2). Полученный датасет не является датафреймом. Это структура данных, имеющая ключи аналогично словарю.
#   Просмотрите тип данных этой структуры данных
print(type(Wine))
#   и создайте список data_keys, содержащий ее ключи.
data_keys = Wine.keys()
print(f'Ключи:\n'
      f'{data_keys}\n')

#   3). Просмотрите данные,
print(f'Данные:\n'
      f'{Wine.data}\n')
#   описание
print(f'Описание:'
      f'{Wine.DESCR}')
#   и названия признаков в датасете.
print(f'Название признаков:\n'
      f'{Wine.feature_names}\n')
#   Описание нужно вывести в виде привычного, аккуратно оформленного текста, без обозначений переноса строки, но с
#   самими переносами и т.д.

#   4). Сколько классов содержит целевая переменная датасета?
print(
    f'Целевая переменная содержит {len(Wine.target_names)} класса:\n'
    f'{Wine.target_names}\n'  # Выведите названия классов.
)

#   5). На основе данных датасета (они содержатся в двумерном массиве Numpy) и названий признаков создайте датафрейм
#   под названием X.
X = pd.DataFrame(
    data=Wine.data,
    columns=Wine.feature_names
)
#   6). Выясните размер датафрейма X
print(
    f'Размер датафрейма Х:\n'
    f'{X.shape}\n'
)
#   и установите, имеются ли в нем пропущенные значения.
X.info()

#   7). Добавьте в датафрейм поле с классами вин в виде чисел, имеющих тип данных numpy.int64. Название поля - 'target'.
X['target'] = Wine['target'].astype(np.int64)

#   8). Постройте матрицу корреляций для всех полей X. Дайте полученному датафрейму название X_corr.
X_corr = X.corr()

#   9). Создайте список high_corr из признаков, корреляция которых с полем target по абсолютному значению превышает 0.5
#   (причем, само поле target не должно входить в этот список).
high_corr = X_corr.target
high_corr = high_corr[np.abs(high_corr) > 0.5].drop('target', axis=0)
high_corr = list(high_corr.index)

#   10). Удалите из датафрейма X поле с целевой переменной.
X = X.drop('target', axis=1)
#   Для всех признаков, названия которых содержатся в списке high_corr, вычислите квадрат их значений и добавьте в
#   датафрейм X соответствующие поля с суффиксом '_2', добавленного к первоначальному названию признака.
#   Итоговый датафрейм должен содержать все поля, которые, были в нем изначально, а также поля с признаками из списка
#   high_corr, возведенными в квадрат.
for i in high_corr:
    X[i+'_2'] = X[i]**2
#   Выведите описание полей датафрейма X с помощью метода describe.
X.describe()
