252 lines
47 KiB
Plaintext
252 lines
47 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
" ## Вариант 13 \n",
|
||
" https://www.kaggle.com/datasets/nancyalaswad90/yamana-gold-inc-stock-price?resource=download\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 29,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"ename": "UnicodeDecodeError",
|
||
"evalue": "'utf-8' codec can't decode bytes in position 15-16: invalid continuation byte",
|
||
"output_type": "error",
|
||
"traceback": [
|
||
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
|
||
"\u001b[1;31mUnicodeDecodeError\u001b[0m Traceback (most recent call last)",
|
||
"Cell \u001b[1;32mIn[29], line 3\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[1;32m----> 3\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread_csv\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m..//static//csv//Yamana_Gold_Inc._AUY.csv\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msep\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m,\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnrows\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m10000\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 4\u001b[0m data \u001b[38;5;241m.\u001b[39mcolumns\n",
|
||
"File \u001b[1;32mc:\\Users\\alexk\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\io\\parsers\\readers.py:1026\u001b[0m, in \u001b[0;36mread_csv\u001b[1;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)\u001b[0m\n\u001b[0;32m 1013\u001b[0m kwds_defaults \u001b[38;5;241m=\u001b[39m _refine_defaults_read(\n\u001b[0;32m 1014\u001b[0m dialect,\n\u001b[0;32m 1015\u001b[0m delimiter,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1022\u001b[0m dtype_backend\u001b[38;5;241m=\u001b[39mdtype_backend,\n\u001b[0;32m 1023\u001b[0m )\n\u001b[0;32m 1024\u001b[0m kwds\u001b[38;5;241m.\u001b[39mupdate(kwds_defaults)\n\u001b[1;32m-> 1026\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_read\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n",
|
||
"File \u001b[1;32mc:\\Users\\alexk\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\io\\parsers\\readers.py:620\u001b[0m, in \u001b[0;36m_read\u001b[1;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[0;32m 617\u001b[0m _validate_names(kwds\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnames\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m))\n\u001b[0;32m 619\u001b[0m \u001b[38;5;66;03m# Create the parser.\u001b[39;00m\n\u001b[1;32m--> 620\u001b[0m parser \u001b[38;5;241m=\u001b[39m \u001b[43mTextFileReader\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 622\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m chunksize \u001b[38;5;129;01mor\u001b[39;00m iterator:\n\u001b[0;32m 623\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parser\n",
|
||
"File \u001b[1;32mc:\\Users\\alexk\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\io\\parsers\\readers.py:1620\u001b[0m, in \u001b[0;36mTextFileReader.__init__\u001b[1;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[0;32m 1617\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m kwds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 1619\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles: IOHandles \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m-> 1620\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_engine \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_engine\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mengine\u001b[49m\u001b[43m)\u001b[49m\n",
|
||
"File \u001b[1;32mc:\\Users\\alexk\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\io\\parsers\\readers.py:1898\u001b[0m, in \u001b[0;36mTextFileReader._make_engine\u001b[1;34m(self, f, engine)\u001b[0m\n\u001b[0;32m 1895\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(msg)\n\u001b[0;32m 1897\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m-> 1898\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmapping\u001b[49m\u001b[43m[\u001b[49m\u001b[43mengine\u001b[49m\u001b[43m]\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1899\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[0;32m 1900\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
|
||
"File \u001b[1;32mc:\\Users\\alexk\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\io\\parsers\\c_parser_wrapper.py:93\u001b[0m, in \u001b[0;36mCParserWrapper.__init__\u001b[1;34m(self, src, **kwds)\u001b[0m\n\u001b[0;32m 90\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m kwds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdtype_backend\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpyarrow\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m 91\u001b[0m \u001b[38;5;66;03m# Fail here loudly instead of in cython after reading\u001b[39;00m\n\u001b[0;32m 92\u001b[0m import_optional_dependency(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpyarrow\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m---> 93\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reader \u001b[38;5;241m=\u001b[39m \u001b[43mparsers\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mTextReader\u001b[49m\u001b[43m(\u001b[49m\u001b[43msrc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 95\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39munnamed_cols \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reader\u001b[38;5;241m.\u001b[39munnamed_cols\n\u001b[0;32m 97\u001b[0m \u001b[38;5;66;03m# error: Cannot determine type of 'names'\u001b[39;00m\n",
|
||
"File \u001b[1;32mparsers.pyx:574\u001b[0m, in \u001b[0;36mpandas._libs.parsers.TextReader.__cinit__\u001b[1;34m()\u001b[0m\n",
|
||
"File \u001b[1;32mparsers.pyx:663\u001b[0m, in \u001b[0;36mpandas._libs.parsers.TextReader._get_header\u001b[1;34m()\u001b[0m\n",
|
||
"File \u001b[1;32mparsers.pyx:874\u001b[0m, in \u001b[0;36mpandas._libs.parsers.TextReader._tokenize_rows\u001b[1;34m()\u001b[0m\n",
|
||
"File \u001b[1;32mparsers.pyx:891\u001b[0m, in \u001b[0;36mpandas._libs.parsers.TextReader._check_tokenize_status\u001b[1;34m()\u001b[0m\n",
|
||
"File \u001b[1;32mparsers.pyx:2053\u001b[0m, in \u001b[0;36mpandas._libs.parsers.raise_parser_error\u001b[1;34m()\u001b[0m\n",
|
||
"File \u001b[1;32m<frozen codecs>:322\u001b[0m, in \u001b[0;36mdecode\u001b[1;34m(self, input, final)\u001b[0m\n",
|
||
"\u001b[1;31mUnicodeDecodeError\u001b[0m: 'utf-8' codec can't decode bytes in position 15-16: invalid continuation byte"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"\n",
|
||
"data = pd.read_csv(\"..//static//csv//Yamana_Gold_Inc._AUY.csv\", sep=\",\", nrows=10000)\n",
|
||
"data .columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#1. Бизнес-цели для набора данных по акции компании Yamana Gold Inc.\n",
|
||
"Цель 1: Прогнозирование изменения цены акции компании.\n",
|
||
"Прогнозирование цен на акции является одной из ключевых задач в области финансов и инвестирования. Задача состоит в предсказании будущих изменений стоимости акции на основе исторических данных, таких как открытие и закрытие торгов, объемы торгов и другие показатели.\n",
|
||
"\n",
|
||
"Цель 2: Оценка волатильности акций компании.\n",
|
||
"Измерение волатильности позволяет инвесторам оценить риск и принять решения по управлению капиталом. Задача заключается в прогнозировании уровня волатильности на основе исторической динамики цен, объемов торгов и других рыночных факторов.\n",
|
||
"\n",
|
||
"#2. Цели технического проекта для каждой бизнес-цели\n",
|
||
"Цель 1: Прогнозирование изменения цены акции компании\n",
|
||
"\n",
|
||
"Разработать модель машинного обучения для прогнозирования будущих цен акций на основе исторических данных.\n",
|
||
"Использовать регрессионные модели, такие как линейная регрессия или более сложные модели, например, LSTM (долгосрочная краткосрочная память) для временных рядов.\n",
|
||
"Цель 2: Оценка волатильности акций компании\n",
|
||
"\n",
|
||
"Создать модель, которая будет прогнозировать волатильность на основе исторических данных о ценах.\n",
|
||
"Использовать методы статистического анализа, такие как вычисление стандартного отклонения, или методы машинного обучения для более точной оценки волатильности.\n",
|
||
"\n",
|
||
"#3 Проверим датасет на пропуски и удалим при необходимости строки с недостающими данными"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 27,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Id 0\n",
|
||
"Name 0\n",
|
||
"Short description 0\n",
|
||
"Gender 0\n",
|
||
"Country 0\n",
|
||
"Occupation 0\n",
|
||
"Birth year 0\n",
|
||
"Death year 0\n",
|
||
"Manner of death 0\n",
|
||
"Age of death 0\n",
|
||
"dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 27,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"\n",
|
||
"# Проверим на пропущенные значения\n",
|
||
"data.isnull().sum()\n",
|
||
"\n",
|
||
"# Заполним пропуски или удалим строки с пропусками\n",
|
||
"data = data.dropna()\n",
|
||
"\n",
|
||
"# Проверим, что данные очищены\n",
|
||
"data.isnull().sum()\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Конструирование признаков"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 28,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"ename": "KeyError",
|
||
"evalue": "\"None of [Index(['Close', 'SMA_5', 'SMA_20', 'STD_5', 'STD_20'], dtype='object')] are in the [columns]\"",
|
||
"output_type": "error",
|
||
"traceback": [
|
||
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
|
||
"\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
|
||
"Cell \u001b[1;32mIn[28], line 4\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01msklearn\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mmodel_selection\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m train_test_split\n\u001b[0;32m 3\u001b[0m \u001b[38;5;66;03m# Отделяем целевую переменную (например, Price_Change) и признаки\u001b[39;00m\n\u001b[1;32m----> 4\u001b[0m X \u001b[38;5;241m=\u001b[39m \u001b[43mdata\u001b[49m\u001b[43m[\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mClose\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mSMA_5\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mSMA_20\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mSTD_5\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mSTD_20\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m]\u001b[49m\n\u001b[0;32m 5\u001b[0m y \u001b[38;5;241m=\u001b[39m data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mPrice_Change\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m 7\u001b[0m \u001b[38;5;66;03m# Разделение на обучающую, контрольную и тестовую выборки (60%, 20%, 20%)\u001b[39;00m\n",
|
||
"File \u001b[1;32mc:\\Users\\alexk\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\frame.py:4108\u001b[0m, in \u001b[0;36mDataFrame.__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 4106\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m is_iterator(key):\n\u001b[0;32m 4107\u001b[0m key \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m(key)\n\u001b[1;32m-> 4108\u001b[0m indexer \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcolumns\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_indexer_strict\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcolumns\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m[\u001b[38;5;241m1\u001b[39m]\n\u001b[0;32m 4110\u001b[0m \u001b[38;5;66;03m# take() does not accept boolean indexers\u001b[39;00m\n\u001b[0;32m 4111\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(indexer, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdtype\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mbool\u001b[39m:\n",
|
||
"File \u001b[1;32mc:\\Users\\alexk\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\indexes\\base.py:6200\u001b[0m, in \u001b[0;36mIndex._get_indexer_strict\u001b[1;34m(self, key, axis_name)\u001b[0m\n\u001b[0;32m 6197\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 6198\u001b[0m keyarr, indexer, new_indexer \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reindex_non_unique(keyarr)\n\u001b[1;32m-> 6200\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_raise_if_missing\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkeyarr\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mindexer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis_name\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 6202\u001b[0m keyarr \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtake(indexer)\n\u001b[0;32m 6203\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(key, Index):\n\u001b[0;32m 6204\u001b[0m \u001b[38;5;66;03m# GH 42790 - Preserve name from an Index\u001b[39;00m\n",
|
||
"File \u001b[1;32mc:\\Users\\alexk\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\indexes\\base.py:6249\u001b[0m, in \u001b[0;36mIndex._raise_if_missing\u001b[1;34m(self, key, indexer, axis_name)\u001b[0m\n\u001b[0;32m 6247\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m nmissing:\n\u001b[0;32m 6248\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m nmissing \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mlen\u001b[39m(indexer):\n\u001b[1;32m-> 6249\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNone of [\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkey\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m] are in the [\u001b[39m\u001b[38;5;132;01m{\u001b[39;00maxis_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m]\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 6251\u001b[0m not_found \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m(ensure_index(key)[missing_mask\u001b[38;5;241m.\u001b[39mnonzero()[\u001b[38;5;241m0\u001b[39m]]\u001b[38;5;241m.\u001b[39munique())\n\u001b[0;32m 6252\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mnot_found\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m not in index\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
|
||
"\u001b[1;31mKeyError\u001b[0m: \"None of [Index(['Close', 'SMA_5', 'SMA_20', 'STD_5', 'STD_20'], dtype='object')] are in the [columns]\""
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"\n",
|
||
"# Отделяем целевую переменную (например, Price_Change) и признаки\n",
|
||
"X = data[['Close', 'SMA_5', 'SMA_20', 'STD_5', 'STD_20']]\n",
|
||
"y = data['Price_Change']\n",
|
||
"\n",
|
||
"# Разделение на обучающую, контрольную и тестовую выборки (60%, 20%, 20%)\n",
|
||
"X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, shuffle=False)\n",
|
||
"X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, shuffle=False)\n",
|
||
"\n",
|
||
"# Проверка размеров выборок\n",
|
||
"(X_train.shape, X_val.shape, X_test.shape)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Разобьем данные на выборки и сбалансируем их"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Train: (6000, 5), Validation: (2000, 5), Test: (2000, 5)\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"\n",
|
||
"# Разделение данных на признаки и целевую переменную\n",
|
||
"X = df.drop(columns=['Age of death', 'Name', 'Short description', 'Id'])\n",
|
||
"y = df['Age of death']\n",
|
||
"\n",
|
||
"# Разбиение на обучающую, контрольную и тестовую выборки\n",
|
||
"X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42)\n",
|
||
"X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)\n",
|
||
"\n",
|
||
"# Проверка размеров выборок\n",
|
||
"print(f\"Train: {X_train.shape}, Validation: {X_val.shape}, Test: {X_test.shape}\")\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Оценка сбалансированности и аугментация данных"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAqQAAAIQCAYAAABXHXzKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJmUlEQVR4nO3dfXzN9eP/8efZNZtthu1QLpbINTXSoijLiEr4iI+Y7EMfn1EoaUWuitIVclV9ZF3wUeqjC0WNpGK0hFwnn2nCtqRtLtrG9v790W/n69iwY4fXNo/77XZuN+f9fr1f79f7vM7h6fV+v19vm2VZlgAAAABDPEw3AAAAAFc2AikAAACMIpACAADAKAIpAAAAjCKQAgAAwCgCKQAAAIwikAIAAMAoAikAAACMIpACAADAKAIpAMBlU6dOVUFBgSSpoKBA06ZNM9wiuGL79u368MMPHe+3bNmiTz/91FyDcMUjkAKSEhISZLPZHC8/Pz81bNhQw4cPV3p6uunmAWXOm2++qRdeeEG//vqrXnzxRb355pummwQXHDt2TA8++KA2bNigvXv36uGHH9a2bdtMNwtXMC/TDQDKksmTJys8PFw5OTn69ttvNW/ePH322Wfavn27KleubLp5QJkxefJkDRw4UGPHjpWvr6/eeecd002CCyIjIx0vSWrYsKGGDBliuFW4ktksy7JMNwIwLSEhQQ888ICSk5PVunVrx/JHHnlEL730khYvXqx+/foZbCFQ9mRkZOjnn39WgwYNVKNGDdPNwUXYuXOn/vzzTzVv3lw+Pj6mm4MrGKfsgfO4/fbbJUkpKSmSpKNHj+rRRx9V8+bNFRAQoMDAQHXt2lVbt24tsm1OTo4mTpyohg0bys/PTzVr1lTPnj21b98+SdL+/fudLhM4+9WxY0dHXV999ZVsNpveffddPfHEE7Lb7fL399fdd9+tAwcOFNn3xo0b1aVLFwUFBaly5crq0KGD1q1bV+wxduzYsdj9T5w4sUjZd955RxEREapUqZJCQkLUt2/fYvd/vmM7U0FBgWbMmKGmTZvKz89PYWFhevDBB/XHH384latXr566d+9eZD/Dhw8vUmdxbX/++eeLfKaSlJubqwkTJujaa6+Vr6+vateurccee0y5ubnFflZn6tixo5o1a1Zk+QsvvCCbzab9+/c7Lc/MzNTIkSNVu3Zt+fr66tprr9Vzzz3nuA7zTBMnTiz2sxs0aJBTuYMHD2rw4MEKCwuTr6+vmjZtqjfeeMOpTOF3p/Dl6+urhg0batq0aTp7PGLz5s3q2rWrAgMDFRAQoE6dOmnDhg1OZQovb9m/f79CQ0N18803q1q1amrRooVsNpsSEhLO+7mdfXnMhb53rhyjO38fhX0QGhqqU6dOOa37z3/+42jvkSNHnNatWLFCt9xyi/z9/VWlShV169ZNO3bscCozaNAgBQQEFGnX+++/L5vNpq+++sqxzNXv2dy5c9W0aVP5+vqqVq1aiouLU2ZmplOZjh07On4LTZo0UUREhLZu3VrsbxS4XDhlD5xHYXisVq2aJOl///ufPvzwQ/3tb39TeHi40tPT9eqrr6pDhw7auXOnatWqJUnKz89X9+7dtXr1avXt21cPP/ywjh07psTERG3fvl3169d37KNfv3668847nfYbHx9fbHueeeYZ2Ww2jR07VhkZGZoxY4aioqK0ZcsWVapUSZL05ZdfqmvXroqIiNCECRPk4eGhhQsX6vbbb9c333yjG2+8sUi9V199teOmlOPHj2vYsGHF7nv8+PHq06eP/vGPf+i3337TK6+8oltvvVWbN29WcHBwkW2GDh2qW265RZL03//+V8uWLXNa/+CDDzpGpx966CGlpKRo9uzZ2rx5s9atWydvb+9iPwdXZGZmFnvDTUFBge6++259++23Gjp0qBo3bqxt27bp5Zdf1k8//eR0w0dpnTx5Uh06dNDBgwf14IMPqk6dOlq/fr3i4+N1+PBhzZgxo9jt3n77bcefR40a5bQuPT1dN910k2w2m4YPH64aNWpoxYoVio2NVXZ2tkaOHOlU/oknnlDjxo31559/OoJbaGioYmNjJUk7duzQLbfcosDAQD322GPy9vbWq6++qo4dO2rt2rVq27btOY/v7bffdvn6w8LLYwoV971z9Rgvxe/j2LFjWr58ue69917HsoULF8rPz085OTlFPoeYmBhFR0frueee08mTJzVv3jy1b99emzdvVr169Vz6jFw1ceJETZo0SVFRURo2bJj27NmjefPmKTk5+YK/p7Fjx17StgEXZAGwFi5caEmyVq1aZf3222/WgQMHrCVLlljVqlWzKlWqZP3666+WZVlWTk6OlZ+f77RtSkqK5evra02ePNmx7I033rAkWS+99FKRfRUUFDi2k2Q9//zzRco0bdrU6tChg+P9mjVrLEnWVVddZWVnZzuWv/fee5Yka+bMmY66GzRoYEVHRzv2Y1mWdfLkSSs8PNy64447iuzr5ptvtpo1a+Z4/9tvv1mSrAkTJjiW7d+/3/L09LSeeeYZp223bdtmeXl5FVm+d+9eS5L15ptvOpZNmDDBOvOvnG+++caSZC1atMhp25UrVxZZXrduXatbt25F2h4XF2ed/dfY2W1/7LHHrNDQUCsiIsLpM3377bctDw8P65tvvnHafv78+ZYka926dUX2d6YOHTpYTZs2LbL8+eeftyRZKSkpjmVTpkyx/P39rZ9++smp7OOPP255enpaqampTsuffPJJy2azOS2rW7euFRMT43gfGxtr1axZ0zpy5IhTub59+1pBQUHWyZMnLcv6v+/OmjVrHGVycnIsDw8P61//+pdjWY8ePSwfHx9r3759jmWHDh2yqlSpYt16662OZYW/lcLjy8nJserUqWN17drVkmQtXLiw6Id1hsLtk5OTnZYX971z9Rjd+fso/L7269fP6t69u2P5L7/8Ynl4eFj9+vWzJFm//fabZVmWdezYMSs4ONgaMmSIU1vT0tKsoKAgp+UxMTGWv79/kc9m6dKlRfqqpN+zjIwMy8fHx+rcubPT31GzZ8+2JFlvvPGGU51n/hY+++wzS5LVpUuXIr8n4HLhlD1whqioKNWoUUO1a9dW3759FRAQoGXLlumqq66SJPn6+srD46+fTX5+vn7//XcFBATouuuu0w8//OCo54MPPlD16tU1YsSIIvsozSmxgQMHqkqVKo73vXv3Vs2aNfXZZ59J+mvqlr179+rvf/+7fv/9dx05ckRHjhzRiRMn1KlTJ3399ddFThHn5OTIz8/vvPv973//q4KCAvXp08dR55EjR2S329WgQQOtWbPGqXxeXp6kvz6vc1m6dKmCgoJ0xx13ONUZERGhgICAInWeOnXKqdyRI0eKjFCd7eDBg3rllVc0fvz4IqdIly5dqsaNG6tRo0ZOdRZepnH2/ktj6dKluuWWW1S1alWnfUVFRSk/P19ff/21U/m8vLzzfnaWZemDDz7QXXfdJcuynOqMjo5WVlaW0/dRkrKysnTkyBGlpqZq+vTpKigocBxrfn6+vvjiC/Xo0UPXXHONY5uaNWvq73//u7799ltlZ2cX25Y5c+bo999/14QJEy7243HbMV6K38fgwYO1cuVKpaWlSfprdoHIyEg1bNjQqVxiYqIyMzPVr18/p7Z6enqqbdu2xX6fzv4+Hzt2rNjPIj8/v0jZkydPOpVZtWqV8vLyNHLkSMffUZI0ZMgQBQYGnnNKJ8uyFB8fr169ep13FBy41DhlD5xhzpw5atiwoby8vBQWFqbrrrvO6S/3goICzZw5U3PnzlVKSory8/Md6wpP60t/neq/7rrr5OXl3p9YgwYNnN7bbDZde+21juvI9u7dK0mKiYk5Zx1ZWVmqWrWq4/2RI0eK1Hu2vXv3yrKsc5Y7+1Rg4TVrxV0nd2adWVlZCg0NLXZ9RkaG0/svvvjC5RtnJkyYoFq1aunBBx/U+++/X2T/u3btOmedZ++/NPbu3asff/yxxPvKzMw872f322+/KTMzU6+99ppee+21EtXZo0cPx589PDw0btw49erVy1HfyZMndd111xWpp3HjxiooKNCBAwfUtGlTp3VZWVmaOnWqRo8erbCwsHO292JczDFeit9Hq1at1KxZM7311lsaM2aMEhIS9MQTTxS5NrWw7sKQf7bAwECn9ydOnCjx93n37t0XLPvLL79IUpE+9PHx0TXXXONYf7ZFixZpx44deu+997R48eIStQe4FAikwBluvPFGp7vszzZ16lSNHz9egwcP1pQpUxQSEiIPDw+NHDmy2JtTLrfCNjz//PNq1apVsWXODDp5eXk6fPiw7rjjjgvWa7PZtGLFCnl6ep63TkmO0SS73X7eOkNDQ7Vo0aJi15/9D3Dbtm319NNPOy2bPXu2Pvroo2K337VrlxISEvTOO+8Ue+1cQUGBmjdvrpdeeqnY7WvXrn3OtruqoKBAd9xxhx577LFi15892paWlnbBz06S7r///nOGqxYtWji9f+GFF9SyZUudOnVKycnJevrpp+Xl5VWqkc3nnntOHh4eGjNmjH7//feLrqc4F3OMJa2zpL+PQoMHD9bcuXN14403Ki0tTX369NGLL75YbN1vv/12sX139n9O/fz89Mknnzgt++abbzR58uQi29arV0+vv/6607KlS5eeM6iXVF5ensaPH6/Y2Ngi30HgciOQAi54//33ddttt2nBggVOyzMzM1W9enXH+/r162vjxo06deqUW27MKVQ4ClPIsiz9/PPPjn+YC2+WCgwMVFRU1AXr27p1q06d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AKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAHCJdOzYUSNHjnS8r1evnmbMmHHebWw2mz788MNS79td9VwOXqYbAAAArmCL77u8+/v7uyUuetddd+nUqVNauXJlkXXffPONbr31Vm3dulUtWrQocZ3Jycny9/cvcfmSmDhxoj788ENt2bLFafnhw4dVtWpVt+7rUmGEFAAAoBixsbFKTEzUr7/+WmTdwoUL1bp1a5fCqCTVqFFDlStXdlcTz8tut8vX1/ey7Ku0CKQAAADF6N69u2rUqKGEhASn5cePH9fSpUvVo0cP9evXT1dddZUqV66s5s2b6z//+c956zz7lP3evXt16623ys/PT02aNFFiYmKRbcaOHauGDRuqcuXKuuaaazR+/HidOnVKkpSQkKBJkyZp69atstlsstlsjvaefcp+27Ztuv3221WpUiVVq1ZNQ4cO1fHjxx3rBw0apB49euiFF15QzZo1Va1aNcXFxTn2dSkRSAEAAIrh5eWlgQMHKiEhQZZlOZYvXbpU+fn5uv/++xUREaFPP/1U27dv19ChQzVgwAB99913Jaq/oKBAPXv2lI+PjzZu3Kj58+dr7NixRcpVqVJFCQkJ2rlzp2bOnKnXX39dL7/8siTpvvvu0yOPPKKmTZvq8OHDOnz4sO67r+hlECdOnFB0dLSqVq2q5ORkLV26VKtWrdLw4cOdyq1Zs0b79u3TmjVr9OabbyohIaFIIL8UCKQAAADnMHjwYO3bt09r1651LFu4cKF69eqlunXr6tFHH1WrVq10zTXXaMSIEerSpYvee++9EtW9atUq7d69W2+99ZZatmypW2+9VVOnTi1Sbty4cbr55ptVr1493XXXXXr00Ucd+6hUqZICAgLk5eUlu90uu92uSpUqFalj8eLFysnJ0VtvvaVmzZrp9ttv1+zZs/X2228rPT3dUa5q1aqaPXu2GjVqpO7du6tbt25avXq1qx+bywikAAAA59CoUSPdfPPNeuONNyRJP//8s7755hvFxsYqPz9fU6ZMUfPmzRUSEqKAgAB9/vnnSk1NLVHdu3btUu3atVWrVi3HssjIyCLl3n33XbVr1052u10BAQEaN25cifdx5r5atmzpdENVu3btVFBQoD179jiWNW3aVJ6eno73NWvWVEZGhkv7uhgEUgAAgPOIjY3VBx98oGPHjmnhwoWqX7++OnTooOeff14zZ87U2LFjtWbNGm3ZskXR0dHKy8tz276TkpLUv39/3XnnnVq+fLk2b96sJ5980q37OJO3t7fTe5vNpoKCgkuyrzMRSAEAAM6jT58+8vDw0OLFi/XWW29p8ODBstlsWrdune655x7df//9atmypa655hr99NNPJa63cePGOnDggA4fPuxYtmHDBqcy69evV926dfXkk0+qdevWatCggX755RenMj4+PsrPz7/gvrZu3aoTJ044lq1bt04eHh667rrrStzmS4VACgAAcB4BAQG67777FB8fr8OHD2vQoEGSpAYNGigxMVHr16/Xrl279OCDDzpdj3khUVFRatiwoWJiYrR161Z98803evLJJ53KNGjQQKmpqVqyZIn27dunWbNmadmyZU5l6tWrp5SUFG3ZskVHjhxRbm5ukX31799ffn5+iomJ0fbt27VmzRqNGDFCAwYMUFhYmOsfipsRSAEAAC4gNjZWf/zxh6Kjox3XfI4bN0433HCDoqOj1bFjR9ntdvXo0aPEdXp4eGjZsmX6888/deONN+of//iHnnnmGacyd999t0aNGqXhw4erVatWWr9+vcaPH+9UplevXurSpYtuu+021ahRo9ippypXrqzPP/9cR48eVZs2bdS7d2916tRJs2fPdv3DuARs1pnzGJQT2dnZCgoKUlZWlgIDA003BwBQjsUmJLutrgWD2ritrookJydHKSkpCg8Pl5+fn+nmwI3O17eu5DVGSAEAAGAUgRQAAABGEUgBAABgFIEUAAAARhFIAQAAYBSBFAAAAEYRSAEAAGAUgRQAAABGEUgBAABgFIEUAAAARnmZbgAAALhyDV89/LLub3ankj+73WaznXf9hAkTNHHixItqh81m07Jly9SjR4+L2r6iIZACAAAU4/Dhw44/v/vuu3rqqae0Z88ex7KAgAATzaqQOGUPAABQDLvd7ngFBQXJZrM5LVuyZIkaN24sPz8/NWrUSHPnznVsm5eXp+HDh6tmzZry8/NT3bp1NW3aNElSvXr1JEn33nuvbDab4/2VjBFSAAAAFy1atEhPPfWUZs+ereuvv16bN2/WkCFD5O/vr5iYGM2aNUsff/yx3nvvPdWpU0cHDhzQgQMHJEnJyckKDQ3VwoUL1aVLF3l6eho+GvMIpAAAAC6aMGGCXnzxRfXs2VOSFB4erp07d+rVV19VTEyMUlNT1aBBA7Vv3142m01169Z1bFujRg1JUnBwsOx2u5H2lzUEUgAAABecOHFC+/btU2xsrIYMGeJYfvr0aQUFBUmSBg0apDvuuEPXXXedunTpou7du6tz586mmlzmEUgBAABccPz4cUnS66+/rrZt2zqtKzz9fsMNNyglJUUrVqzQqlWr1KdPH0VFRen999+/7O0tDwikAAAALggLC1OtWrX0v//9T/379z9nucDAQN13332677771Lt3b3Xp0kVHjx5VSEiIvL29lZ+ffxlbXbYRSAEAAFw0adIkPfTQQwoKClKXLl2Um5ur77//Xn/88YdGjx6tl156STVr1tT1118vDw8PLV26VHa7XcHBwZL+utN+9erVateunXx9fVW1alWzB2QY0z4BAAC46B//+If+/e9/a+HChWrevLk6dOighIQEhYeHS5KqVKmi6dOnq3Xr1mrTpo3279+vzz77TB4ef0WvF198UYmJiapdu7auv/56k4dSJtgsy7JMN8JV2dnZCgoKUlZWlgIDA003BwBQjsUmJLutrgWD2ritrookJydHKSkpCg8Pl5+fn+nmwI3O17eu5DVGSAEAAGAUgRQAAABGEUgBAABgFIEUAAAARhFIAQDAZVEO76PGBbirTwmkAADgkvL29pYknTx50nBL4G6FfVrYxxeLifEBAMAl5enpqeDgYGVkZEiSKleuLJvNZrhVKA3LsnTy5EllZGQoODjY8cjUi0UgBQAAl5zdbpckRyhFxRAcHOzo29IgkAIAgEvOZrOpZs2aCg0N1alTp0w3B27g7e1d6pHRQgRSAABw2Xh6erotxKDi4KYmAAAAGEUgBQAAgFEEUgAAABjFNaQAgMsiNiHZbXUtGNTGbXUBMI8RUgAAABhFIAUAAIBRBFIAAAAYRSAFAACAUS4F0okTJ8pmszm9GjVq5Fifk5OjuLg4VatWTQEBAerVq5fS09Od6khNTVW3bt1UuXJlhYaGasyYMTp9+rR7jgYAAADljst32Tdt2lSrVq36vwq8/q+KUaNG6dNPP9XSpUsVFBSk4cOHq2fPnlq3bp0kKT8/X926dZPdbtf69et1+PBhDRw4UN7e3po6daobDgcAAADljcuB1MvLS3a7vcjyrKwsLViwQIsXL9btt98uSVq4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euop1axZU5UqVVJUVJT27t1rsMVXtvz8fI0fP17h4eGqVKmS6tevrylTpjg9/5s+M+/rr7/WXXfdpVq1aslms+nDDz90Wl+SPjp69Kj69++vwMBABQcHKzY2VsePH7+MR1F2VZhA+u6772r06NGaMGGCfvjhB7Vs2VLR0dHKyMgw3TRIWrt2reLi4rRhwwYlJibq1KlT6ty5s06cOOEoM2rUKH3yySdaunSp1q5dq0OHDqlnz54GW41CycnJevXVV9WiRQun5fRZ2fPHH3+oXbt28vb21ooVK7Rz5069+OKLqlq1qqPM9OnTNWvWLM2fP18bN26Uv7+/oqOjlZOTY7DlV67nnntO8+bN0+zZs7Vr1y4999xzmj59ul555RVHGfrMvBMnTqhly5aaM2dOsetL0kf9+/fXjh07lJiYqOXLl+vrr7/W0KFDL9chlG1WBXHjjTdacXFxjvf5+flWrVq1rGnTphlsFc4lIyPDkmStXbvWsizLyszMtLy9va2lS5c6yuzatcuSZCUlJZlqJizLOnbsmNWgQQMrMTHR6tChg/Xwww9blkWflVVjx4612rdvf871BQUFlt1ut55//nnHsszMTMvX19f6z3/+czmaiLN069bNGjx4sNOynj17Wv3797csiz4riyRZy5Ytc7wvSR/t3LnTkmQlJyc7yqxYscKy2WzWwYMHL1vby6oKMUKal5enTZs2KSoqyrHMw8NDUVFRSkpKMtgynEtWVpYkKSQkRJK0adMmnTp1yqkPGzVqpDp16tCHhsXFxalbt25OfSPRZ2XVxx9/rNatW+tvf/ubQkNDdf311+v11193rE9JSVFaWppTvwUFBalt27b0myE333yzVq9erZ9++kmStHXrVn377bfq2rWrJPqsPChJHyUlJSk4OFitW7d2lImKipKHh4c2btx42dtc1hh5UpO7HTlyRPn5+UWe9BQWFqbdu3cbahXOpaCgQCNHjlS7du3UrFkzSVJaWpp8fHwUHBzsVDYsLExpaWkGWglJWrJkiX744QclJycXWUeflU3/+9//NG/ePI0ePVpPPPGEkpOT9dBDD8nHx0cxMTGOvinu70v6zYzHH39c2dnZatSokTw9PZWfn69nnnlG/fv3lyT6rBwoSR+lpaUpNDTUab2Xl5dCQkLoR1WQQIryJS4uTtu3b9e3335ruik4jwMHDujhhx9WYmKi/Pz8TDcHJVRQUKDWrVtr6tSpkqTrr79e27dv1/z58xUTE2O4dSjOe++9p0WLFmnx4sVq2rSptmzZopEjR6pWrVr0Ga4YFeKUffXq1eXp6Vnk7t709HTZ7XZDrUJxhg8fruXLl2vNmjW6+uqrHcvtdrvy8vKUmZnpVJ4+NGfTpk3KyMjQDTfcIC8vL3l5eWnt2rWaNWuWvLy8FBYWRp+VQTVr1lSTJk2cljVu3FipqamS5Ogb/r4sO8aMGaPHH39cffv2VfPmzTVgwACNGjVK06ZNk0SflQcl6SO73V7kRuvTp0/r6NGj9KMqSCD18fFRRESEVq9e7VhWUFCg1atXKzIy0mDLUMiyLA0fPlzLli3Tl19+qfDwcKf1ERER8vb2durDPXv2KDU1lT40pFOnTtq2bZu2bNnieLVu3Vr9+/d3/Jk+K3vatWtXZEq1n376SXXr1pUkhYeHy263O/Vbdna2Nm7cSL8ZcvLkSXl4OP9z7OnpqYKCAkn0WXlQkj6KjIxUZmamNm3a5Cjz5ZdfqqCgQG3btr3sbS5zTN9V5S5LliyxfH19rYSEBGvnzp3W0KFDreDgYCstLc1002BZ1rBhw6ygoCDrq6++sg4fPux4nTx50lHmn//8p1WnTh3ryy+/tL7//nsrMjLSioyMNNhqnO3Mu+wtiz4ri7777jvLy8vLeuaZZ6y9e/daixYtsipXrmy98847jjLPPvusFRwcbH300UfWjz/+aN1zzz1WeHi49eeffxps+ZUrJibGuuqqq6zly5dbKSkp1n//+1+revXq1mOPPeYoQ5+Zd+zYMWvz5s3W5s2bLUnWSy+9ZG3evNn65ZdfLMsqWR916dLFuv76662NGzda3377rdWgQQOrX79+pg6pTKkwgdSyLOuVV16x6tSpY/n4+Fg33nijtWHDBtNNwv8nqdjXwoULHWX+/PNP61//+pdVtWpVq3Llyta9995rHT582FyjUcTZgZQ+K5s++eQTq1mzZpavr6/VqFEj67XXXnNaX1BQYI0fP94KCwuzfH19rU6dOll79uwx1FpkZ2dbDz/8sFWnTh3Lz8/Puuaaa6wnn3zSys3NdZShz8xbs2ZNsf+OxcTEWJZVsj76/fffrX79+lkBAQFWYGCg9cADD1jHjh0zcDRlj82yzngUBAAAAHCZVYhrSAEAAFB+EUgBAABgFIEUAAAARhFIAQAAYBSBFAAAAEYRSAEAAGAUgRQAAABGEUgBAABgFIEUAAAARhFIAQAAYBSBFAAAAEYRSAEAAGDU/wMod4MlEPyCtQAAAABJRU5ErkJggg==",
|
||
"text/plain": [
|
||
"<Figure size 800x600 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import matplotlib.pyplot as plt\n",
|
||
"\n",
|
||
"# Проверка распределения целевой переменной\n",
|
||
"plt.figure(figsize=(8, 6))\n",
|
||
"plt.hist(y_train, bins=30, alpha=0.7, label='Train')\n",
|
||
"plt.hist(y_val, bins=30, alpha=0.7, label='Validation')\n",
|
||
"plt.hist(y_test, bins=30, alpha=0.7, label='Test')\n",
|
||
"plt.legend()\n",
|
||
"plt.title('Распределение целевой переменной')\n",
|
||
"plt.show()\n"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.12.5"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|