diff --git a/lab_4/Lab4.ipynb b/lab_4/Lab4.ipynb index 0a08a96..814ef70 100644 --- a/lab_4/Lab4.ipynb +++ b/lab_4/Lab4.ipynb @@ -9,37 +9,1912 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [ { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[2], line 4\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mmatplotlib\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpyplot\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mplt\u001b[39;00m\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mmatplotlib\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mticker\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mticker\u001b[39;00m\n\u001b[1;32m----> 4\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mseaborn\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01msns\u001b[39;00m\n\u001b[0;32m 6\u001b[0m \u001b[38;5;66;03m# Подключим датафрейм и выгрузим данные\u001b[39;00m\n\u001b[0;32m 7\u001b[0m df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mread_csv(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m.//static//csv//kc_house_data.csv\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[1;32md:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\seaborn\\__init__.py:5\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mutils\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;241m*\u001b[39m \u001b[38;5;66;03m# noqa: F401,F403\u001b[39;00m\n\u001b[0;32m 4\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpalettes\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;241m*\u001b[39m \u001b[38;5;66;03m# noqa: F401,F403\u001b[39;00m\n\u001b[1;32m----> 5\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mrelational\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;241m*\u001b[39m \u001b[38;5;66;03m# noqa: F401,F403\u001b[39;00m\n\u001b[0;32m 6\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mregression\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;241m*\u001b[39m \u001b[38;5;66;03m# noqa: F401,F403\u001b[39;00m\n\u001b[0;32m 7\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcategorical\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;241m*\u001b[39m \u001b[38;5;66;03m# noqa: F401,F403\u001b[39;00m\n", - "File \u001b[1;32md:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\seaborn\\relational.py:21\u001b[0m\n\u001b[0;32m 13\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mutils\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[0;32m 14\u001b[0m adjust_legend_subtitles,\n\u001b[0;32m 15\u001b[0m _default_color,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 18\u001b[0m _scatter_legend_artist,\n\u001b[0;32m 19\u001b[0m )\n\u001b[0;32m 20\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_compat\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m groupby_apply_include_groups\n\u001b[1;32m---> 21\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_statistics\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m EstimateAggregator, WeightedAggregator\n\u001b[0;32m 22\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01maxisgrid\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m FacetGrid, _facet_docs\n\u001b[0;32m 23\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_docstrings\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m DocstringComponents, _core_docs\n", - "File \u001b[1;32md:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\seaborn\\_statistics.py:32\u001b[0m\n\u001b[0;32m 30\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[0;32m 31\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m---> 32\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mscipy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mstats\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m gaussian_kde\n\u001b[0;32m 33\u001b[0m _no_scipy \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m 34\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m:\n", - "File \u001b[1;32md:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\scipy\\__init__.py:99\u001b[0m\n\u001b[0;32m 94\u001b[0m \u001b[38;5;66;03m# This is the first import of an extension module within SciPy. If there's\u001b[39;00m\n\u001b[0;32m 95\u001b[0m \u001b[38;5;66;03m# a general issue with the install, such that extension modules are missing\u001b[39;00m\n\u001b[0;32m 96\u001b[0m \u001b[38;5;66;03m# or cannot be imported, this is where we'll get a failure - so give an\u001b[39;00m\n\u001b[0;32m 97\u001b[0m \u001b[38;5;66;03m# informative error message.\u001b[39;00m\n\u001b[0;32m 98\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m---> 99\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mscipy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_lib\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_ccallback\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m LowLevelCallable\n\u001b[0;32m 100\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m 101\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe `scipy` install you are using seems to be broken, \u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m+\u001b[39m \\\n\u001b[0;32m 102\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m(extension modules cannot be imported), \u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m+\u001b[39m \\\n\u001b[0;32m 103\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mplease try reinstalling.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n", - "File \u001b[1;32md:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\scipy\\_lib\\_ccallback.py:1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m _ccallback_c\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mctypes\u001b[39;00m\n\u001b[0;32m 5\u001b[0m PyCFuncPtr \u001b[38;5;241m=\u001b[39m ctypes\u001b[38;5;241m.\u001b[39mCFUNCTYPE(ctypes\u001b[38;5;241m.\u001b[39mc_void_p)\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__bases__\u001b[39m[\u001b[38;5;241m0\u001b[39m]\n", - "File \u001b[1;32m:645\u001b[0m, in \u001b[0;36mparent\u001b[1;34m(self)\u001b[0m\n", - "\u001b[1;31mKeyboardInterrupt\u001b[0m: " + "name": "stdout", + "output_type": "stream", + "text": [ + "Index(['work_year', 'experience_level', 'employment_type', 'job_title',\n", + " 'salary', 'salary_currency', 'salary_in_usd', 'employee_residence',\n", + " 'remote_ratio', 'company_location', 'company_size'],\n", + " dtype='object')\n" ] } ], "source": [ "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "import matplotlib.ticker as ticker\n", - "import seaborn as sns\n", - "\n", - "# Подключим датафрейм и выгрузим данные\n", - "df = pd.read_csv(\".//static//csv//ds_salaries.csv\")\n", + "df = pd.read_csv(\"..//static//csv//ds_salaries.csv\")\n", "print(df.columns)" ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
work_yearexperience_levelemployment_typejob_titlesalarysalary_currencysalary_in_usdemployee_residenceremote_ratiocompany_locationcompany_size
02023SEFTPrincipal Data Scientist80000EUR85847ES100ESL
12023MICTML Engineer30000USD30000US100USS
22023MICTML Engineer25500USD25500US100USS
32023SEFTData Scientist175000USD175000CA100CAM
42023SEFTData Scientist120000USD120000CA100CAM
\n", + "
" + ], + "text/plain": [ + " work_year experience_level employment_type job_title \\\n", + "0 2023 SE FT Principal Data Scientist \n", + "1 2023 MI CT ML Engineer \n", + "2 2023 MI CT ML Engineer \n", + "3 2023 SE FT Data Scientist \n", + "4 2023 SE FT Data Scientist \n", + "\n", + " salary salary_currency salary_in_usd employee_residence remote_ratio \\\n", + "0 80000 EUR 85847 ES 100 \n", + "1 30000 USD 30000 US 100 \n", + "2 25500 USD 25500 US 100 \n", + "3 175000 USD 175000 CA 100 \n", + "4 120000 USD 120000 CA 100 \n", + "\n", + " company_location company_size \n", + "0 ES L \n", + "1 US S \n", + "2 US S \n", + "3 CA M \n", + "4 CA M " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
work_yearsalarysalary_in_usdremote_ratio
count3755.0000003.755000e+033755.0000003755.000000
mean2022.3736351.906956e+05137570.38988046.271638
std0.6914486.716765e+0563055.62527848.589050
min2020.0000006.000000e+035132.0000000.000000
25%2022.0000001.000000e+0595000.0000000.000000
50%2022.0000001.380000e+05135000.0000000.000000
75%2023.0000001.800000e+05175000.000000100.000000
max2023.0000003.040000e+07450000.000000100.000000
\n", + "
" + ], + "text/plain": [ + " work_year salary salary_in_usd remote_ratio\n", + "count 3755.000000 3.755000e+03 3755.000000 3755.000000\n", + "mean 2022.373635 1.906956e+05 137570.389880 46.271638\n", + "std 0.691448 6.716765e+05 63055.625278 48.589050\n", + "min 2020.000000 6.000000e+03 5132.000000 0.000000\n", + "25% 2022.000000 1.000000e+05 95000.000000 0.000000\n", + "50% 2022.000000 1.380000e+05 135000.000000 0.000000\n", + "75% 2023.000000 1.800000e+05 175000.000000 100.000000\n", + "max 2023.000000 3.040000e+07 450000.000000 100.000000" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "work_year 0\n", + "experience_level 0\n", + "employment_type 0\n", + "job_title 0\n", + "salary 0\n", + "salary_currency 0\n", + "salary_in_usd 0\n", + "employee_residence 0\n", + "remote_ratio 0\n", + "company_location 0\n", + "company_size 0\n", + "dtype: int64\n", + "work_year False\n", + "experience_level False\n", + "employment_type False\n", + "job_title False\n", + "salary False\n", + "salary_currency False\n", + "salary_in_usd False\n", + "employee_residence False\n", + "remote_ratio False\n", + "company_location False\n", + "company_size False\n", + "dtype: bool\n" + ] + } + ], + "source": [ + "# Процент пропущенных значений признаков\n", + "for i in df.columns:\n", + " null_rate = df[i].isnull().sum() / len(df) * 100\n", + " if null_rate > 0:\n", + " print(f'{i} Процент пустых значений: %{null_rate:.2f}')\n", + "\n", + "print(df.isnull().sum())\n", + "\n", + "print(df.isnull().any())" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'X_train'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
work_yearexperience_levelemployment_typejob_titlesalarysalary_currencysalary_in_usdemployee_residenceremote_ratiocompany_locationcompany_sizeabove_median_salarysalary_category
18092023SEFTData Engineer182000USD182000US100USM11
10822023SEFTMachine Learning Engineer126000USD126000US0USM01
16862023SEFTBI Developer140000USD140000US100USM11
16002023SEFTData Scientist140000USD140000US0USM11
13762023SEFTData Engineer226700USD226700US0USM12
..........................................
27062022SEFTData Engineer160000USD160000US100USM11
9282023MIFTData Engineer200000USD200000US0USM11
5642023MIFTData Engineer140000USD140000US0USM11
7162023SEFTData Scientist297300USD297300US100USM12
12992023SEFTData Engineer133832USD133832US0USM01
\n", + "

3004 rows × 13 columns

\n", + "
" + ], + "text/plain": [ + " work_year experience_level employment_type job_title \\\n", + "1809 2023 SE FT Data Engineer \n", + "1082 2023 SE FT Machine Learning Engineer \n", + "1686 2023 SE FT BI Developer \n", + "1600 2023 SE FT Data Scientist \n", + "1376 2023 SE FT Data Engineer \n", + "... ... ... ... ... \n", + "2706 2022 SE FT Data Engineer \n", + "928 2023 MI FT Data Engineer \n", + "564 2023 MI FT Data Engineer \n", + "716 2023 SE FT Data Scientist \n", + "1299 2023 SE FT Data Engineer \n", + "\n", + " salary salary_currency salary_in_usd employee_residence remote_ratio \\\n", + "1809 182000 USD 182000 US 100 \n", + "1082 126000 USD 126000 US 0 \n", + "1686 140000 USD 140000 US 100 \n", + "1600 140000 USD 140000 US 0 \n", + "1376 226700 USD 226700 US 0 \n", + "... ... ... ... ... ... \n", + "2706 160000 USD 160000 US 100 \n", + "928 200000 USD 200000 US 0 \n", + "564 140000 USD 140000 US 0 \n", + "716 297300 USD 297300 US 100 \n", + "1299 133832 USD 133832 US 0 \n", + "\n", + " company_location company_size above_median_salary salary_category \n", + "1809 US M 1 1 \n", + "1082 US M 0 1 \n", + "1686 US M 1 1 \n", + "1600 US M 1 1 \n", + "1376 US M 1 2 \n", + "... ... ... ... ... \n", + "2706 US M 1 1 \n", + "928 US M 1 1 \n", + "564 US M 1 1 \n", + "716 US M 1 2 \n", + "1299 US M 0 1 \n", + "\n", + "[3004 rows x 13 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "'y_train'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
above_median_salary
18091
10820
16861
16001
13761
......
27061
9281
5641
7161
12990
\n", + "

3004 rows × 1 columns

\n", + "
" + ], + "text/plain": [ + " above_median_salary\n", + "1809 1\n", + "1082 0\n", + "1686 1\n", + "1600 1\n", + "1376 1\n", + "... ...\n", + "2706 1\n", + "928 1\n", + "564 1\n", + "716 1\n", + "1299 0\n", + "\n", + "[3004 rows x 1 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "'X_test'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
work_yearexperience_levelemployment_typejob_titlesalarysalary_currencysalary_in_usdemployee_residenceremote_ratiocompany_locationcompany_sizeabove_median_salarysalary_category
34592022MIFTResearch Scientist59000EUR61989AT0ATL00
37242021ENFTBusiness Data Analyst50000EUR59102LU100LUL00
17952023SEFTData Engineer180000USD180000US0USM11
35352021MIFTData Scientist50000USD50000NG100NGL00
32552022MIFTData Analyst106260USD106260US0USM01
..........................................
19432022MIFTData Engineer120000USD120000US100USM01
5732023ENFTAutonomous Vehicle Technician7000USD7000GH0GHS00
30132022SEFTMachine Learning Engineer129300USD129300US0USM01
3272023ENFTData Scientist70000CAD51753CA100CAL00
15652023SEFTData Analyst48000EUR51508ES0ESM00
\n", + "

751 rows × 13 columns

\n", + "
" + ], + "text/plain": [ + " work_year experience_level employment_type \\\n", + "3459 2022 MI FT \n", + "3724 2021 EN FT \n", + "1795 2023 SE FT \n", + "3535 2021 MI FT \n", + "3255 2022 MI FT \n", + "... ... ... ... \n", + "1943 2022 MI FT \n", + "573 2023 EN FT \n", + "3013 2022 SE FT \n", + "327 2023 EN FT \n", + "1565 2023 SE FT \n", + "\n", + " job_title salary salary_currency salary_in_usd \\\n", + "3459 Research Scientist 59000 EUR 61989 \n", + "3724 Business Data Analyst 50000 EUR 59102 \n", + "1795 Data Engineer 180000 USD 180000 \n", + "3535 Data Scientist 50000 USD 50000 \n", + "3255 Data Analyst 106260 USD 106260 \n", + "... ... ... ... ... \n", + "1943 Data Engineer 120000 USD 120000 \n", + "573 Autonomous Vehicle Technician 7000 USD 7000 \n", + "3013 Machine Learning Engineer 129300 USD 129300 \n", + "327 Data Scientist 70000 CAD 51753 \n", + "1565 Data Analyst 48000 EUR 51508 \n", + "\n", + " employee_residence remote_ratio company_location company_size \\\n", + "3459 AT 0 AT L \n", + "3724 LU 100 LU L \n", + "1795 US 0 US M \n", + "3535 NG 100 NG L \n", + "3255 US 0 US M \n", + "... ... ... ... ... \n", + "1943 US 100 US M \n", + "573 GH 0 GH S \n", + "3013 US 0 US M \n", + "327 CA 100 CA L \n", + "1565 ES 0 ES M \n", + "\n", + " above_median_salary salary_category \n", + "3459 0 0 \n", + "3724 0 0 \n", + "1795 1 1 \n", + "3535 0 0 \n", + "3255 0 1 \n", + "... ... ... \n", + "1943 0 1 \n", + "573 0 0 \n", + "3013 0 1 \n", + "327 0 0 \n", + "1565 0 0 \n", + "\n", + "[751 rows x 13 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "'y_test'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
above_median_salary
34590
37240
17951
35350
32550
......
19430
5730
30130
3270
15650
\n", + "

751 rows × 1 columns

\n", + "
" + ], + "text/plain": [ + " above_median_salary\n", + "3459 0\n", + "3724 0\n", + "1795 1\n", + "3535 0\n", + "3255 0\n", + "... ...\n", + "1943 0\n", + "573 0\n", + "3013 0\n", + "327 0\n", + "1565 0\n", + "\n", + "[751 rows x 1 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "work_year int64\n", + "experience_level object\n", + "employment_type object\n", + "job_title object\n", + "salary int64\n", + "salary_currency object\n", + "salary_in_usd int64\n", + "employee_residence object\n", + "remote_ratio int64\n", + "company_location object\n", + "company_size object\n", + "above_median_salary int64\n", + "salary_category category\n", + "dtype: object\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1IAAAIjCAYAAAAJLyrXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACHyElEQVR4nOzdd3xV9eH/8dcdyc3emySMEEiYCgrGAQ4UETeto6DWtmottq4qddTZlqr91VWr9tsqttW6dxVFpiKCskdYYVwgZNzsndx7z++PwK2RYW5Icm6S9/PxuA+4555zz/sml3DfOed8PhbDMAxERERERESk3axmBxAREREREelpVKRERERERET8pCIlIiIiIiLiJxUpERERERERP6lIiYiIiIiI+ElFSkRERERExE8qUiIiIiIiIn5SkRIREREREfGTipSIiIiIiIifVKRERERERET8pCIlItJN5syZg8Vi8d1CQkIYMmQIN910E8XFxWbHExERET/YzQ4gItLXPPTQQwwcOJDGxka++OILnn32WT766CM2bNhAWFiY2fFERESkHVSkRES62ZQpUzjhhBMA+NnPfkZ8fDx//vOfee+997jyyitNTiciIiLtoVP7RERMduaZZwKwc+dOAMrLy/n1r3/NyJEjiYiIICoqiilTprB27dpDtm1sbOSBBx5gyJAhhISEkJqayqWXXkpBQQEAu3btanM64Xdvp59+uu+5Fi1ahMVi4bXXXuPuu+8mJSWF8PBwLrzwQvbs2XPIvpcvX865555LdHQ0YWFhTJw4kaVLlx72NZ5++umH3f8DDzxwyLr//ve/GTt2LKGhocTFxXHFFVccdv9He23f5vV6eeKJJxg+fDghISEkJydzww03UFFR0Wa9AQMGcP755x+yn5tuuumQ5zxc9scee+yQrylAU1MT999/P4MHD8bhcJCRkcGdd95JU1PTYb9W3/bzn/+c7OxswsLCiIuL48wzz+Tzzz9vs857773H1KlTSUtLw+FwkJWVxcMPP4zH42mz3umnn86IESNYuXIlJ598MqGhoQwcOJDnnnuuzXoH3wdHuv34xz8+JOeRvr9z5szxrfP555/zwx/+kMzMTN/X4dZbb6WhocG3zo9//OOj7ttisbBr167v/bqJiHQHHZESETHZwdITHx8PwI4dO3j33Xf54Q9/yMCBAykuLub5559n4sSJbNq0ibS0NAA8Hg/nn38+8+fP54orruDmm2+mpqaGefPmsWHDBrKysnz7uPLKKznvvPPa7Peuu+46bJ7f//73WCwWZs2aRUlJCU888QSTJk1izZo1hIaGArBgwQKmTJnC2LFjuf/++7Farbz44ou+D/rjxo075HnT09OZPXs2ALW1tdx4442H3fdvf/tbLrvsMn72s59RWlrK008/zYQJE1i9ejUxMTGHbHP99ddz2mmnAfD222/zzjvvtHn8hhtuYM6cOVx77bX86le/YufOnfzlL39h9erVLF26lKCgoMN+HfxRWVnpe23f5vV6ufDCC/niiy+4/vrryc3NZf369Tz++ONs3bqVd99996jP29zczIwZM0hPT6e8vJznn3+ec889l/z8fDIzM4HWa+8iIiK47bbbiIiIYMGCBdx3331UV1fz2GOPtXm+iooKzjvvPC677DKuvPJKXn/9dW688UaCg4P5yU9+0mbdX/3qV5x44oltlv3sZz87YtacnBzuueceAFwuF7feemubx9944w3q6+u58cYbiY+PZ8WKFTz99NPs3buXN954A2j9Xk2aNMm3zVVXXcUll1zCpZde6luWmJh41K+ZiEi3MUREpFu8+OKLBmB89tlnRmlpqbFnzx7j1VdfNeLj443Q0FBj7969hmEYRmNjo+HxeNpsu3PnTsPhcBgPPfSQb9kLL7xgAMaf//znQ/bl9Xp92wHGY489dsg6w4cPNyZOnOi7v3DhQgMw+vXrZ1RXV/uWv/766wZgPPnkk77nzs7ONiZPnuzbj2EYRn19vTFw4EDj7LPPPmRfJ598sjFixAjf/dLSUgMw7r//ft+yXbt2GTabzfj973/fZtv169cbdrv9kOXbtm0zAOOll17yLbv//vuNb//X9vnnnxuA8fLLL7fZdu7cuYcs79+/vzF16tRDss+cOdP47n+X381+5513GklJScbYsWPbfE3/9a9/GVar1fj888/bbP/cc88ZgLF06dJD9nc0K1asMADjzTff9C2rr68/ZL0bbrjBCAsLMxobG33LJk6caADG//t//8+3rKmpyTjuuOOMpKQko7m52TCM/70P3njjjUOeNzw83LjmmmsOWX7KKacYZ5xxhu/+wffdiy++eNScs2fPNiwWi7F79+7Dvt7vfp1FRAKJTu0TEelmkyZNIjExkYyMDK644goiIiJ455136NevHwAOhwOrtfXHs8fjoaysjIiICIYOHcqqVat8z/PWW2+RkJDAL3/5y0P28d1T0fxx9dVXExkZ6bv/gx/8gNTUVD766CMA1qxZw7Zt2/jRj35EWVkZLpcLl8tFXV0dZ511FkuWLMHr9bZ5zsbGRkJCQo6637fffhuv18tll13me06Xy0VKSgrZ2dksXLiwzfrNzc1A69frSN544w2io6M5++yz2zzn2LFjiYiIOOQ5W1pa2qzncrlobGw8au59+/bx9NNP89vf/paIiIhD9p+bm0tOTk6b5zx4Oud39384jY2NuFwu8vPzefLJJwkNDfVdYwf4jhIC1NTU4HK5OO2006ivr2fz5s1tnstut3PDDTf47gcHB3PDDTdQUlLCypUrvzfLkTQ3Nx/1+/DdnHV1dbhcLk4++WQMw2D16tUd3reIiFl0ap+ISDd75plnGDJkCHa7neTkZIYOHeorTtB6OtiTTz7JX//6V3bu3NnmWpeDp/9B6ymBQ4cOxW7v3B/l2dnZbe5bLBYGDx7suzZl27ZtAFxzzTVHfI6qqipiY2N9910u1yHP+13btm3DMIwjrvfdU/AqKysBDikv333OqqoqkpKSDvt4SUlJm/uffvqp36eO3X///aSlpXHDDTfw5ptvHrL//Pz8Iz7nd/d/OHPmzPGdBpmSksK8efPo37+/7/GNGzdy7733smDBAqqrq9tsW1VV1eZ+Wloa4eHhbZYNGTIEaL3m7KSTTvrePIdTWVnZJtPhOJ1O7rvvPt5///1Drk/7bk4RkZ5ARUpEpJuNGzeuzRGF7/rDH/7Ab3/7W37yk5/w8MMPExcXh9Vq5ZZbbjnkSI8ZDmZ47LHHOO644w67zrfLTXNzM/v37+fss8/+3ue1WCx8/PHH2Gy2oz4nQFFREdBaLo72nElJSbz88suHffy7BWf8+PH87ne/a7PsL3/5C++9995ht8/Pz2fOnDn8+9//Puy1Vl6vl5EjR/LnP//5sNtnZGQcMftBF1xwAYMHD6akpITnnnuOyy+/nC+++IIBAwZQWVnJxIkTiYqK4qGHHiIrK4uQkBBWrVrFrFmzuu39UlRUxOTJk4/4uMfj4eyzz6a8vJxZs2aRk5NDeHg4+/bt48c//nFAvK9FRPylIiUiEmDefPNNzjjjDP7xj3+0WV5ZWUlCQoLvflZWFsuXL6elpaVTBkw46OARp4MMw2D79u2MGjXKt1+AqKioNgMDHMnatWtpaWk5ank8+LyGYTBw4EDfUZKj2bRpExaLhaFDhx71OT/77DNOOeWUNqeWHUlCQsIhr+loA0LcddddHHfccVx++eVH3P/atWs566yzOny6Zb9+/XynfV566aUkJCTw7LPP8sgjj7Bo0SLKysp4++23mTBhgm+bgyNAfldhYSF1dXVtjkpt3boVaB21sCP27t1LTU0Nubm5R1xn/fr1bN26lZdeeomrr77at3zevHkd2qeISCDQNVIiIgHGZrNhGEabZW+88Qb79u1rs2zatGm4XC7+8pe/HPIc393eH//85z+pqanx3X/zzTfZv38/U6ZMAWDs2LFkZWXxpz/9idra2kO2Ly0tPSS7zWY77NDi33bppZdis9l48MEHD8lvGAZlZWW++263m7feeotx48Yd9dS+yy67DI/Hw8MPP3zIY26323d6YEcsW7aM9957jz/+8Y9HLEmXXXYZ+/bt4//+7/8OeayhoYG6ujq/9llVVUVzc7Nv6PSDR+6+/fVqbm7mr3/962G3d7vdPP/8823Wff7550lMTGTs2LF+ZTno1VdfBf43jP/hHC6nYRg8+eSTHdqniEgg0BEpEZEAc/755/PQQw9x7bXXcvLJJ7N+/XpefvllBg0a1Ga9q6++mn/+85/cdtttrFixgtNOO426ujo+++wzfvGLX3DRRRd1aP9xcXGceuqpXHvttRQXF/PEE08wePBgrrvuOgCsVit///vfmTJlCsOHD+faa6+lX79+7Nu3j4ULFxIVFcUHH3xAXV0dzzzzDE899RRDhgxh0aJFvn0cLGDr1q1j2bJl5OXlkZWVxe9+9zvuuusudu3axcUXX0xkZCQ7d+7knXfe4frrr+fXv/41n332Gb/97W9Zt24dH3zwwVFfy8SJE7nhhhuYPXs2a9as4ZxzziEoKIht27bxxhtv8OSTT/KDH/ygQ1+nTz/9lLPPPvuoR+WuuuoqXn/9dX7+85+zcOFCTjnlFDweD5s3b+b111/nk08+OeKRuvXr13P77bdz5plnkpSURGFhIS+88AJer9c3cfPJJ59MbGws11xzDb/61a+wWCz861//OmKRTktL45FHHmHXrl0MGTKE1157jTVr1vC3v/3N76OaxcXF3H///fz973/niiuuICcn54jr5uTkkJWVxa9//Wv27dtHVFQUb7311iHXSomI9CQqUiIiAebuu++mrq6OV155hddee40xY8bw3//+l9/85jdt1rPZbHz00Uf8/ve/55VXXuGtt94iPj6eU089lZEjRx7T/tetW8fs2bOpqanhrLPO4q9//SthYWG+dU4//XSWLVvGww8/zF/+8hdqa2tJSUlh/PjxvlHhSktLmTVrFtB6LdFVV111yL7eeecdoqKiyMvLA+A3v/kNQ4YM4fHHH+fBBx8EWq8jOuecc7jwwgsBeP/99wkODuajjz466nU5Bz333HOMHTuW559/nrvvvhu73c6AAQOYMWMGp5xySoe/ThaLhT/+8Y9HXcdqtfLuu+/y+OOP889//pN33nmHsLAwBg0axM0333zUUxgTEhIIDQ3liSeeoLy8nISEBMaOHcu//vUvxo8fD7QOPvLhhx9y++23c++99xIbG8uMGTM466yzDvu1iY2N5aWXXuKXv/wl//d//0dycjJ/+ctffCXZHwUFBcyfP5/f/va3R5yT7KCgoCA++OADfvWrXzF79mxCQkK45JJLuOmmmxg9erTf+xYRCQQW41jO/xARkV5j0aJFnHHGGbzxxhsdPkrzbbt27WLgwIHs3LnziNffPPDAA+zatYs5c+Yc8/7k6E4//XRcLhcbNmwwO4qISK+ga6RERERERET8pFP7RESkS0RERDB9+vSjDgYxatQo0tLSujGViIhI51CREhGRLpGQkMC///3vo65z6aWXdlMaERGRzqVrpERERERERPyka6RERERERET8pCIlIiIiIiLiJ10jBXi9XgoLC4mMjDzi7PQiIiIiItL7GYZBTU0NaWlpWK1HPu6kIgUUFhaSkZFhdgwREREREQkQe/bsIT09/YiPq0gBkZGRQOsXKyoqyuQ0IiIiIiJilurqajIyMnwd4UhUpMB3Ol9UVJSKlIiIiIiIfO8lPxpsQkRERERExE8qUiIiIiIiIn5SkRIREREREfGTipSIiIiIiIifVKRERERERET8pCIlIiIiIiLiJxUpERERERERP6lIiYiIiIiI+ElFSkRERERExE8qUiIiIiIiIn5SkRIREREREfGTipSIiIiIiIifVKRERERERET8pCIlIiIiIiLiJxUpERERERERP6lIiYiIiIiI+ElFSkRERERExE8qUiIiIiIiIn6ymx1ARKSrOJ1OXC6X39slJCSQmZnZBYlERESkt1CREpFeyel0kpObS0N9vd/bhoaFsTk/X2VKREREjkhFSkR6JZfLRUN9PdNnPUZyZla7tyt2FvDyI3fgcrlUpEREROSIVKREpFdLzswiPXu42TFERESkl9FgEyIiIiIiIn5SkRIREREREfGTipSIiIiIiIifVKRERERERET8pCIlIiIiIiLiJxUpERERERERP6lIiYiIiIiI+ElFSkRERERExE8qUiIiIiIiIn5SkRIREREREfGTipSIiIiIiIifVKRERERERET8pCIlIiIiIiLiJxUpERERERERP6lIiYiIiIiI+ElFSkRERERExE8qUiIiIiIiIn5SkRIREREREfGTqUVq9uzZnHjiiURGRpKUlMTFF1/Mli1b2qxz+umnY7FY2tx+/vOft1nH6XQydepUwsLCSEpK4o477sDtdnfnSxERERERkT7EbubOFy9ezMyZMznxxBNxu93cfffdnHPOOWzatInw8HDfetdddx0PPfSQ735YWJjv7x6Ph6lTp5KSksKXX37J/v37ufrqqwkKCuIPf/hDt74eERERERHpG0wtUnPnzm1zf86cOSQlJbFy5UomTJjgWx4WFkZKSsphn+PTTz9l06ZNfPbZZyQnJ3Pcccfx8MMPM2vWLB544AGCg4O79DWIiIiIiEjfE1DXSFVVVQEQFxfXZvnLL79MQkICI0aM4K677qK+vt732LJlyxg5ciTJycm+ZZMnT6a6upqNGzcedj9NTU1UV1e3uYmIiIiIiLSXqUekvs3r9XLLLbdwyimnMGLECN/yH/3oR/Tv35+0tDTWrVvHrFmz2LJlC2+//TYARUVFbUoU4LtfVFR02H3Nnj2bBx98sIteiYiIiIiI9HYBU6RmzpzJhg0b+OKLL9osv/76631/HzlyJKmpqZx11lkUFBSQlZXVoX3ddddd3Hbbbb771dXVZGRkdCy4iIiIiIj0OQFxat9NN93Ehx9+yMKFC0lPTz/quuPHjwdg+/btAKSkpFBcXNxmnYP3j3RdlcPhICoqqs1NRERERESkvUwtUoZhcNNNN/HOO++wYMECBg4c+L3brFmzBoDU1FQA8vLyWL9+PSUlJb515s2bR1RUFMOGDeuS3CIiIiIi0reZemrfzJkzeeWVV3jvvfeIjIz0XdMUHR1NaGgoBQUFvPLKK5x33nnE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vHkzAGDMmDFQq9X4/PPPkZycjLq6OmRkZPQ53tatW6HX6+Hl5YVNmzbBYDBg/vz5TudTVlaG1atXIyYmBiNHjuwzxmw2Y/fu3Th69ChMJhP27NkDq9XqMFszELPZLO1E2NbWhg0bNsDNzW3APhEREejo6MCpU6fw4osvSu3r169HZmYmvLy8EBoaipaWFmRkZMBoNOKtt94CAHz77bfYv38/3n77bfj7+0MIgUOHDuHw4cMoLCyU3aelpQUXL17EzZs3UVdXh88++wzV1dUoLS3FkCFDpLjy8nL4+vpi/PjxTj83ERENjIUUERE5xdXVFXq9HqmpqWhsbMSQIUPw0ksvYceOHVi4cCEAwGg0YufOnUhPT0deXh4mTZqEnJwczJs3z2G8rKwsrF27Fg0NDQgODsahQ4egVqudzicxMREzZ87Etm3b+o1ZuXIlfvnlFyxevBgqlQpLlixBSkoKjhw54vR9duzYgRUrVmDSpEl47rnnkJmZibS0tAH76PV6LFiwAHv37sUnn3witW/cuBEajQbZ2dmw2+3Q6XR45ZVXUFZWJhVnL7zwAtzd3ZGamooLFy7AxcUFZrMZBQUFePfdd2X3mTlzJoC7m0mMHTsWERERyM/Ph5+fnyxu3759WL58udPPTERED6cSSvdWJSIiegwnTpxAREQEWltbMXz48MFO54n59ddfER0dDbvdLtut8O926tQpREZG4ty5cw7rsIiI6NFxjRQREdETMGHCBGRnZ+P3338f1Dyam5uxe/duFlFERH8xzkgREdHf6r8yI0VERP9uLKSIiIiIiIgU4r/2ERERERERKcRCioiIiIiISCEWUkRERERERAqxkCIiIiIiIlKIhRQREREREZFCLKSIiIiIiIgUYiFFRERERESkEAspIiIiIiIihf4HuUe4oVFmI5gAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2wAAAIjCAYAAAB/FZhcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABu0UlEQVR4nO3deVxUZf//8feAsrgAIsqSgpA7SpqWkYVZlhalpbkkla2m0qatJkoa5m1lpgkudauZdFvWXWaaSVpShpnbTbm1SFIhqKFgoqAz5/dHP+brCCQoMAd4PR+PecSc65oz79lsPnNd5zoWwzAMAQAAAABMx8XZAQAAAAAApaNgAwAAAACTomADAAAAAJOiYAMAAAAAk6JgAwAAAACTomADAAAAAJOiYAMAAAAAk6JgAwAAAACTomADAAAAAJOiYAMAAAAAk6JgA1BjzZs3T3379pW/v7/q16+vgIAA9erVS0uWLJHNZnN2PAAAgAtmMQzDcHYIADgfkZGRCgwM1LXXXisvLy8dPXpUmzZt0rJlyzR06FD95z//cXZEAACAC0LBBqDGOnXqlOrXr19i+yOPPKI5c+YoIyNDrVq1qv5gAAAAlYQpkQBqrNKKNUn2Is3F5f/+iVuxYoWio6MVFBQkd3d3XXzxxXrhhRdktVodbnvNNdfIYrHYL35+foqOjtYPP/zg0M9isej555932Pbyyy/LYrHommuucdh+8uRJPf/882rbtq08PDwUGBiogQMH6pdffpEk/frrr7JYLFq8eLHD7WJjY2WxWHTPPffYty1evFgWi0Vubm46dOiQQ/+0tDR77i1btji0LV++XN26dZOnp6f8/Px055136o8//ijx3O3Zs0dDhgxRs2bN5OnpqXbt2mnChAmSpOeff97huSnt8uWXX9qfx06dOpXYf3mMGjVKbdq0UYMGDeTr66trr71WX331lUOfiryenTp10tatW3XllVfK09NToaGhmjdvnkO/L7/88h8f15mvwZn7Lq3vma/jV199pcGDBys4OFju7u5q2bKlxo4dqxMnTtj73HPPPed8Xn/99VdJf7+3b7755jKfu+LHUfw6/JPt27frxhtvlJeXlxo1aqTrrrtOmzZtsrcXv9f+6XL2e7bYvn37ZLFYNHPmzBJt33zzjSwWi30EvPh9Vfze8/LyUtOmTfXYY4/p5MmTDrc9ffq0XnjhBV188cVyd3dXq1at9Nxzz6mwsNChX6tWrewZXVxcFBAQoKFDhyozM9Pep/hz98orr5TI2KlTpxKf43379mnw4MEKCgqSi4uLff/leZ+fT+7SLmeyWCx6+OGHy7zP4tfvzPfOP+37zB+3XnnlFV155ZVq2rSpPD091a1bN73//vvnfJwAqkY9ZwcAgAt19OhRnT59WseOHdPWrVv1yiuvaNiwYQoODrb3Wbx4sRo1aqRx48apUaNGWr9+vSZNmqT8/Hy9/PLLDvtr3769JkyYIMMw9Msvv+jVV1/VTTfd5PBlr7QM06ZNK7HdarXq5ptv1rp16zRs2DA99thjOnbsmFJSUvTDDz/o4osvLnV/P//8s954440y78/V1VVLly7V2LFj7dsWLVokDw+PEl9yFy9erHvvvVeXXXaZpk2bppycHM2aNUsbN27U9u3b5ePjI0lKT0/X1Vdfrfr162vkyJFq1aqVfvnlF61cuVJTp07VwIED1bp1a/t+x44dqw4dOmjkyJH2bR06dCgzc3kVFRXpzjvvVIsWLZSbm6v58+erX79+2r17t/01rcjreeTIEd10000aMmSI7rjjDr333nsaPXq03NzcdN999zn0ffTRR3XZZZc5bHvggQfKzFr8XpGkw4cPO7we0t+FckFBgUaPHq2mTZtq8+bNev311/X7779r+fLlkqSHHnpIffr0sd/mrrvu0m233aaBAwfatzVr1qy8T1+57Ny5U1dffbW8vLz09NNPq379+po/f76uueYabdiwQT169FBUVJTefvtt+22mTp0qSfbHK0lXXnllqfsPCwtTz549lZycXOI5SU5OVuPGjTVgwACH7UOGDFGrVq00bdo0bdq0SbNnz9aRI0e0ZMkSe58HHnhAb731lm6//XY98cQT+vbbbzVt2jTt3r1bH374ocP+rr76ao0cOVI2m00//PCDXnvtNWVlZZUo/svDarWqf//+2r9/vx5//HG1bdtWFovF/pycS0Vyd+nSRU888YTDtiVLliglJaXCuc/02muv6a+//pIk7d69Wy+++KKee+45+2e2UaNG9r6zZs1S//79FRMTo6KiIi1btkyDBw/WJ598oujo6AvKAeA8GABQw7Vr186QZL/cfffdxqlTpxz6FBQUlLjdQw89ZDRo0MA4efKkfVuvXr2MXr16OfR77rnnDEnGwYMH7dskGfHx8fbrTz/9tNG8eXOjW7duDrdfuHChIcl49dVXS9y/zWYzDMMwMjIyDEnGokWL7G1DhgwxOnXqZLRs2dIYMWKEffuiRYsMScYdd9xhdO7c2b79+PHjhpeXlzF8+HBDkvHdd98ZhmEYRUVFRvPmzY1OnToZJ06csPf/5JNPDEnGpEmT7NuioqKMxo0bG/v37y8159lCQkIcsp2pV69eRnh4eKltFbV582ZDkvH+++/bt1Xk9ZRkzJgxw76tsLDQ6NKli9G8eXOjqKjIMAzD+OKLLwxJxvLly0vst2HDhqU+zp49exq9e/e2Xy/tdSwt57Rp0wyLxVLieS529nvrTCEhIUZ0dHSpbWc+ji+++KLMPoZhGLfeeqvh5uZm/PLLL/ZtWVlZRuPGjY2oqKhSb1PaZ+OfzJ8/35Bk7N69276tqKjI8PPzc3g+4+PjDUlG//79HW4/ZswYQ5Lxv//9zzAMw9ixY4chyXjggQcc+j355JOGJGP9+vX2baW9N4cPH240aNDAfr349Xr55ZdLZA8PD3d4rHv37jUkGdOmTXPoV573eUVzl/b6xsbGGmd/ZZNkxMbGlnm/xf9WZGRklGg71/vk7PdtUVGR0alTJ+Paa68t8/4AVB2mRAKo8RYtWqSUlBQlJyfr/vvvV3JyssOojyR5enra/z527JgOHz6sq6++WgUFBdqzZ49D31OnTunw4cM6dOiQ0tLS9OGHHyoiIkJ+fn6l3v8ff/yh119/XRMnTnT4lVqSPvjgA/n5+emRRx4pcbuzpzgV27p1q5YvX65p06Y5TOs801133aU9e/bYpz5+8MEH8vb21nXXXefQb8uWLTp48KDGjBkjDw8P+/bo6Gi1b99eq1atkiQdOnRIqampuu+++xxGJv8p57lYrVYdPnxYhw8fVlFRUYVue/LkSR0+fFi7d+/WrFmz5Onpqe7du9vbK/J61qtXTw899JD9upubmx566CEdPHhQW7duPa/HJv09Euju7v6Pfc7Mefz4cR0+fFhXXnmlDMPQ9u3bz+t+i9+ff/75p06fPl3h21utVq1du1a33nqrwsLC7NsDAwM1fPhwff3118rPzz+vbGcaMmSIPDw8lJycbN/22Wef6fDhw7rzzjtL9I+NjXW4XvyZWb16tcN/x40b59CveDSq+L1crLCwUIcPH9bBgweVkpKi9evXl/h8SFJBQYH9fVp8OXtq7bFjxyRJTZs2PfcDP0tFc1dE8efkzz//rNSVcc983x45ckR5eXm6+uqrtW3btkq7DwDlR8EGoMaLjIxUnz59NHz4cL355puaMmWKFi1apI0bN9r77Ny5U7fddpu8vb3l5eWlZs2a2b805uXlOezvm2++UbNmzdS8eXNdeeWVOn36tJYvX15m4RIfH6+goCCHoqDYL7/8onbt2qlevfLPQH/22Wd19dVX/+OxSs2aNVN0dLQWLlwoSVq4cKFGjBhRosDbv3+/JKldu3Yl9tG+fXt7+759+yTpvI87K82ePXvUrFkzh+Ph3nnnnXLddvHixWrWrJk6duyodevWKSUlRSEhIfb2iryeQUFBatiwocO2tm3bSpL9+J7zcfTo0RIF+tkyMzN1zz33yNfXV40aNVKzZs3Uq1evUnOW19q1a9WsWTP5+fnJw8NDl156qdauXVvu2x86dEgFBQWlvic6dOggm82m33777byyncnHx0e33HKLw2uenJysiy66SNdee22J/m3atHG4fvHFF8vFxcX+Gu3fv18uLi4O03IlKSAgQD4+Pvb3crFly5apWbNm8vf31w033KCWLVvqzTffLHG/8fHx9vdp8eXsor9du3Zq0qSJZsyYoY0bN+rQoUM6fPiwTp06dc7noaK5K+Lf//63/b3g6empqKioEsevno9PPvlEV1xxhTw8POTr66tmzZpp7ty55/2eBXBhKNgA1Dq33367JOnbb7+V9PcX6169eul///ufpkyZopUrVyolJUXTp0+XpBK/TEdERCglJUUpKSl655131LRpU11zzTXKzs4ucV+7d+/W4sWLlZCQUOYiKBWxdu1aff755/Zs/+S+++7Tf/7zH+3evVupqamlLozhTK1atXJ4Hv38/HTXXXc5LGxRlltuucU+atqmTRsNHTrU/sW9oq9nVcnOzlZAQECZ7VarVddff71WrVqlZ555Rh999JFSUlLsC3Wcb84ePXrYn9eFCxeqsLBQt9122wUVn1Xl7rvv1r59+/TNN9/o2LFj+vjjj3XHHXeUOXJ8prJ+ICnviO8NN9xgf54WLVqkY8eOqXfv3g4LvkjSyJEj7f2KL2evLtuoUSO9++67On78uK666io1b95czZo10zfffFOuLBXJXREDBgxQSkqK1q5dq9dff1379u3TzTffbB8RPB9f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/fvf/9ayZcskiaINAABUuszMTI0cOdLZMWqsBQsWqG3bts6O4XQWwzAMZ4eoK/Lz8+Xt7a28vDx5eXk5O06dUFRUpBtvvFFeXl5avny56tX7v98oTp8+rcGDBys/P1+ffvop0yMBAEClMvMI2/79+zV16lRNmDBBISEhzo5Tqto+wlbe2oARNtRqK1askNVq1f333y+LxaLt27crNzdXvr6+ioiI0H333acZM2ZoxYoVGjx4sLPjAgCAWsTDw8P0I0QhISGmz1jXUbChVsvKypIkWSwWxcTEKDs7294WEBCgO++806EfAAAAYCYUbKjVgoKCJEkvv/yyrrzySk2cOFGhoaHKyMhQcnKyXnnlFYd+AAAAgJlwHjbUajfffLMkqX79+nruuee0a9cuvfHGG9q1a5eee+451a9f36EfAAAAYCaMsKFW27NnjyTp1KlTJYqyxMREh35du3at1mwAAADAuTDChlotNze3UvsBAAAA1YkRNtRqxUukNm7cWO+++65WrVqlrKwsBQUFKTo6WkOHDtWxY8c4zQLqDKvVqvT0dIfVUl1dXZ0dCwAAlIGCDbXavn37JEnNmzeXh4eHw9L9NptNzZo107Fjx7Rv3z5ddtllzooJVIvU1FQlJSWVWC11zJgxioqKcmIyAABQFqZEolYr/mK6b98+xcXFaefOnSooKNDOnTsVFxenjIwMh35AbZWamqr4+HiFhYUpMTFRq1evVmJiosLCwhQfH6/U1FRnRwQAAKVghA21WvFy/bfccos2b96s2NhYe1tgYKBuueUWffzxxyzrj1rNarUqKSlJkZGRSkhIkIvL37/VhYeHKyEhQXFxcZo7d6569uzJ9EgAAEyGgg212oABAzRv3jx99dVXWrZsmXbt2mU/dqdjx44aNmyYXF1dNWDAAGdHBapMenq6srOzNXHiRHuxVszFxUUxMTGKjY1Veno6q6UCAGAyTIlErebm5qbBgwfryJEjGjZsmH7//Xddcskl+v333zVs2DAdOXJEgwcPlpubm7OjAlWmeBXU0NDQUtuLt7NaKgAA5sMIG2q9UaNGSZKWL1+uGTNm2Le7urpq2LBh9nagtvL19ZUkZWRkKDw8vER78bGcxf0AAIB5ULChThg1apTuu+8+rVixwr6s/4ABAxhZQ50QERGhgIAAJScnOxzDJv29WmpycrICAwMVERHh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AAAAAIBJUbABAAAAgElRsKFOcXd3V3x8vNzd3Z0dBXAaPgeo6/gMAHwOahIWHQEAAAAAk2KEDQAAAABMioINAAAAAEyKgg0AAAAATIqCDQAAAABMioINtdKhQ4c0evRoBQcHy93dXQEBAerbt682btwoSWrVqpUsFkuJy7/+9S8nJwcqzz333COLxaJRo0aVaIuNjZXFYtE999xj73vrrbdWb0CgChW//8++9OvXT9L//X9g06ZNDrd7/PHHdc011zghMVD5/ulzkJWVpSZNmmj27NkOt/n2229Vv359rV271kmpcbZ6zg4AVIVBgwapqKhIb731lsLCwpSTk6N169bpzz//tPeZMmWKHnzwQYfbNW7cuLqjAlWqZcuWWrZsmWbOnClPT09J0smTJ/XOO+8oODjYyemAqtWvXz8tWrTIYduZS5h7eHjomWee0YYNG6o7GlBtyvocNGnSRK+//roeeugh3XjjjWrTpo1OnDihESNG6IEHHtANN9zgpMQ4GwUbap2jR4/qq6++0pdffqlevXpJkkJCQnT55Zc79GvcuLECAgKcERGoNpdeeql++eUX/fe//1VMTIwk6b///a+Cg4MVGhrq5HRA1SqeYVGWkSNHat68eVq9erVuuummakwGVJ9/+hzceeed+u9//6t77rlHX331lcaPH69Tp07p5ZdfruaU+CdMiUSt06hRIzVq1EgfffSRCgsLnR0HcLr77rvP4dfVhQsX6t5773ViIsAcQkNDNWrUKI0fP142m83ZcQCnmDdvnn766SfFxMRozpw5WrRokRo1auTsWDgDBRtqnXr16mnx4sV666235OPjo549e+q5555Tenq6Q79nnnnGXtwVX7766isnpQaqzp133qmvv/5a+/fv1/79+7Vx40bdeeedzo4FVLlPPvmkxL/zL774okOfuLg4ZWRkKDk52Ukpgap1rs9B8+bN9cILL2jZsmUaOXKkoqKinJgWpWFKJGqlQYMGKTo6Wl999ZU2bdqkTz/9VC+99JLefPNN+yILTz31lP3vYhdddFH1hwWqWLNmzRQdHa3FixfLMAxFR0fLz8/P2bGAKte7d2/NnTvXYZuvr6/D9WbNmunJJ5/UpEmTNHTo0OqMB1SLc30OrFarFi9erAYNGmjTpk06ffq06tWjRDATXg3UWh4eHrr++ut1/fXXa+LEiXrggQcUHx9vL9L8/PzUunVr54YEqsl9992nhx9+WJKUmJjo5DRA9WjYsGG5/p0fN26ckpKSlJSUVA2pgOp1rs/BK6+8on379mnLli3q1auXXnzxRU2aNKkaE+JcmBKJOqNjx446fvy4s2MATtGvXz8VFRXp1KlT6tu3r7PjAKbSqFEjTZw4UVOnTtWxY8ecHQeoNjt37lR8fLzmzp2rDh06aO7cuUpISChxGAmcixE21Dp//vmnBg8erPvuu08RERFq3LixtmzZopdeekkDBgyw9zt27Jiys7MdbtugQQN5eXlVd2Sgyrm6umr37t32v4G6oLCwsMS/8/Xq1St1SvDIkSM1c+ZMvfPOO+rRo0d1RQSqXFmfAx8fH40YMUIDBw7UwIEDJf19SMmgQYN0zz33aPPmzUyNNAleBdQ6jRo1Uo8ePTRz5kz98ssvOnXqlFq2bKkHH3xQzz33nL3fpEmTSgz5P/TQQ5o3b151RwaqBT9GoK5Zs2aNAgMDHba1a9dOe/bsKdG3fv36euGFFzR8+PDqigdUi7I+B8OHD9cff/xR4gTZiYmJCg8PZ2qkiVgMwzCcHQIAAAAAUBLHsAEAAACASVGwAQAAAIBJUbABAAAAgElRsAEAAACASVGwAQAAAIBJUbABAAAAgElRsAEAAACASVGwAQAAAIBJUbABAAAAgElRsAEATOuFF15QkyZNdPz4cYftiYmJcnd3V05OjpOSAQBQPSjYAACmNXLkSBUUFGjJkiX2bYZh6PXXX9fQoUPl7+/vxHQAAFQ9CjYAgGn5+/tr6NChev311+3bPvvsM+3du1ePPvqoJOnLL7+UxWLRqlWrFBERIQ8PD11xxRX64YcfHPb1wQcfKDw8XO7u7mrVqpVmzJjh0N6qVStZLBZZLBY1bNhQV155pbZs2WJvt9lsmjZtmkJDQ+Xp6alLLrlE77//vr29OMfRo0cd9muxWPTRRx9Jkn799VdZLBbt2LGj3M+BzWbTlClT1KJFC7m7u6tLly5as2aNvb14n6VdXnvttVJznK1Lly56/vnnSzwPZ18WL14sSXr11VfVuXNnNWzYUC1bttSYMWP0119/lfsxAQDKj4INAGBqjz76qHbv3q21a9dKkmbNmqXIyEh1797dod9TTz2lGTNm6LvvvlOzZs10yy236NSpU5KkrVu3asiQIRo2bJi+//57Pf/885o4caK9ACk2ZcoUHThwQFu2bFHDhg0VGxtrb5s2bZqWLFmiefPmaefOnRo7dqzuvPNObdiwoUof/6xZszRjxgy98sorSk9PV9++fdW/f3/99NNPDv0+//xzHThwwH5p0aLFed3fd99957CP1157zX596NChkiQXFxfNnj1bO3fu1FtvvaX169fr6aefvuDHCgAoqZ6zAwAA8E+6d++uyMhIzZ49W61atdJnn32m//znPyX6xcfH6/rrr5ckvfXWW2rRooU+/PBDDRkyRK+++qquu+46TZw4UZLUtm1b7dq1Sy+//LLuuece+z4aN26sgIAA+fj4qEmTJrJYLJKkwsJCvfjii/r8888VGRkpSQoLC9PXX3+t+fPnq1evXlX2+F955RU988wzGjZsmCRp+vTp+uKLL/Taa68pMTHR3q9p06YKCAiwX3d1dT2v+2vWrJnDPry9vR32K0mPP/64/e9WrVopISFBo0aNUlJS0nndJwCgbIywAQBM79FHH9Xq1as1duxYBQUFadCgQSX6FBdSkuTr66t27dpp9+7dkqTdu3erZ8+eDv179uypn376SVar1b7tmWeeUaNGjdSwYUNt3rzZXhD9/PPPKigo0PXXX69GjRrZL0uWLNEvv/zisN8WLVo49CnNlVdeqcaNG6tly5YaOnSofv/991L75efnKysrq9TsxY+tIu644w41atRIgYGBio6O1q5duyq8D+nv0bzrrrtOF110kRo3bqy77rpLf/75pwoKCs5rfwCAslGwAQBM7/bbb1dgYKBWr16t0aNHq169qpkg8tRTT2nHjh3atm2brr76ag0ZMkRWq9V+fNaqVau0Y8cO+2XXrl0Ox7FJ0ldffeXQpzTvvvuutm/frv/85z/66aefNGrUqCp5PGebOXOmduzYoZUrV+rUqVMaMmRIhffx66+/6uabb1ZERIQ++OADbd261V7YFhUVVXZkAKjzmBIJADC9evXqaeDAgXrjjTc0cuTIUvts2rRJwcHBkqQjR47oxx9/VIcOHSRJHTp00MaNGx36b9y4UW3btnWYOujn56fWrVtL+nu0rXPnzsrIyFDHjh3l7u6uzMzMc05/DA0NlY+Pzz/2admypVq3bq3WrVvr/vvv17Rp00rt5+XlpaCgIG3cuNHhfjdu3KjLL7/8H++jNAEBAfbH99hjjzkc51deW7dulc1m04wZM+Ti8vfvvu+9916FswAAyoeCDQBgapmZmfrpp5/04YcfKiYmxuEYqzNNmTJFTZs2lb+/vyZMmCA/Pz/deuutkqQnnnhCl112mV544QUNHTpUaWlpmjNnToljro4dO6bs7GwVFBRozpw5aty4sS666CJ5enrqySef1NixY2Wz2XTVVVcpLy9PGzdulJeXl0aMGFGhx1RUVKSTJ08qJydH77//vjp16lRm36eeekrx8fG6+OKL1aVLFy1atEg7duxQcnJyhe5Tkk6dOqWTJ0/q6NGjWrp0qdq2bav69etXaB+tW7fWqVOn9Prrr+uWW27Rxo0bNW/evApnAQCUD1MiAQCmFh8fr5tvvlkXX3yxpkyZUma/f/3rX3rsscfUrVs3ZWdna+XKlXJzc5MkXXrppXrvvfe0bNkyderUSZMmTdKUKVMcFhyRpEmTJikwMFCdOnXStm3b9NFHH8nT01PS3yfxnjhxoqZNm6YOHTqoX79+WrVqlUJDQyv8mHr06CFPT0916dJFjRo10vz588vs++ijj2rcuHF64okn1LlzZ61Zs0Yff/yx2rRpU+H7HTJkiDw9PdW2bVsdOHBA7777boX3cckll+jVV1/V9OnT1alTJyUnJ5c5QggAuHAWwzAMZ4cAAOB8ffnll+rdu7eOHDlyzqmIAADUNIywAQAAAIBJUbABAAAAgEkxJRIAAAAATIoRNgAAAAAwKQo2AAAAADApCjYAAAAAMCkKNgAAAAAwKQo2AAAAADApCjYAAAAAMCkKNgAAAAAwKQo2AAAAADCp/wfqRi8ahPVB3QAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from typing import Tuple\n", + "import pandas as pd\n", + "from pandas import DataFrame\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "# Загрузка данных\n", + "df = pd.read_csv(\"..//static//csv//ds_salaries.csv\")\n", + "\n", + "# Создание целевого признака\n", + "median_salary = df['salary_in_usd'].median()\n", + "df['above_median_salary'] = np.where(df['salary_in_usd'] > median_salary, 1, 0)\n", + "\n", + "# Разделение на признаки и целевую переменную\n", + "X = df.drop(columns=['salary_in_usd', 'above_median_salary'])\n", + "y = df['above_median_salary']\n", + "\n", + "# Примерная категоризация\n", + "df['salary_category'] = pd.cut(df['salary_in_usd'], bins=[0, 100000, 200000, np.inf], labels=[0, 1, 2])\n", + "\n", + "# Выбор признаков и целевых переменных\n", + "X = df.drop(columns=['salary_in_usd', 'salary_category'])\n", + "\n", + "def split_stratified_into_train_val_test(\n", + " df_input,\n", + " stratify_colname=\"y\",\n", + " frac_train=0.6,\n", + " frac_val=0.15,\n", + " frac_test=0.25,\n", + " random_state=None,\n", + ") -> Tuple[DataFrame, DataFrame, DataFrame, DataFrame, DataFrame, DataFrame]:\n", + " \n", + " if frac_train + frac_val + frac_test != 1.0:\n", + " raise ValueError(\n", + " \"fractions %f, %f, %f do not add up to 1.0\"\n", + " % (frac_train, frac_val, frac_test)\n", + " )\n", + " \n", + " if stratify_colname not in df_input.columns:\n", + " raise ValueError(\"%s is not a column in the dataframe\" % (stratify_colname))\n", + " X = df_input # Contains all columns.\n", + " y = df_input[\n", + " [stratify_colname]\n", + " ] # Dataframe of just the column on which to stratify.\n", + " \n", + " # Split original dataframe into train and temp dataframes.\n", + " df_train, df_temp, y_train, y_temp = train_test_split(\n", + " X, y, stratify=y, test_size=(1.0 - frac_train), random_state=random_state\n", + " )\n", + "\n", + " if frac_val <= 0:\n", + " assert len(df_input) == len(df_train) + len(df_temp)\n", + " return df_train, pd.DataFrame(), df_temp, y_train, pd.DataFrame(), y_temp\n", + " # Split the temp dataframe into val and test dataframes.\n", + " relative_frac_test = frac_test / (frac_val + frac_test)\n", + "\n", + " df_val, df_test, y_val, y_test = train_test_split(\n", + " df_temp,\n", + " y_temp,\n", + " stratify=y_temp,\n", + " test_size=relative_frac_test,\n", + " random_state=random_state,\n", + " )\n", + "\n", + " assert len(df_input) == len(df_train) + len(df_val) + len(df_test)\n", + " return df_train, df_val, df_test, y_train, y_val, y_test\n", + "\n", + "X_train, X_val, X_test, y_train, y_val, y_test = split_stratified_into_train_val_test(\n", + " df, stratify_colname=\"above_median_salary\", frac_train=0.80, frac_val=0, frac_test=0.20, random_state=42\n", + ")\n", + "\n", + "display(\"X_train\", X_train)\n", + "display(\"y_train\", y_train)\n", + "\n", + "display(\"X_test\", X_test)\n", + "display(\"y_test\", y_test)\n", + "\n", + "# Проверка преобразования\n", + "print(df.dtypes)\n", + "\n", + "# Визуализация распределения зарплат\n", + "plt.figure(figsize=(10, 6))\n", + "sns.histplot(df['salary_in_usd'], bins=50, kde=True)\n", + "plt.title('Распределение зарплат')\n", + "plt.xlabel('Зарплата (USD)')\n", + "plt.ylabel('Частота')\n", + "plt.show()\n", + "\n", + "# Визуализация зависимости между зарплатой и уровнем опыта\n", + "plt.figure(figsize=(10, 6))\n", + "sns.boxplot(x='experience_level', y='salary_in_usd', data=df)\n", + "plt.title('Зависимость зарплаты от уровня опыта')\n", + "plt.xlabel('Уровень опыта')\n", + "plt.ylabel('Зарплата (USD)')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "ename": "IndexError", + "evalue": "Index dimension must be 1 or 2", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[14], line 71\u001b[0m\n\u001b[0;32m 62\u001b[0m pipeline_end \u001b[38;5;241m=\u001b[39m Pipeline(\n\u001b[0;32m 63\u001b[0m [\n\u001b[0;32m 64\u001b[0m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfeatures_preprocessing\u001b[39m\u001b[38;5;124m\"\u001b[39m, features_preprocessing),\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 67\u001b[0m ]\n\u001b[0;32m 68\u001b[0m )\n\u001b[0;32m 70\u001b[0m \u001b[38;5;66;03m# Демонстрация работы конвейера для предобработки данных при классификации\u001b[39;00m\n\u001b[1;32m---> 71\u001b[0m preprocessing_result \u001b[38;5;241m=\u001b[39m \u001b[43mpipeline_end\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit_transform\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX_train\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 72\u001b[0m preprocessed_df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame(\n\u001b[0;32m 73\u001b[0m preprocessing_result,\n\u001b[0;32m 74\u001b[0m columns\u001b[38;5;241m=\u001b[39mpipeline_end\u001b[38;5;241m.\u001b[39mget_feature_names_out(),\n\u001b[0;32m 75\u001b[0m )\n\u001b[0;32m 77\u001b[0m preprocessed_df\n", + "File \u001b[1;32md:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473\u001b[0m, in \u001b[0;36m_fit_context..decorator..wrapper\u001b[1;34m(estimator, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1466\u001b[0m estimator\u001b[38;5;241m.\u001b[39m_validate_params()\n\u001b[0;32m 1468\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m config_context(\n\u001b[0;32m 1469\u001b[0m skip_parameter_validation\u001b[38;5;241m=\u001b[39m(\n\u001b[0;32m 1470\u001b[0m prefer_skip_nested_validation \u001b[38;5;129;01mor\u001b[39;00m global_skip_validation\n\u001b[0;32m 1471\u001b[0m )\n\u001b[0;32m 1472\u001b[0m ):\n\u001b[1;32m-> 1473\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfit_method\u001b[49m\u001b[43m(\u001b[49m\u001b[43mestimator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\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[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32md:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\sklearn\\pipeline.py:533\u001b[0m, in \u001b[0;36mPipeline.fit_transform\u001b[1;34m(self, X, y, **params)\u001b[0m\n\u001b[0;32m 490\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Fit the model and transform with the final estimator.\u001b[39;00m\n\u001b[0;32m 491\u001b[0m \n\u001b[0;32m 492\u001b[0m \u001b[38;5;124;03mFit all the transformers one after the other and sequentially transform\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 530\u001b[0m \u001b[38;5;124;03m Transformed samples.\u001b[39;00m\n\u001b[0;32m 531\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 532\u001b[0m routed_params \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_check_method_params(method\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfit_transform\u001b[39m\u001b[38;5;124m\"\u001b[39m, props\u001b[38;5;241m=\u001b[39mparams)\n\u001b[1;32m--> 533\u001b[0m Xt \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_fit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrouted_params\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 535\u001b[0m last_step \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_final_estimator\n\u001b[0;32m 536\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m _print_elapsed_time(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPipeline\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_log_message(\u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msteps) \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m)):\n", + "File \u001b[1;32md:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\sklearn\\pipeline.py:406\u001b[0m, in \u001b[0;36mPipeline._fit\u001b[1;34m(self, X, y, routed_params)\u001b[0m\n\u001b[0;32m 404\u001b[0m cloned_transformer \u001b[38;5;241m=\u001b[39m clone(transformer)\n\u001b[0;32m 405\u001b[0m \u001b[38;5;66;03m# Fit or load from cache the current transformer\u001b[39;00m\n\u001b[1;32m--> 406\u001b[0m X, fitted_transformer \u001b[38;5;241m=\u001b[39m \u001b[43mfit_transform_one_cached\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 407\u001b[0m \u001b[43m \u001b[49m\u001b[43mcloned_transformer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 408\u001b[0m \u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 409\u001b[0m \u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 410\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[0;32m 411\u001b[0m \u001b[43m \u001b[49m\u001b[43mmessage_clsname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mPipeline\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 412\u001b[0m \u001b[43m \u001b[49m\u001b[43mmessage\u001b[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[43m_log_message\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstep_idx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 413\u001b[0m \u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrouted_params\u001b[49m\u001b[43m[\u001b[49m\u001b[43mname\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 414\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 415\u001b[0m \u001b[38;5;66;03m# Replace the transformer of the step with the fitted\u001b[39;00m\n\u001b[0;32m 416\u001b[0m \u001b[38;5;66;03m# transformer. This is necessary when loading the transformer\u001b[39;00m\n\u001b[0;32m 417\u001b[0m \u001b[38;5;66;03m# from the cache.\u001b[39;00m\n\u001b[0;32m 418\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msteps[step_idx] \u001b[38;5;241m=\u001b[39m (name, fitted_transformer)\n", + "File \u001b[1;32md:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\joblib\\memory.py:312\u001b[0m, in \u001b[0;36mNotMemorizedFunc.__call__\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 311\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m--> 312\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\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[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32md:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\sklearn\\pipeline.py:1310\u001b[0m, in \u001b[0;36m_fit_transform_one\u001b[1;34m(transformer, X, y, weight, message_clsname, message, params)\u001b[0m\n\u001b[0;32m 1308\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m _print_elapsed_time(message_clsname, message):\n\u001b[0;32m 1309\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(transformer, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfit_transform\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[1;32m-> 1310\u001b[0m res \u001b[38;5;241m=\u001b[39m \u001b[43mtransformer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit_transform\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\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[43mparams\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mfit_transform\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1311\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 1312\u001b[0m res \u001b[38;5;241m=\u001b[39m transformer\u001b[38;5;241m.\u001b[39mfit(X, y, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfit\u001b[39m\u001b[38;5;124m\"\u001b[39m, {}))\u001b[38;5;241m.\u001b[39mtransform(\n\u001b[0;32m 1313\u001b[0m X, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtransform\u001b[39m\u001b[38;5;124m\"\u001b[39m, {})\n\u001b[0;32m 1314\u001b[0m )\n", + "File \u001b[1;32md:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\sklearn\\utils\\_set_output.py:316\u001b[0m, in \u001b[0;36m_wrap_method_output..wrapped\u001b[1;34m(self, X, *args, **kwargs)\u001b[0m\n\u001b[0;32m 314\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(f)\n\u001b[0;32m 315\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapped\u001b[39m(\u001b[38;5;28mself\u001b[39m, X, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m--> 316\u001b[0m data_to_wrap \u001b[38;5;241m=\u001b[39m \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\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[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 317\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(data_to_wrap, \u001b[38;5;28mtuple\u001b[39m):\n\u001b[0;32m 318\u001b[0m \u001b[38;5;66;03m# only wrap the first output for cross decomposition\u001b[39;00m\n\u001b[0;32m 319\u001b[0m return_tuple \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m 320\u001b[0m _wrap_data_with_container(method, data_to_wrap[\u001b[38;5;241m0\u001b[39m], X, \u001b[38;5;28mself\u001b[39m),\n\u001b[0;32m 321\u001b[0m \u001b[38;5;241m*\u001b[39mdata_to_wrap[\u001b[38;5;241m1\u001b[39m:],\n\u001b[0;32m 322\u001b[0m )\n", + "File \u001b[1;32md:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1098\u001b[0m, in \u001b[0;36mTransformerMixin.fit_transform\u001b[1;34m(self, X, y, **fit_params)\u001b[0m\n\u001b[0;32m 1083\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[0;32m 1084\u001b[0m (\n\u001b[0;32m 1085\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThis object (\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m) has a `transform`\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1093\u001b[0m \u001b[38;5;167;01mUserWarning\u001b[39;00m,\n\u001b[0;32m 1094\u001b[0m )\n\u001b[0;32m 1096\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m y \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 1097\u001b[0m \u001b[38;5;66;03m# fit method of arity 1 (unsupervised transformation)\u001b[39;00m\n\u001b[1;32m-> 1098\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\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[43mfit_params\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtransform\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1099\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 1100\u001b[0m \u001b[38;5;66;03m# fit method of arity 2 (supervised transformation)\u001b[39;00m\n\u001b[0;32m 1101\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfit(X, y, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mfit_params)\u001b[38;5;241m.\u001b[39mtransform(X)\n", + "File \u001b[1;32md:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\sklearn\\utils\\_set_output.py:316\u001b[0m, in \u001b[0;36m_wrap_method_output..wrapped\u001b[1;34m(self, X, *args, **kwargs)\u001b[0m\n\u001b[0;32m 314\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(f)\n\u001b[0;32m 315\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapped\u001b[39m(\u001b[38;5;28mself\u001b[39m, X, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m--> 316\u001b[0m data_to_wrap \u001b[38;5;241m=\u001b[39m \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\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[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 317\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(data_to_wrap, \u001b[38;5;28mtuple\u001b[39m):\n\u001b[0;32m 318\u001b[0m \u001b[38;5;66;03m# only wrap the first output for cross decomposition\u001b[39;00m\n\u001b[0;32m 319\u001b[0m return_tuple \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m 320\u001b[0m _wrap_data_with_container(method, data_to_wrap[\u001b[38;5;241m0\u001b[39m], X, \u001b[38;5;28mself\u001b[39m),\n\u001b[0;32m 321\u001b[0m \u001b[38;5;241m*\u001b[39mdata_to_wrap[\u001b[38;5;241m1\u001b[39m:],\n\u001b[0;32m 322\u001b[0m )\n", + "Cell \u001b[1;32mIn[14], line 18\u001b[0m, in \u001b[0;36mSalaryFeatures.transform\u001b[1;34m(self, X, y)\u001b[0m\n\u001b[0;32m 15\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mtransform\u001b[39m(\u001b[38;5;28mself\u001b[39m, X, y\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[0;32m 16\u001b[0m \u001b[38;5;66;03m# Создание новых признаков\u001b[39;00m\n\u001b[0;32m 17\u001b[0m X \u001b[38;5;241m=\u001b[39m X\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[1;32m---> 18\u001b[0m X[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mwork_year_to_remote_ratio\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[43mX\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mwork_year\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m \u001b[38;5;241m/\u001b[39m X[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mremote_ratio\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 19\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m X\n", + "File \u001b[1;32md:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\scipy\\sparse\\_csr.py:24\u001b[0m, in \u001b[0;36m_csr_base.__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 22\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__getitem__\u001b[39m(\u001b[38;5;28mself\u001b[39m, key):\n\u001b[0;32m 23\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mndim \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m2\u001b[39m:\n\u001b[1;32m---> 24\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__getitem__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 26\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(key, \u001b[38;5;28mtuple\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(key) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[0;32m 27\u001b[0m key \u001b[38;5;241m=\u001b[39m key[\u001b[38;5;241m0\u001b[39m]\n", + "File \u001b[1;32md:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\scipy\\sparse\\_index.py:52\u001b[0m, in \u001b[0;36mIndexMixin.__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 51\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__getitem__\u001b[39m(\u001b[38;5;28mself\u001b[39m, key):\n\u001b[1;32m---> 52\u001b[0m row, col \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_validate_indices\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 54\u001b[0m \u001b[38;5;66;03m# Dispatch to specialized methods.\u001b[39;00m\n\u001b[0;32m 55\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(row, INT_TYPES):\n", + "File \u001b[1;32md:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\scipy\\sparse\\_index.py:186\u001b[0m, in \u001b[0;36mIndexMixin._validate_indices\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 184\u001b[0m row \u001b[38;5;241m=\u001b[39m _validate_bool_idx(bool_row, M, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrow\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 185\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(row, \u001b[38;5;28mslice\u001b[39m):\n\u001b[1;32m--> 186\u001b[0m row \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_asindices\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrow\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mM\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 188\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m isintlike(col):\n\u001b[0;32m 189\u001b[0m col \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mint\u001b[39m(col)\n", + "File \u001b[1;32md:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\scipy\\sparse\\_index.py:212\u001b[0m, in \u001b[0;36mIndexMixin._asindices\u001b[1;34m(self, idx, length)\u001b[0m\n\u001b[0;32m 209\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mIndexError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minvalid index\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01me\u001b[39;00m\n\u001b[0;32m 211\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m x\u001b[38;5;241m.\u001b[39mndim \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m (\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m2\u001b[39m):\n\u001b[1;32m--> 212\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mIndexError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mIndex dimension must be 1 or 2\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 214\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m x\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m 215\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m x\n", + "\u001b[1;31mIndexError\u001b[0m: Index dimension must be 1 or 2" + ] + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "from sklearn.base import BaseEstimator, TransformerMixin\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.impute import SimpleImputer\n", + "from sklearn.preprocessing import OneHotEncoder, StandardScaler\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "# Загрузка данных\n", + "df = pd.read_csv(\"..//static//csv//ds_salaries.csv\")\n", + "\n", + "# Создание целевого признака\n", + "median_salary = df['salary_in_usd'].median()\n", + "df['above_median_salary'] = np.where(df['salary_in_usd'] > median_salary, 1, 0)\n", + "\n", + "# Разделение на признаки и целевую переменную\n", + "X = df.drop(columns=['salary_in_usd', 'above_median_salary'])\n", + "y = df['above_median_salary']\n", + "\n", + "# Разделение данных на тренировочный и тестовый наборы\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)\n", + "\n", + "# Построение конвейеров предобработки\n", + "\n", + "class SalaryFeatures(BaseEstimator, TransformerMixin):\n", + " def __init__(self):\n", + " pass\n", + " def fit(self, X, y=None):\n", + " return self\n", + " def transform(self, X, y=None):\n", + " # Создание новых признаков\n", + " X = X.copy()\n", + " X[\"work_year_to_remote_ratio\"] = X[\"work_year\"] / X[\"remote_ratio\"]\n", + " return X\n", + " def get_feature_names_out(self, features_in):\n", + " # Добавление имен новых признаков\n", + " new_features = [\"work_year_to_remote_ratio\"]\n", + " return np.append(features_in, new_features, axis=0)\n", + "\n", + "# Обработка числовых данных. Числовой конвейер: заполнение пропущенных значений медианой и стандартизация\n", + "preprocessing_num_class = Pipeline(steps=[\n", + " ('imputer', SimpleImputer(strategy='median')),\n", + " ('scaler', StandardScaler())\n", + "])\n", + "\n", + "# Обработка категориальных данных: заполнение пропущенных значений наиболее частым значением и one-hot encoding\n", + "preprocessing_cat_class = Pipeline(steps=[\n", + " ('imputer', SimpleImputer(strategy='most_frequent')),\n", + " ('onehot', OneHotEncoder(handle_unknown='ignore'))\n", + "])\n", + "\n", + "# Определение столбцов\n", + "numeric_columns = [\"work_year\", \"salary\", \"salary_in_usd\", \"remote_ratio\"]\n", + "cat_columns = [\"experience_level\", \"employment_type\", \"job_title\", \"salary_currency\", \"employee_residence\", \"company_location\", \"company_size\"]\n", + "\n", + "# Предобработка признаков\n", + "features_preprocessing = ColumnTransformer(\n", + " verbose_feature_names_out=False,\n", + " transformers=[\n", + " (\"prepocessing_num\", preprocessing_num_class, numeric_columns),\n", + " (\"prepocessing_cat\", preprocessing_cat_class, cat_columns),\n", + " ],\n", + " remainder=\"passthrough\"\n", + ")\n", + "\n", + "# Удаление колонок\n", + "columns_to_drop = [] # Укажите столбцы, которые нужно удалить, если они есть\n", + "drop_columns = ColumnTransformer(\n", + " verbose_feature_names_out=False,\n", + " transformers=[\n", + " (\"drop_columns\", \"drop\", columns_to_drop),\n", + " ],\n", + " remainder=\"passthrough\",\n", + ")\n", + "\n", + "# Основной конвейер предобработки данных и конструирования признаков\n", + "pipeline_end = Pipeline(\n", + " [\n", + " (\"features_preprocessing\", features_preprocessing),\n", + " (\"custom_features\", SalaryFeatures()),\n", + " (\"drop_columns\", drop_columns),\n", + " ]\n", + ")\n", + "\n", + "# Демонстрация работы конвейера для предобработки данных при классификации\n", + "preprocessing_result = pipeline_end.fit_transform(X_train)\n", + "\n", + "# Получение имен столбцов после преобразования\n", + "feature_names = pipeline_end.named_steps['features_preprocessing'].get_feature_names_out(numeric_columns + cat_columns)\n", + "feature_names = np.append(feature_names, [\"work_year_to_remote_ratio\"])\n", + "\n", + "# Создание DataFrame с преобразованными данными\n", + "preprocessed_df = pd.DataFrame(\n", + " preprocessing_result,\n", + " columns=feature_names,\n", + ")\n", + "\n", + "preprocessed_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Бизнес-цели**\n", + "\n", + "1. Предсказание заработной платы (Регрессия)\n", + "\n", + " Цель: Предсказать заработную плату (salary_in_usd) на основе других характеристик, таких как уровень опыта (experience_level), тип занятости (employment_type), должность (job_title), место проживания сотрудника (employee_residence), размер компании (company_size) и другие факторы.\n", + "\n", + " Применение: Это может быть полезно для HR-отделов, которые хотят оценить справедливую зарплату для новых сотрудников или для анализа рынка труда.\n", + "\n", + "2. Классификация уровня опыта по зарплате (Классификация)\n", + "\n", + " Цель: Классифицировать уровень опыта (experience_level) на основе заработной платы (salary_in_usd) и других факторов.\n", + "\n", + " Применение: Это может помочь в оценке, на каком уровне опыта находится сотрудник, основываясь на его зарплате, что может быть полезно для оценки карьерного роста." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. Прогнозирование зарплаты" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " work_year experience_level employment_type job_title \\\n", + "0 2023 SE FT Principal Data Scientist \n", + "1 2023 MI CT ML Engineer \n", + "2 2023 MI CT ML Engineer \n", + "3 2023 SE FT Data Scientist \n", + "4 2023 SE FT Data Scientist \n", + "\n", + " salary salary_currency salary_in_usd employee_residence remote_ratio \\\n", + "0 80000 EUR 85847 ES 100 \n", + "1 30000 USD 30000 US 100 \n", + "2 25500 USD 25500 US 100 \n", + "3 175000 USD 175000 CA 100 \n", + "4 120000 USD 120000 CA 100 \n", + "\n", + " company_location company_size \n", + "0 ES L \n", + "1 US S \n", + "2 US S \n", + "3 CA M \n", + "4 CA M \n", + "\n", + "RangeIndex: 3755 entries, 0 to 3754\n", + "Data columns (total 11 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 work_year 3755 non-null int64 \n", + " 1 experience_level 3755 non-null object\n", + " 2 employment_type 3755 non-null object\n", + " 3 job_title 3755 non-null object\n", + " 4 salary 3755 non-null int64 \n", + " 5 salary_currency 3755 non-null object\n", + " 6 salary_in_usd 3755 non-null int64 \n", + " 7 employee_residence 3755 non-null object\n", + " 8 remote_ratio 3755 non-null int64 \n", + " 9 company_location 3755 non-null object\n", + " 10 company_size 3755 non-null object\n", + "dtypes: int64(4), object(7)\n", + "memory usage: 322.8+ KB\n", + "None\n", + " work_year salary salary_in_usd remote_ratio\n", + "count 3755.000000 3.755000e+03 3755.000000 3755.000000\n", + "mean 2022.373635 1.906956e+05 137570.389880 46.271638\n", + "std 0.691448 6.716765e+05 63055.625278 48.589050\n", + "min 2020.000000 6.000000e+03 5132.000000 0.000000\n", + "25% 2022.000000 1.000000e+05 95000.000000 0.000000\n", + "50% 2022.000000 1.380000e+05 135000.000000 0.000000\n", + "75% 2023.000000 1.800000e+05 175000.000000 100.000000\n", + "max 2023.000000 3.040000e+07 450000.000000 100.000000\n", + "work_year 0\n", + "experience_level 0\n", + "employment_type 0\n", + "job_title 0\n", + "salary 0\n", + "salary_currency 0\n", + "salary_in_usd 0\n", + "employee_residence 0\n", + "remote_ratio 0\n", + "company_location 0\n", + "company_size 0\n", + "dtype: int64\n", + "Mean Squared Error: 2482079980.9527493\n", + "R^2 Score: 0.37127352660208646\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import StandardScaler, OneHotEncoder\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.metrics import mean_squared_error, r2_score\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Загружаем набор данных\n", + "df = pd.read_csv(\"..//static//csv//ds_salaries.csv\")\n", + "\n", + "# Устанавливаем случайное состояние\n", + "random_state = 42\n", + "\n", + "# Предварительный анализ данных\n", + "print(df.head())\n", + "print(df.info())\n", + "print(df.describe())\n", + "\n", + "# Проверка на пропущенные значения\n", + "print(df.isnull().sum())\n", + "\n", + "# Предобработка данных\n", + "# Определяем категориальные и числовые столбцы\n", + "categorical_features = ['experience_level', 'employment_type', 'job_title', 'employee_residence', 'company_location', 'company_size']\n", + "numeric_features = ['work_year', 'remote_ratio']\n", + "\n", + "# Создаем пайплайн для обработки данных\n", + "preprocessor = ColumnTransformer(\n", + " transformers=[\n", + " ('num', StandardScaler(), numeric_features),\n", + " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)])\n", + "\n", + "# Определяем целевую переменную и признаки\n", + "X = df.drop('salary_in_usd', axis=1)\n", + "y = df['salary_in_usd']\n", + "\n", + "# Разделяем данные на обучающую и тестовую выборки\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=random_state)\n", + "\n", + "# Создаем и обучаем модель\n", + "model = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('regressor', LinearRegression())])\n", + "\n", + "model.fit(X_train, y_train)\n", + "\n", + "# Делаем предсказания на тестовой выборке\n", + "y_pred = model.predict(X_test)\n", + "\n", + "# Оцениваем качество модели\n", + "mse = mean_squared_error(y_test, y_pred)\n", + "r2 = r2_score(y_test, y_pred)\n", + "\n", + "print(f\"Mean Squared Error: {mse}\")\n", + "print(f\"R^2 Score: {r2}\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2. Классифицировать уровень опыта" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " EN 0.55 0.48 0.51 67\n", + " EX 0.46 0.26 0.33 23\n", + " MI 0.48 0.54 0.51 157\n", + " SE 0.83 0.83 0.83 504\n", + "\n", + " accuracy 0.72 751\n", + " macro avg 0.58 0.53 0.55 751\n", + "weighted avg 0.72 0.72 0.72 751\n", + "\n", + "Confusion Matrix:\n", + "[[ 32 0 20 15]\n", + " [ 0 6 5 12]\n", + " [ 14 0 84 59]\n", + " [ 12 7 65 420]]\n", + "Accuracy Score: 0.7217043941411452\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhsAAAHHCAYAAAAWM5p0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABVJElEQVR4nO3deXwM5x8H8M9ujs193yVuIcTR0Ij7CEEccVSVEqq0aaIIqlFH0IoGdRNtHakKbRUt6la0FURIEaSoNlQOCTlEsons/P5Q++s2QcJOZpP9vPua18s+88zMd5KSb77P88zIBEEQQERERCQSudQBEBERUfXGZIOIiIhExWSDiIiIRMVkg4iIiETFZIOIiIhExWSDiIiIRMVkg4iIiETFZIOIiIhExWSDiIiIRMVkg0hEV69eRY8ePWBtbQ2ZTIadO3dq9fx//vknZDIZNm7cqNXzVmWdO3dG586dpQ6DiP6FyQZVe9evX8fbb7+NunXrwsTEBFZWVmjXrh2WLVuGgoICUa8dFBSECxcu4OOPP8amTZvQqlUrUa9XmUaNGgWZTAYrK6syv45Xr16FTCaDTCbDokWLKnz+27dvIyIiAomJiVqIloikZCh1AERi2rNnD1599VUoFAqMHDkSTZs2RVFREX755RdMnToVSUlJ+Oyzz0S5dkFBAeLi4vDhhx8iNDRUlGvUqlULBQUFMDIyEuX8z2JoaIgHDx5g165dGDJkiMa+zZs3w8TEBIWFhc917tu3b2POnDmoXbs2WrRoUe7jDhw48FzXIyLxMNmgauvGjRsYOnQoatWqhSNHjsDV1VW9LyQkBNeuXcOePXtEu/6dO3cAADY2NqJdQyaTwcTERLTzP4tCoUC7du2wZcuWUslGbGwsAgIC8N1331VKLA8ePICZmRmMjY0r5XpEVH4cRqFqKyoqCvfv38e6des0Eo3H6tevjwkTJqg/P3z4EPPmzUO9evWgUChQu3ZtTJ8+HUqlUuO42rVro0+fPvjll1/wyiuvwMTEBHXr1sWXX36p7hMREYFatWoBAKZOnQqZTIbatWsDeDT88PjP/xYREQGZTKbRdvDgQbRv3x42NjawsLCAh4cHpk+frt7/pDkbR44cQYcOHWBubg4bGxv0798fly9fLvN6165dw6hRo2BjYwNra2uMHj0aDx48ePIX9j+GDRuGvXv3Ijs7W90WHx+Pq1evYtiwYaX63717F1OmTIGXlxcsLCxgZWWFXr164bffflP3OXr0KFq3bg0AGD16tHo45vF9du7cGU2bNkVCQgI6duwIMzMz9dflv3M2goKCYGJiUur+/f39YWtri9u3b5f7Xono+TDZoGpr165dqFu3Ltq2bVuu/m+99RZmzZqFl19+GUuWLEGnTp0QGRmJoUOHlup77do1DB48GN27d8fixYtha2uLUaNGISkpCQAwcOBALFmyBADw+uuvY9OmTVi6dGmF4k9KSkKfPn2gVCoxd+5cLF68GP369cOvv/761OMOHToEf39/ZGRkICIiAmFhYThx4gTatWuHP//8s1T/IUOGIC8vD5GRkRgyZAg2btyIOXPmlDvOgQMHQiaTYfv27eq22NhYNGrUCC+//HKp/n/88Qd27tyJPn364NNPP8XUqVNx4cIFdOrUSf2Dv3Hjxpg7dy4AYNy4cdi0aRM2bdqEjh07qs+TlZWFXr16oUWLFli6dCm6dOlSZnzLli2Do6MjgoKCUFJSAgBYu3YtDhw4gBUrVsDNza3c90pEz0kgqoZycnIEAEL//v3L1T8xMVEAILz11lsa7VOmTBEACEeOHFG31apVSwAgHD9+XN2WkZEhKBQKYfLkyeq2GzduCACEhQsXapwzKChIqFWrVqkYZs+eLfz7r+SSJUsEAMKdO3eeGPfja2zYsEHd1qJFC8HJyUnIyspSt/3222+CXC4XRo4cWep6b775psY5BwwYINjb2z/xmv++D3Nzc0EQBGHw4MFCt27dBEEQhJKSEsHFxUWYM2dOmV+DwsJCoaSkpNR9KBQKYe7cueq2+Pj4Uvf2WKdOnQQAQnR0dJn7OnXqpNG2f/9+AYDw0UcfCX/88YdgYWEhBAYGPvMeiUg7WNmgaik3NxcAYGlpWa7+P/74IwAgLCxMo33y5MkAUGpuh6enJzp06KD+7OjoCA8PD/zxxx/PHfN/PZ7r8f3330OlUpXrmNTUVCQmJmLUqFGws7NTtzdr1gzdu3dX3+e/vfPOOxqfO3TogKysLPXXsDyGDRuGo0ePIi0tDUeOHEFaWlqZQyjAo3kecvmjf3pKSkqQlZWlHiI6e/Zsua+pUCgwevTocvXt0aMH3n77bcydOxcDBw6EiYkJ1q5dW+5rEdGLYbJB1ZKVlRUAIC8vr1z9//rrL8jlctSvX1+j3cXFBTY2Nvjrr7802t3d3Uudw9bWFvfu3XvOiEt77bXX0K5dO7z11ltwdnbG0KFD8c033zw18Xgcp4eHR6l9jRs3RmZmJvLz8zXa/3svtra2AFChe+nduzcsLS3x9ddfY/PmzWjdunWpr+VjKpUKS5YsQYMGDaBQKODg4ABHR0ecP38eOTk55b7mSy+9VKHJoIsWLYKdnR0SExOxfPlyODk5lftYInoxTDaoWrKysoKbmxsuXrxYoeP+O0HzSQwMDMpsFwThua/xeD7BY6ampjh+/DgOHTqEESNG4Pz583jttdfQvXv3Un1fxIvcy2MKhQIDBw5ETEwMduzY8cSqBgDMnz8fYWFh6NixI7766ivs378fBw8eRJMmTcpdwQEefX0q4ty5c8jIyAAAXLhwoULHEtGLYbJB1VafPn1w/fp1xMXFPbNvrVq1oFKpcPXqVY329PR0ZGdnq1eWaIOtra3Gyo3H/ls9AQC5XI5u3brh008/xaVLl/Dxxx/jyJEj+Omnn8o89+M4k5OTS+27cuUKHBwcYG5u/mI38ATDhg3DuXPnkJeXV+ak2se2bduGLl26YN26dRg6dCh69OgBPz+/Ul+T8iZ+5ZGfn4/Ro0fD09MT48aNQ1RUFOLj47V2fiJ6OiYbVG29//77MDc3x1tvvYX09PRS+69fv45ly5YBeDQMAKDUipFPP/0UABAQEKC1uOrVq4ecnBycP39e3ZaamoodO3Zo9Lt7926pYx8/3Oq/y3Efc3V1RYsWLRATE6Pxw/vixYs4cOCA+j7F0KVLF8ybNw8rV66Ei4vLE/sZGBiUqpp8++23+PvvvzXaHidFZSVmFTVt2jSkpKQgJiYGn376KWrXro2goKAnfh2JSLv4UC+qturVq4fY2Fi89tpraNy4scYTRE+cOIFvv/0Wo0aNAgA0b94cQUFB+Oyzz5CdnY1OnTrh9OnTiImJQWBg4BOXVT6PoUOHYtq0aRgwYADee+89PHjwAGvWrEHDhg01JkjOnTsXx48fR0BAAGrVqoWMjAysXr0aNWrUQPv27Z94/oULF6JXr17w9fXFmDFjUFBQgBUrVsDa2hoRERFau4//ksvlmDFjxjP79enTB3PnzsXo0aPRtm1bXLhwAZs3b0bdunU1+tWrVw82NjaIjo6GpaUlzM3N4ePjgzp16lQoriNHjmD16tWYPXu2einuhg0b0LlzZ8ycORNRUVEVOh8RPQeJV8MQie73338Xxo4dK9SuXVswNjYWLC0thXbt2gkrVqwQCgsL1f2Ki4uFOXPmCHXq1BGMjIyEmjVrCuHh4Rp9BOHR0teAgIBS1/nvkssnLX0VBEE4cOCA0LRpU8HY2Fjw8PAQvvrqq1JLXw8fPiz0799fcHNzE4yNjQU3Nzfh9ddfF37//fdS1/jv8tBDhw4J7dq1E0xNTQUrKyuhb9++wqVLlzT6PL7ef5fWbtiwQQAg3Lhx44lfU0HQXPr6JE9a+jp58mTB1dVVMDU1Fdq1ayfExcWVuWT1+++/Fzw9PQVDQ0ON++zUqZPQpEmTMq/57/Pk5uYKtWrVEl5++WWhuLhYo9+kSZMEuVwuxMXFPfUeiOjFyQShArPAiIiIiCqIczaIiIhIVEw2iIiISFRMNoiIiEhUTDaIiIhIVEw2iIiISFRMNoiIiEhUTDaIiIhIVNXyCaLpucVSh0D/sDYzkjoE+peCIu29wI1ejFyL736hF2NtKv7v3aYtQ7VynoJzK7VynsrGygYRERGJqlpWNoiIiHSKTL9/t2eyQUREJDY9HzZjskFERCQ2Pa9s6PfdExERkehY2SAiIhIbh1GIiIhIVBxGISIiIhIPKxtERERi4zAKERERiYrDKERERETiYWWDiIhIbHo+jMLKBhERkdhkcu1sL2DBggWQyWSYOHGiuq2wsBAhISGwt7eHhYUFBg0ahPT0dI3jUlJSEBAQADMzMzg5OWHq1Kl4+PBhha7NZIOIiKiai4+Px9q1a9GsWTON9kmTJmHXrl349ttvcezYMdy+fRsDBw5U7y8pKUFAQACKiopw4sQJxMTEYOPGjZg1a1aFrs9kg4iISGwymXa253D//n0MHz4cn3/+OWxtbdXtOTk5WLduHT799FN07doV3t7e2LBhA06cOIGTJ08CAA4cOIBLly7hq6++QosWLdCrVy/MmzcPq1atQlFRUbljYLJBREQkNgmHUUJCQhAQEAA/Pz+N9oSEBBQXF2u0N2rUCO7u7oiLiwMAxMXFwcvLC87Ozuo+/v7+yM3NRVJSUrlj4ARRIiIisWlpgqhSqYRSqdRoUygUUCgUZfbfunUrzp49i/j4+FL70tLSYGxsDBsbG412Z2dnpKWlqfv8O9F4vP/xvvJiZYOIiKiKiIyMhLW1tcYWGRlZZt+bN29iwoQJ2Lx5M0xMTCo5Uk1MNoiIiMSmpWGU8PBw5OTkaGzh4eFlXjIhIQEZGRl4+eWXYWhoCENDQxw7dgzLly+HoaEhnJ2dUVRUhOzsbI3j0tPT4eLiAgBwcXEptTrl8efHfcqDyQYREZHYtJRsKBQKWFlZaWxPGkLp1q0bLly4gMTERPXWqlUrDB8+XP1nIyMjHD58WH1McnIyUlJS4OvrCwDw9fXFhQsXkJGRoe5z8OBBWFlZwdPTs9y3zzkbRERE1ZClpSWaNm2q0WZubg57e3t1+5gxYxAWFgY7OztYWVlh/Pjx8PX1RZs2bQAAPXr0gKenJ0aMGIGoqCikpaVhxowZCAkJeWKSUxYmG0RERGKT6+YTRJcsWQK5XI5BgwZBqVTC398fq1evVu83MDDA7t27ERwcDF9fX5ibmyMoKAhz586t0HVkgiAI2g5eaum5xVKHQP+wNjOSOgT6l4KiEqlDoH/I9fzx1brE2lT8GQWmXT/WynkKjnyolfNUNs7ZICIiIlFxGIWIiEhsel7JYrJBREQkthd8iVpVp993T0RERKJjZYOIiEhsHEYhIiIiUen5MAqTDSIiIrHpeWVDv1MtIiIiEh0rG0RERGLjMAoRERGJisMoREREROJhZYOIiEhsHEYhIiIiUXEYhYiIiEg8rGwQERGJjcMoREREJCo9Tzb0++6JiIhIdKxsSGjntq3Y+d3XSEu9DQCoU7c+gsa8gzbtOiA3JwfrP1uF+JMnkJ6eChsbW3To3BVj3hkPCwtLiSPXL1tjNyNmwzpkZt5BQ49G+GD6THg1ayZ1WNVazLrPcPTIIfz15x9QKEzg1bwFQiZMRq3addR9lEolln8ahYP7f0RxURF8fNtj6vSZsLd3kDDy6udsQjy+ilmPK5eTkHnnDqI+XYHOXf3U++fMDMeeXTs1jmnTtj2Wr/68kiPVcXo+QZTJhoQcnVzwdugk1KhZCxAE7NvzPaZPGY91X22DIAjIvJOBdydMQe26dZGWmorFC+Yi884dzPtkidSh6419e3/EoqhIzJg9B15ezbF5UwyC3x6D73fvg729vdThVVvnzp7BoNdeh2eTpih5WII1K5diQvBb2LJ9F0xNzQAASxctwIlfjmF+1BJYWFhi0YKP8MHkCfh842aJo69eCgsK0KChB/oGDsS0sPfK7OPbrgNmzvlY/dnY2Liywqs69HwYRSYIgiB1ENqWnlssdQjPLaBbWwS/Nxl9+g8qte+nQ/vx0awPsP94PAwNq0aeaG1mJHUIL2T40FfRpKkXps+YBQBQqVTo0a0TXh82AmPGjpM4uoorKCqROoTncu/uXfTq1h5rvvgSLb1b4X5eHnp2bYe58xeia3d/AMCfN/7A0IF98EXMFjRt1lziiJ9NXgV/032lReMyKxt5eXlYtHSlhJG9GGtT8RMB08DPtHKegp1V798dQOLKRmZmJtavX4+4uDikpaUBAFxcXNC2bVuMGjUKjo6OUoZXqUpKSnD08H4UFhSgqVeLMvvk38+DmblFlUk0qrrioiJcvpSEMWPfVrfJ5XK0adMW5387J2Fk+uf+/TwAgJW1NQDgyuUkPHz4EK3b+Kr71K5TFy4urrhwPrFKJBvVydkzp+HfpR0srazQ6hUfvBMyATY2tlKHRTpEsp9a8fHx8Pf3h5mZGfz8/NCwYUMAQHp6OpYvX44FCxZg//79aNWq1VPPo1QqoVQq/9Mmh0KhEC12bbp+7Xe8++ZwFBUVwdTUDB8tXIbadeuV6pedfQ8x69ai34DBEkSpn+5l30NJSUmp4RJ7e3vcuPGHRFHpH5VKhaWLFqBZi5dRr34DAEBWViaMjIxgaWml0dfO3gFZWZlShKm3fNu1R5du3eH2Ug3cupmCNSuXYmLI21j35RYYGBhIHZ7u0PNhFMmSjfHjx+PVV19FdHQ0ZP8pJwqCgHfeeQfjx49HXFzcU88TGRmJOXPmaLRN/mAGpobP0nrMYnCvVQfrNn+H/Pt5OHr4AOZHfIgVazdqJBz59+9j2sR3UbtOPYwe966E0RJVvoWR83D92lV8tuErqUOhMvToGaD+c/0GDdGgoQcG9OmBhDOn8YqP71OO1DNVcNhMmyRLtX777TdMmjSpVKIBADKZDJMmTUJiYuIzzxMeHo6cnByN7b2waSJELA4jIyPUqOkOj8ZN8HboJNRv4IFvt/7/H9UH+fmY8t7bMDMzx0cLl8HQsGrPgahKbG1sYWBggKysLI32rKwsODhwxUNlWLTgI/z68zGs/nwjnJxd1O329g4oLi5GXl6uRv+7WZlcjSKxl2rUhI2tLW7dTJE6FNIhkiUbLi4uOH369BP3nz59Gs7Ozs88j0KhgJWVlcZWVYZQyqISVCguKgLwqKIxefw4GBkZIfLTFVX6vqoiI2NjNPZsglMn/19dU6lUOHUqDs2at5QwsupPEAQsWvARjh05hJVr18PtpRoa+xs1bgJDQ0PEnzqpbvvrzxtIS0uFV7MWlRwt/Vt6ehpysrPh4KA/c+7KQyaTaWWrqiQbRpkyZQrGjRuHhIQEdOvWTZ1YpKen4/Dhw/j888+xaNEiqcKrFGtXLoFP2w5wdnHFgwf5OLRvDxIT4rFoxVp1olFYWIAZc5ch/34+8u/nAwBsbG05FlpJRgSNxszp09CkSVM09WqGrzbFoKCgAIEDBkodWrW2MHIeDuzdg6glK2Fubo6szDsAAHMLS5iYmMDC0hJ9Awdh+eJPYG1tDXNzCyz+5GN4NWvByaFa9uBBPm6l/L9KcfvvW/j9ymVYWVvDytoaX0SvRhe/7rC3d8StWylYuXQRatR0R5u27SWMWvdU5URBGyRd+vr1119jyZIlSEhIQEnJoyV5BgYG8Pb2RlhYGIYMGfJc560qS18XzJuJs/GnkJV5B+YWlqhXvyGGBb2J1j5tcS7hNCa882aZx339/X64ur1UydE+n6q+9BUAtmz+Sv1QL49GjTFt+gw0q6I/0KrK0tc2LT3LbJ8x52P06TcAwL8e6rVvD4qKiuHTth3eD58J+yryG3VVWfqaEH8awWODSrUH9A3EtA9nY+qkUPx+5TLy8vLg6OgIH992eDvkvSo1nFUZS1/NB2/Qynnyt43Wynkqm048Z6O4uBiZmY9mkDs4OMDI6MV+QFWVZEMfVIdkozqpKsmGPqgqyYY+qJRk41UtJRvfVs1kQyce2GBkZARXV1epwyAiIhKFvg+j6PfCXyIiIhKdTlQ2iIiIqjN9r2ww2SAiIhIZkw0iIiISlb4nG5yzQUREVA2tWbMGzZo1Uz/w0tfXF3v37lXv79y5c6mHhr3zzjsa50hJSUFAQADMzMzg5OSEqVOn4uHDhxWOhZUNIiIisUlQ2KhRowYWLFiABg0aQBAExMTEoH///jh37hyaNGkCABg7dizmzp2rPsbMzEz955KSEgQEBMDFxQUnTpxAamoqRo4cCSMjI8yfP79CsTDZICIiEpkUwyh9+/bV+Pzxxx9jzZo1OHnypDrZMDMzg4uLS1mH48CBA7h06RIOHToEZ2dntGjRAvPmzcO0adMQEREBY2PjcsfCYRQiIqJqrqSkBFu3bkV+fj58ff//Nt7NmzfDwcEBTZs2RXh4OB48eKDeFxcXBy8vL433lPn7+yM3NxdJSUkVuj4rG0RERCLTVmVDqVRCqVRqtCkUiie+qPPChQvw9fVFYWEhLCwssGPHDnh6PnodwLBhw1CrVi24ubnh/PnzmDZtGpKTk7F9+3YAQFpaWqkXoj7+nJaWVqG4mWwQERGJTFvJRmRkJObMmaPRNnv2bERERJTZ38PDA4mJicjJycG2bdsQFBSEY8eOwdPTE+PGjVP38/LygqurK7p164br16+jXr16Won3MSYbREREVUR4eDjCwsI02p5U1QAAY2Nj1K9fHwDg7e2N+Ph4LFu2DGvXri3V18fHBwBw7do11KtXDy4uLjh9+rRGn/T0dAB44jyPJ+GcDSIiIpH9d4np824KhUK9lPXx9rRk479UKlWpYZjHEhMTAUD9rjJfX19cuHABGRkZ6j4HDx6ElZWVeiimvFjZICIiEpsES1/Dw8PRq1cvuLu7Iy8vD7GxsTh69Cj279+P69evIzY2Fr1794a9vT3Onz+PSZMmoWPHjmjWrBkAoEePHvD09MSIESMQFRWFtLQ0zJgxAyEhIRVKcAAmG0RERNVSRkYGRo4cidTUVFhbW6NZs2bYv38/unfvjps3b+LQoUNYunQp8vPzUbNmTQwaNAgzZsxQH29gYIDdu3cjODgYvr6+MDc3R1BQkMZzOcpLJgiCoM2b0wXpucVSh0D/sDYzkjoE+peCohKpQ6B/yPX88dW6xNpU/BkFDqO2auU8mRuHauU8lY2VDSIiIpHp+7tRmGwQERGJTN+TDa5GISIiIlGxskFERCQ2/S5sMNkgIiISG4dRiIiIiETEygYREZHI9L2ywWSDiIhIZPqebHAYhYiIiETFygYREZHI9L2ywWSDiIhIbPqda3AYhYiIiMTFygYREZHIOIxCREREomKyQURERKLS92SDczaIiIhIVKxsEBERiU2/CxtMNoiIiMTGYRQiIiIiEbGyQUREJDJ9r2ww2SAiIhKZvicbHEYhIiIiUbGyQUREJDJ9r2ww2SAiIhKbfucaHEYhIiIicVXLyoa1mZHUIdA/VCpB6hDoXxSG/P1CV5Tw74Ze4TAKERERiYrJBhEREYlKz3MNztkgIiIicbGyQUREJDIOoxAREZGo9DzX4DAKERERiYuVDSIiIpHp+zAKKxtEREQik8m0s1XEmjVr0KxZM1hZWcHKygq+vr7Yu3even9hYSFCQkJgb28PCwsLDBo0COnp6RrnSElJQUBAAMzMzODk5ISpU6fi4cOHFb5/JhtERETVUI0aNbBgwQIkJCTgzJkz6Nq1K/r374+kpCQAwKRJk7Br1y58++23OHbsGG7fvo2BAweqjy8pKUFAQACKiopw4sQJxMTEYOPGjZg1a1aFY5EJglDtHmNXWPGki0TCJ4gSlY1PENUdlibi/97tOf2AVs5zaX6PFzrezs4OCxcuxODBg+Ho6IjY2FgMHjwYAHDlyhU0btwYcXFxaNOmDfbu3Ys+ffrg9u3bcHZ2BgBER0dj2rRpuHPnDoyNjct9XVY2iIiIRCbFMMq/lZSUYOvWrcjPz4evry8SEhJQXFwMPz8/dZ9GjRrB3d0dcXFxAIC4uDh4eXmpEw0A8Pf3R25urro6Ul6cIEpERFRFKJVKKJVKjTaFQgGFQlFm/wsXLsDX1xeFhYWwsLDAjh074OnpicTERBgbG8PGxkajv7OzM9LS0gAAaWlpGonG4/2P91UEKxtEREQik8lkWtkiIyNhbW2tsUVGRj7xuh4eHkhMTMSpU6cQHByMoKAgXLp0qRLv/BFWNoiIiESmrZWv4eHhCAsL02h7UlUDAIyNjVG/fn0AgLe3N+Lj47Fs2TK89tprKCoqQnZ2tkZ1Iz09HS4uLgAAFxcXnD59WuN8j1erPO5TXqxsEBERiUxblQ2FQqFeyvp4e1qy8V8qlQpKpRLe3t4wMjLC4cOH1fuSk5ORkpICX19fAICvry8uXLiAjIwMdZ+DBw/CysoKnp6eFbp/VjaIiIiqofDwcPTq1Qvu7u7Iy8tDbGwsjh49iv3798Pa2hpjxoxBWFgY7OzsYGVlhfHjx8PX1xdt2rQBAPTo0QOenp4YMWIEoqKikJaWhhkzZiAkJKRCCQ7AZIOIiEh0UjxBNCMjAyNHjkRqaiqsra3RrFkz7N+/H927dwcALFmyBHK5HIMGDYJSqYS/vz9Wr16tPt7AwAC7d+9GcHAwfH19YW5ujqCgIMydO7fCsfA5GyQqPmeDqGx8zobuqIznbLSIOPzsTuWQGNFNK+epbJyzQURERKLiMAoREZHI9P1FbEw2iIiIRKbnuQaHUYiIiEhcrGwQERGJjMMoREREJCo9zzU4jEJERETiYmWDiIhIZBxGISIiIlHpea7BZIOIiEhs+l7Z4JwNIiIiEhUrG0RERCLT88IGkw0iIiKxcRiFiIiISESsbBAREYlMzwsbTDaIiIjExmEUIiIiIhGxskFERCQyPS9sMNkgIiISG4dRiIiIiETEygYREZHIWNkgnbM1djN6de+K1i29MHzoq7hw/rzUIemtjPR0fPjBVHRu74M2rZrj1QF9kZR0Qeqw9E706hVo6dVIYxvQt5fUYemFswnxmDQ+GD39OqJV88Y4euSQet/D4mIsX7IIrw3qh/Y+L6OnX0fM+nAa7mRkSBixbpLJtLNVVaxs6Jh9e3/EoqhIzJg9B15ezbF5UwyC3x6D73fvg729vdTh6ZXcnByMGvk6Wrf2wco1n8PW1g4pKX/Cyspa6tD0Ur36DRD9+Xr1ZwMD/vNVGQoKCtDAwwP9Agdiath7GvsKCwtx5colvDUuGA08GiEvNweLPolE2IR3sWnLNoki1k36Xtng31YdsylmAwYOHoLAAYMAADNmz8Hx40exc/t3GDN2nMTR6ZcN67+Ai4sr5nwUqW57qUYNCSPSbwYGBnBwcJQ6DL3Trn1HtGvfscx9FpaWWL12vUbb++EzEDR8CNJSb8PF1a0yQqQqgMMoOqS4qAiXLyWhjW9bdZtcLkebNm1x/rdzEkamn44dPQJPz6aYGjYBXTu1xdBXB2D7tm+kDktvpaT8he5dO6BPTz9MnzYFqam3pQ6JynD/fh5kMhksLK2kDkWn6Pswik4nGzdv3sSbb74pdRiV5l72PZSUlJQaLrG3t0dmZqZEUemvv2/dxLffbIF7rVpYHf0FXh0yFFELPsYP3++QOjS909SrOebOi8SqNV9g+szZ+PvvW3gz6A3k59+XOjT6F6VSiRVLF8O/VwAsLCykDkenyGQyrWxVlU4Po9y9excxMTFYv379E/solUoolUqNNsFAAYVCIXZ4VM2pVAI8mzTB+AlhAIBGjT1x7dpVbPtmK/r1HyBxdPqlfYf/l/EbenjAy6s5evt3xYH9+zBg4GAJI6PHHhYX44OpkyAIAj74cLbU4ZCOkTTZ+OGHH566/48//njmOSIjIzFnzhyNtg9nzsaMWREvEpokbG1sYWBggKysLI32rKwsODg4SBSV/nJwdETdevU12urUrYfDhw5IFBE9ZmllBfdatXEz5S+pQyH8P9FIS72NNZ9vYFWjDFW4KKEVkiYbgYGBkMlkEAThiX2eVTYKDw9HWFiYRptgUDWrGkbGxmjs2QSnTsahazc/AIBKpcKpU3EY+vobEkenf1q0aIm//ryh0Zby559w5aQ3yT14kI9bN28ioG8/qUPRe48TjZSUv7D2ixjY2NhKHZJOkut5tiHpnA1XV1ds374dKpWqzO3s2bPPPIdCoYCVlZXGVpWHUEYEjcb2bd/gh5078Mf16/hobgQKCgoQOGCg1KHpnTdGjsKF879h3efRSEn5C3v37MJ3332D14YOlzo0vfPpok9wJv40bv99C4mJZxE2YTzkBnL07NVH6tCqvQcP8pF85TKSr1wGAPz99y0kX7mMtNTbeFhcjPenTMTlS0n4KHIhSlQlyMy8g8zMOyguLpI4ctIlklY2vL29kZCQgP79+5e5/1lVj+qoZ6/euHf3LlavXI7MzDvwaNQYq9d+AXsOo1S6Jk29sHjpCqxY+ik+i16Nl16qganvh6N3n75Sh6Z30tPTET5tMnKys2Fra4cWL3vjy81fw87OTurQqr1LSUl4560g9ecliz4BAPTpF4hx74Ti+NEjAIBhQzTnMUV/EYNWrV+pvEB1nJ4XNiATJPxp/vPPPyM/Px89e/Ysc39+fj7OnDmDTp06Vei8hQ+1ER1pg0qlX8kiUXmV8O+GzrA0Eb/I77/6lFbOs/9dH62cp7JJWtno0KHDU/ebm5tXONEgIiLSNXI9r2zo9HM2iIiI6PlERkaidevWsLS0hJOTEwIDA5GcnKzRp3PnzqWe5fHOO+9o9ElJSUFAQADMzMzg5OSEqVOn4uHDig0h6PRzNoiIiKoDKR7IdezYMYSEhKB169Z4+PAhpk+fjh49euDSpUswNzdX9xs7dizmzp2r/mxmZqb+c0lJCQICAuDi4oITJ04gNTUVI0eOhJGREebPn1/uWJhsEBERiUyKCaL79u3T+Lxx40Y4OTkhISEBHTv+/0F5ZmZmcHFxKfMcBw4cwKVLl3Do0CE4OzujRYsWmDdvHqZNm4aIiAgYGxuXKxYOoxAREemBnJwcACi1imvz5s1wcHBA06ZNER4ejgcPHqj3xcXFwcvLC87Ozuo2f39/5ObmIikpqdzXZmWDiIhIZDJop7RR1is6FIpnv6JDpVJh4sSJaNeuHZo2bapuHzZsGGrVqgU3NzecP38e06ZNQ3JyMrZv3w4ASEtL00g0AKg/p6WllTtuJhtEREQi09ZqlLJe0TF79mxEREQ89biQkBBcvHgRv/zyi0b7uHHj1H/28vKCq6srunXrhuvXr6NevXraCRocRiEiIqoywsPDkZOTo7GFh4c/9ZjQ0FDs3r0bP/30E2rUqPHUvj4+j57jce3aNQCAi4sL0tPTNfo8/vykeR5lYbJBREQkMm29Yr4ir+gQBAGhoaHYsWMHjhw5gjp16jwzzsTERACPXicCAL6+vrhw4QIyMjLUfQ4ePAgrKyt4enqW+/45jEJERCQyKVajhISEIDY2Ft9//z0sLS3Vcyysra1hamqK69evIzY2Fr1794a9vT3Onz+PSZMmoWPHjmjWrBkAoEePHvD09MSIESMQFRWFtLQ0zJgxAyEhIRV6D5mkjysXCx9Xrjv4uHKisvFx5bqjMh5XHvjFGa2cZ+dbrcrd90nP9tiwYQNGjRqFmzdv4o033sDFixeRn5+PmjVrYsCAAZgxYwasrKzU/f/66y8EBwfj6NGjMDc3R1BQEBYsWABDw/LXK5hskKiYbBCVjcmG7qiMZGPgugStnGf7GG+tnKeycRiFiIhIZPr+1lcmG0RERCKT4nHluoSrUYiIiEhUrGwQERGJTM8LG0w2iIiIxCbX82yDwyhEREQkKlY2iIiIRKbfdQ0mG0RERKLjahQiIiIiEbGyQUREJDJtvWK+qipXsvHDDz+U+4T9+vV77mCIiIiqI30fRilXshEYGFiuk8lkMpSUlLxIPERERFTNlCvZUKlUYsdBRERUbel5YYNzNoiIiMTGYZTnkJ+fj2PHjiElJQVFRUUa+9577z2tBEZERFRdcIJoBZ07dw69e/fGgwcPkJ+fDzs7O2RmZsLMzAxOTk5MNoiIiEhDhZ+zMWnSJPTt2xf37t2DqakpTp48ib/++gve3t5YtGiRGDESERFVaTKZTCtbVVXhZCMxMRGTJ0+GXC6HgYEBlEolatasiaioKEyfPl2MGImIiKo0mZa2qqrCyYaRkRHk8keHOTk5ISUlBQBgbW2Nmzdvajc6IiIiqvIqPGejZcuWiI+PR4MGDdCpUyfMmjULmZmZ2LRpE5o2bSpGjERERFUaXzFfQfPnz4erqysA4OOPP4atrS2Cg4Nx584dfPbZZ1oPkIiIqKqTybSzVVUVrmy0atVK/WcnJyfs27dPqwERERFR9cKHehEREYmsKq8k0YYKJxt16tR56hftjz/+eKGAiIiIqhs9zzUqnmxMnDhR43NxcTHOnTuHffv2YerUqdqKi4iIiKqJCicbEyZMKLN91apVOHPmzAsHREREVN1wNYqW9OrVC9999522TkdERFRtcDWKlmzbtg12dnbaOh0REVG1wQmiFdSyZUuNL5ogCEhLS8OdO3ewevVqrQZHREREVV+Fk43+/ftrJBtyuRyOjo7o3LkzGjVqpNXgnlfRQ5XUIdA/jA21NlJHWpB8O0/qEOgfFiZ88oCusDQxFf0a+v4vYYX/b4+IiBAhDCIioupL34dRKpxsGRgYICMjo1R7VlYWDAwMtBIUERERVR8VrmwIglBmu1KphLGx8QsHREREVN3I9buwUf5kY/ny5QAelYK++OILWFhYqPeVlJTg+PHjOjNng4iISJdIkWxERkZi+/btuHLlCkxNTdG2bVt88skn8PDwUPcpLCzE5MmTsXXrViiVSvj7+2P16tVwdnZW90lJSUFwcDB++uknWFhYICgoCJGRkTA0LH+9otw9lyxZAuBRZSM6OlpjyMTY2Bi1a9dGdHR0uS9MRERE4jl27BhCQkLQunVrPHz4ENOnT0ePHj1w6dIlmJubAwAmTZqEPXv24Ntvv4W1tTVCQ0MxcOBA/PrrrwAeFRMCAgLg4uKCEydOIDU1FSNHjoSRkRHmz59f7lhkwpPGRZ6gS5cu2L59O2xtbStyWKXKLeRqFF3B1Si6hatRdAdXo+iOek7ir0aZvCtZK+dZ3Nfj2Z2e4M6dO3BycsKxY8fQsWNH5OTkwNHREbGxsRg8eDAA4MqVK2jcuDHi4uLQpk0b7N27F3369MHt27fV1Y7o6GhMmzYNd+7cKff0iQr/JPjpp590OtEgIiLSNXKZdrYXkZOTAwDqB3AmJCSguLgYfn5+6j6NGjWCu7s74uLiAABxcXHw8vLSGFbx9/dHbm4ukpKSyn//FQ120KBB+OSTT0q1R0VF4dVXX63o6YiIiKiclEolcnNzNTalUvnM41QqFSZOnIh27dqhadOmAIC0tDQYGxvDxsZGo6+zszPS0tLUff6daDze/3hfeVU42Th+/Dh69+5dqr1Xr144fvx4RU9HRERU7Wnr3SiRkZGwtrbW2CIjI595/ZCQEFy8eBFbt26thLstrcKDhvfv3y9zjMbIyAi5ublaCYqIiKg60dZbX8PDwxEWFqbRplAonnpMaGgodu/ejePHj6NGjRrqdhcXFxQVFSE7O1ujupGeng4XFxd1n9OnT2ucLz09Xb2vvCpc2fDy8sLXX39dqn3r1q3w9PSs6OmIiIiqPbmWNoVCASsrK43tScmGIAgIDQ3Fjh07cOTIEdSpU0djv7e3N4yMjHD48GF1W3JyMlJSUuDr6wsA8PX1xYULFzQe5nnw4EFYWVlV6Gd+hSsbM2fOxMCBA3H9+nV07doVAHD48GHExsZi27ZtFT0dERERiSAkJASxsbH4/vvvYWlpqZ5jYW1tDVNTU1hbW2PMmDEICwuDnZ0drKysMH78ePj6+qJNmzYAgB49esDT0xMjRoxAVFQU0tLSMGPGDISEhDyzovJvFU42+vbti507d2L+/PnYtm0bTE1N0bx5cxw5coSvmCciIiqDFK9GWbNmDQCgc+fOGu0bNmzAqFGjADx6hpZcLsegQYM0Hur1mIGBAXbv3o3g4GD4+vrC3NwcQUFBmDt3boViqfBzNv4rNzcXW7Zswbp165CQkICSkpIXOZ1W8DkbuoPP2dAtfM6G7uBzNnRHZTxnY+a+q1o5z7yeDbRynsr23D8Jjh8/jqCgILi5uWHx4sXo2rUrTp48qc3YiIiIqBqoUGqdlpaGjRs3Yt26dcjNzcWQIUOgVCqxc+dOTg4lIiJ6Aj1/w3z5Kxt9+/aFh4cHzp8/j6VLl+L27dtYsWKFmLERERFVC7rwBFEplbuysXfvXrz33nsIDg5GgwZVc8yIiIiIKl+5Kxu//PIL8vLy4O3tDR8fH6xcuRKZmZlixkZERFQtyGUyrWxVVbmTjTZt2uDzzz9Hamoq3n77bWzduhVubm5QqVQ4ePAg8vI4y52IiKgs2npceVVV4dUo5ubmePPNN/HLL7/gwoULmDx5MhYsWAAnJyf069dPjBiJiIioCnuhhyB4eHggKioKt27dwpYtW7QVExERUbXCCaJaYGBggMDAQAQGBmrjdERERNWKDFU4U9ACPsKOiIhIZFW5KqENfJY0ERERiYqVDSIiIpHpe2WDyQYREZHIZFV53aoWcBiFiIiIRMXKBhERkcg4jEJERESi0vNRFA6jEBERkbhY2SAiIhJZVX6JmjYw2SAiIhKZvs/Z4DAKERERiYqVDSIiIpHp+SgKkw0iIiKxyfkiNiIiIhKTvlc2OGeDiIiIRMXKBhERkci4GoUkdTYhHpPGB6OXX0e0bt4YR48cemLfyHkRaN28MWK/iqnECGlr7Gb06t4VrVt6YfjQV3Hh/HmpQ6rWVCUl2LpxDUJG9MPwgHYYP7I/tn31BQRBKLP/Z0vnY0j3VtizPbaSI9UPX61fg94dWmhs44YHqven/n0T86ZPwtA+XTDIvx3mz5qKe3ezpAtYR8llMq1sVRWTDYkVFBSgoYcH3g+f+dR+Px0+iAsXfoOjo1MlRUYAsG/vj1gUFYm33w3B1m93wMOjEYLfHoOsLP5jKpadX8fg4K5tGBP6Ppas+xbD3xqPH775Ent3fl2q7+lffsLVyxdha+8oQaT6o1adevhq5yH1tnDVBgBAYUEBPgwLhkwmQ+Syz7Bo9UY8LC7GnA/eg0qlkjhq0iVMNiTWrn1HBIdORJdu3Z/YJyM9HYsWfIx586NgaMSRr8q0KWYDBg4egsABg1Cvfn3MmD0HJiYm2Ln9O6lDq7Z+v3Qerdp2wss+7eHk4oY2Hf3QzNsH15KTNPrdzczA+lUL8V74PBga8u+FmAwMDGBn76DerG1sAQCXLpxDRtpthE2fizr1GqBOvQaY/OE8XL1yCb+dPS1x1LpFJtPOVlUx2dBxKpUKsz+chjdGvYl69RtIHY5eKS4qwuVLSWjj21bdJpfL0aZNW5z/7ZyEkVVvDT2b4eK5eNy+9RcA4M/rvyP54m9o2fr/3weVSoUVn8xCv1dHoGbtelKFqjf+vpWCNwK7480hAYiaG46M9FQAQHFxMSCTwcjIWN3X2FgBmVyOpPP8O/Jv+j6Mwl8HdFzMhi9gYGCAocNGSB2K3rmXfQ8lJSWwt7fXaLe3t8eNG39IFFX1Fzh0FAoe5GPSm4Mhl8uhUqkwdPS76NCtl7rP91/HwEBugF4DhkoYqX7w8PRC2PS5qFGzNu5mZSJ2YzSmhryJNV9uQyNPL5iYmGJ99FIEjRsPCMCG6GVQlZTgXlam1KGTDpE82SgoKEBCQgLs7Ozg6empsa+wsBDffPMNRo4c+cTjlUollEqlZptgBIVCIUq8lenypSRs3bwJX239DrIqnNESVUTcsYP45cg+vBf+EWrWroc/ryVj45pPYWvviM49+uCP3y/jxx1b8cnqr/j3ohK0btNe/ec69RvCw7MpRr3aGz8fOQD/PgMwfW4UVi6ejx+2bYFMLkenbj1Rv2FjyGQsnP+bvv+vKmmy8fvvv6NHjx5ISUmBTCZD+/btsXXrVri6ugIAcnJyMHr06KcmG5GRkZgzZ45G2wcfzkL4jNmixl4Zzp09g3t3s9C3Z1d1W0lJCZYtjsLWzV/ih72HJYyu+rO1sYWBgUGpyaBZWVlwcHCQKKrq76vPl6P/a0Fo18UfAOBepz7uZKRi59YN6NyjDy5fPIfc7Lt4d3gf9TEqVQm+XLsUP27fglVf7ZIqdL1gYWmFl2q64/atmwCAl19pi/Vf70ZO9j0YGBjAwtIKw/t3g4vbSxJHqlv0PfWSNNmYNm0amjZtijNnziA7OxsTJ05Eu3btcPToUbi7u5frHOHh4QgLC9NoUwpGYoRb6Xr36YdXfHw12t4LHoteffqhb+BAiaLSH0bGxmjs2QSnTsahazc/AI/mCpw6FYehr78hcXTVl7KwEHK55j/NcrkBBNWjpa8d/XrDq+UrGvs/Dh+Pjn690cW/b6XFqa8KHjxA6t+30NVfM+F+PGk0MeE0su/dRZv2nSWIjnSVpMnGiRMncOjQITg4OMDBwQG7du3Cu+++iw4dOuCnn36Cubn5M8+hUChKDZnkFladJVcPHuTjZkqK+vPtv28h+cplWFtbw8XVDTb//AV+zNDIEPYODqhdu05lh6qXRgSNxszp09CkSVM09WqGrzbFoKCgAIEDmOyJxbtNB2yPXQ8HJxfUqFUXf15Lxu7vNqOLfz8AgKWVDSytbDSOMTQ0hI2dPdxq1q78gKu5L1Z9Cp+2HeHk4oqszDv4av0ayOUG6NytJwDgwJ6dcK9dF9Y2trh88TzWLo9C4JA3UMO9trSB6xiphvyOHz+OhQsXIiEhAampqdixYwcCAwPV+0eNGoWYGM1nN/n7+2Pfvn3qz3fv3sX48eOxa9cuyOVyDBo0CMuWLYOFhUW545A02SgoKNBYsiaTybBmzRqEhoaiU6dOiI2t/g/puZyUhHfeClJ/XrLoEwBAQL9ARMyLlCos+kfPXr1x7+5drF65HJmZd+DRqDFWr/0C9hxGEc2boVPx9cZofLF8AXKy78HO3gHdAwZi8BtjpQ5NL2VmpOOTOeHIzc2GtY0tmni1xJK1X8La1g4A8PfNvxDz2Qrk5ebAycUNr414CwNeY+Xvv6SaspGfn4/mzZvjzTffxMCBZf+S1LNnT2zYsEH9+b+/wA8fPhypqak4ePAgiouLMXr0aIwbN65CP6NlwpMey1cJXnnlFYwfPx4jRpReaREaGorNmzcjNzcXJSUlFTpvVapsVHfGhvo+Uqlbkm/nSR0C/cPCRPL5+fSPek6mol/jq4RbWjnPG941nvtYmUxWZmUjOzsbO3fuLPOYy5cvw9PTE/Hx8WjVqhUAYN++fejduzdu3boFNze3cl1b0p8EAwYMwJYtW8rct3LlSrz++utPfEQxERERvbijR4/CyckJHh4eCA4O1pgUHxcXBxsbG3WiAQB+fn6Qy+U4depUua8habIRHh6OH3/88Yn7V69ezUfeEhFRlSfT0qZUKpGbm6ux/ffxDxXRs2dPfPnllzh8+DA++eQTHDt2DL169VKPKKSlpcHJSfM1GYaGhrCzs0NaWlq5r8MaNxERkci09bjyyMhIWFtba2yRkc8/v2/o0KHo168fvLy8EBgYiN27dyM+Ph5Hjx7V3s2DyQYREVGVER4ejpycHI0tPDxca+evW7cuHBwccO3aNQCAi4sLMjIyNPo8fPgQd+/ehYuLS7nPyxlKREREItPW0teyHvegTbdu3UJWVpb64Zq+vr7Izs5GQkICvL29AQBHjhyBSqWCj49Puc/LZIOIiEhkUg0j3L9/X12lAIAbN24gMTERdnZ2sLOzw5w5czBo0CC4uLjg+vXreP/991G/fn34+z96gm/jxo3Rs2dPjB07FtHR0SguLkZoaCiGDh1a7pUoAIdRiIiIqq0zZ86gZcuWaNmyJQAgLCwMLVu2xKxZs2BgYIDz58+jX79+aNiwIcaMGQNvb2/8/PPPGtWTzZs3o1GjRujWrRt69+6N9u3b47PPPqtQHJI+Z0MsfM6G7uBzNnQLn7OhO/icDd1RGc/Z+CbxtlbOM6RF+asJuoT/txMREYlMz1/6ymEUIiIiEhcrG0RERCKT6kVsuoLJBhERkcj0fRiByQYREZHI9L2yoe/JFhEREYmMlQ0iIiKR6Xddg8kGERGR6PR8FIXDKERERCQuVjaIiIhEJtfzgRQmG0RERCLjMAoRERGRiFjZICIiEpmMwyhEREQkJg6jEBEREYmIlQ0iIiKRcTUKERERiUrfh1GYbBAREYlM35MNztkgIiIiUbGyQUREJDIufSUiIiJRyfU71+AwChEREYmLlQ0iIiKRcRiFiIiIRMXVKEREREQiYmWDiIhIZBxGISIiIlFxNQoRERGRiFjZICIiEhmHUYiIiEhU+r4ahckGERGRyPQ81+CcDSIiIhIXKxtEREQik+v5OEq1TDb0+1uqW0pUgtQh0L+YGhtIHQL9o6n/VKlDoH8UnFsp+jWk+rl0/PhxLFy4EAkJCUhNTcWOHTsQGBio3i8IAmbPno3PP/8c2dnZaNeuHdasWYMGDRqo+9y9exfjx4/Hrl27IJfLMWjQICxbtgwWFhbljoPDKERERNVUfn4+mjdvjlWrVpW5PyoqCsuXL0d0dDROnToFc3Nz+Pv7o7CwUN1n+PDhSEpKwsGDB7F7924cP34c48aNq1AcMkEQqt2vnnmFKqlDoH/I9f1JNjrm77sFUodA/2je632pQ6B/VEZl4+T1bK2cp009m+c+ViaTaVQ2BEGAm5sbJk+ejClTpgAAcnJy4OzsjI0bN2Lo0KG4fPkyPD09ER8fj1atWgEA9u3bh969e+PWrVtwc3Mr17VZ2SAiIhKZTEv/adONGzeQlpYGPz8/dZu1tTV8fHwQFxcHAIiLi4ONjY060QAAPz8/yOVynDp1qtzXqpZzNoiIiKojpVIJpVKp0aZQKKBQKCp8rrS0NACAs7OzRruzs7N6X1paGpycnDT2Gxoaws7OTt2nPFjZICIiEplMpp0tMjIS1tbWGltkZKTUt/dMrGwQERGJTFsDIOHh4QgLC9Noe56qBgC4uLgAANLT0+Hq6qpuT09PR4sWLdR9MjIyNI57+PAh7t69qz6+PFjZICIiqiIUCgWsrKw0tudNNurUqQMXFxccPnxY3Zabm4tTp07B19cXAODr64vs7GwkJCSo+xw5cgQqlQo+Pj7lvhYrG0RERGKTaGHe/fv3ce3aNfXnGzduIDExEXZ2dnB3d8fEiRPx0UcfoUGDBqhTpw5mzpwJNzc39YqVxo0bo2fPnhg7diyio6NRXFyM0NBQDB06tNwrUQAmG0RERKKT6q2vZ86cQZcuXdSfHw/BBAUFYePGjXj//feRn5+PcePGITs7G+3bt8e+fftgYmKiPmbz5s0IDQ1Ft27d1A/1Wr58eYXi4HM2SFR8zoZu4XM2dAefs6E7KuM5Gwl/5mrlPN61rbRynsrGORtEREQkKg6jEBERiUzfa7xMNoiIiMSm59kGh1GIiIhIVKxsEBERiUyq1Si6gskGERGRyGT6nWtwGIWIiIjExcoGERGRyPS8sMFkg4iISHR6nm1wGIWIiIhExcoGERGRyLgahYiIiESl76tRmGwQERGJTM9zDc7ZICIiInGxskFERCQ2PS9tMNkgIiISmb5PEOUwChEREYmKlQ0iIiKRcTUKERERiUrPcw0OoxAREZG4WNkgIiISm56XNphsEBERiYyrUYiIiIhExMoGERGRyLgahYiIiESl57kGkw0iIiLR6Xm2wTkbREREJCpWNoiIiESm76tRmGwQERGJTN8niHIYhYiIiETFyobEzibEY9PG9bh8OQmZd+5g0ZIV6NzVDwDwsLgYq1cuw6+/HMfft27BwtICr/j4YvyEyXB0cpI48uovwL8rUm/fLtX+6mvDED5jlgQR6Y+sOxnYuHYZEk79CmVhIVxfqokJH0SgQaMmAIAlkbNwZN8ujWNefqUt5ixcJUW41daU0d0x773+WLn5J0xd9B1srcwwMzgA3do0Qk0XW2Teu49dR89jzurdyL1fqD6upostlk1/DZ1aNcT9AiU27zqFmSt+QEmJSsK7kZaeFzaYbEitoKAADTw80C9wIKaGvaexr7CwEFeuXMJb44LRwKMR8nJzsOiTSIRNeBebtmyTKGL98dWWbShRlag/X796FcHj3kR3f38Jo6r+7ufl4v3QUfBq0RoRUSthZWOL27dSYGFppdHv5VfaYuIHc9SfjYyNKzvUas3b0x1jBrXD+d9vqdtcHa3h6miN8CU7cPmPNLi72mHFh0Ph6miNYVPXAQDkchm2Lw9GelYuuoxaDBdHa3wxbwSKH5Zg9spdT7pc9afn2QaTDYm1a98R7dp3LHOfhaUlVq9dr9H2fvgMBA0fgrTU23BxdauMEPWWrZ2dxucN6z5HjZru8G71ikQR6YdtsRvg4OiCieH/TyRcXF8q1c/I2Bi29g6VGZreMDc1xob5o/DuvC344K2e6vZL11Px+pQv1J9v3MpExMpdWP/xSBgYyFFSooKfb2M0ruuCgHdWIONuHs7//jfmrt6Dj97rj4+if0Txw5KyLknVHOdsVDH37+dBJpOV+i2PxFVcXIS9u39A/wEDIdP3mV4iO/3rMdRv5IkFs6bijf5dMWHMUOzftb1Uv4uJZ/BG/654541ArF78MXJzsis/2Gpqafhr2PfzRfx0KvmZfa0sTZCbX6geIvFpVgcXr91Gxt08dZ+DJy7D2tIUnvVcRYtZ18m09F9FREREQCaTaWyNGjVS7y8sLERISAjs7e1hYWGBQYMGIT09Xdu3DkAHKhuXL1/GyZMn4evri0aNGuHKlStYtmwZlEol3njjDXTt2lXqEHWGUqnEiqWL4d8rABYWFlKHo1d+OnwYeXl56Nd/gNShVHtpqX9j7/ffIvDVN/DqG2Nw9UoSPlseBUMjQ3Tr2Q8A4P1KW7Tt2BXOLi8h9fYtbPp8BSLeD8XC1TEwMDCQ+A6qtlf9vdGiUU20fyPqmX3tbcwRPrYX1n93Qt3mbG+FjKw8jX4Zd3Mf7XOwAp6dv1RLUv2O0qRJExw6dEj92dDw/z/2J02ahD179uDbb7+FtbU1QkNDMXDgQPz6669aj0PSZGPfvn3o378/LCws8ODBA+zYsQMjR45E8+bNoVKp0KNHDxw4cOCpCYdSqYRSqdRoKxKMoFAoxA6/Uj0sLsYHUydBEAR88OFsqcPROzt3bEPb9h3g6OQsdSjVnqBSob6HJ0aOGw8AqNewEf66cQ17v9+mTjY6dvt/ab92vQaoU68Bxr7eFxcTz6C5t48kcVcHNZxtsHDqIPQJXgll0cOn9rU0N8GO5cG4/EcqPlq7p5IipIoyNDSEi4tLqfacnBysW7cOsbGx6p+xGzZsQOPGjXHy5Em0adNGq3FIOowyd+5cTJ06FVlZWdiwYQOGDRuGsWPH4uDBgzh8+DCmTp2KBQsWPPUckZGRsLa21tgWL3z6MVXN40QjLfU2Vq1dx6pGJbt9+2+cPhmHAQNflToUvWBr74CatetqtNWsVQd3MtKeeIyLWw1YWdvg9t83xQ6vWmvZ2B3O9laIi52GvPhlyItfho6tGuDd1zshL34Z5PJHv55bmCnww6p3kfegEK+FfY6HD/+/yiQ9KxdO9pYa53WyezTsm56ZW3k3o2NkWtoq6urVq3Bzc0PdunUxfPhwpKSkAAASEhJQXFwMPz8/dd9GjRrB3d0dcXFxz3eTTyFpZSMpKQlffvklAGDIkCEYMWIEBg8erN4/fPhwbNiw4annCA8PR1hYmEZbkWCk/WAl8jjRSEn5C2u/iIGNja3UIemdH3Zuh52dPdp37CR1KHqhcdMW+DvlL422v2+lwMn5yeP9mRnpyMvNgR0njL6Qn04nw3vwxxptn815A8k30rF440GoVAIszU2wa3UIlEUPMXji2lIVkFPnb2DaGH842lrgzr37AIBubRohJ68Al/94csJY7WlpGKWsar5CoSizmu/j44ONGzfCw8MDqampmDNnDjp06ICLFy8iLS0NxsbGsLGx0TjG2dkZaWna/z5JPmfj8WQ7uVwOExMTWFtbq/dZWloiJyfnqceX9UXOK6w6a7kfPMjHzX8yTQD4++9bSL5yGdbW1nBwcMT7UyYi+fIlLFmxBiWqEmRm3gEAWFtbw8iIS/3EplKp8MPOHejTL1BjrJPE0//VN/B+yCh8s2kd2nfpjt8vJ2H/ru8QOmUmAKDgwQNsiVmLth27wdbOAWm3b2JD9DK4vlQTL7duK3H0Vdv9B0pcup6q0ZZfUIS7Ofm4dD0VluYm2L06BKYmxhj9YQyszE1gZW4CALhz7z5UKgGH4i7j8h9pWPdRED5cthPO9laYHdIHa785jqLipw/NVGfaelx5ZGQk5syZo9E2e/ZsRERElOrbq1cv9Z+bNWsGHx8f1KpVC9988w1MTU21Ek95SfqvZ+3atXH16lXUq1cPABAXFwd3d3f1/pSUFLi6Vu/Zy5eSkvDOW0Hqz0sWfQIA6NMvEOPeCcXxo0cAAMOGaE5MjP4iBq1acwmm2E6dPIG01NvoP2Cg1KHojYaNm2D6R4vx5WcrsPXLz+Ds8hLGhk5F5+69AQByAzn+vH4VR/btQv79PNg5OKJlK18MH/Mun7UhshaNauKVZnUAAJd2RWjs8+g9Cympd6FSCRg0YQ2WTR+KoxsnI79Qic27TmPuGs7r0IayqvnlnaNoY2ODhg0b4tq1a+jevTuKioqQnZ2tUd1IT08vc47Hi5IJgiBo/azlFB0djZo1ayIgIKDM/dOnT0dGRga++OKLMvc/SVWqbFR3j8d4STf8fbdA6hDoH817vS91CPSPgnMrRb9Gyl3lszuVg7vd8y9+uH//Ptzd3REREYGgoCA4Ojpiy5YtGDRoEAAgOTkZjRo1QlxcnNYniEqabIiFyYbuYLKhW5hs6A4mG7qjMpKNm1pKNmpWINmYMmUK+vbti1q1auH27duYPXs2EhMTcenSJTg6OiI4OBg//vgjNm7cCCsrK4wf/2gF2IkTJ55x5orjIDQREVE1dOvWLbz++uvIysqCo6Mj2rdvj5MnT8LR0REAsGTJEsjlcgwaNAhKpRL+/v5YvXq1KLGwskGiYmVDt7CyoTtY2dAdlVHZuHVPO5WNGrZV8xlSrGwQERGJTr9/8eK7UYiIiEhUrGwQERGJTN/f38hkg4iISGR6nmtwGIWIiIjExcoGERGRyDiMQkRERKLS1rtRqiomG0RERGLT71yDczaIiIhIXKxsEBERiUzPCxtMNoiIiMSm7xNEOYxCREREomJlg4iISGRcjUJERETi0u9cg8MoREREJC5WNoiIiESm54UNJhtERERi42oUIiIiIhGxskFERCQyrkYhIiIiUXEYhYiIiEhETDaIiIhIVBxGISIiEpm+D6Mw2SAiIhKZvk8Q5TAKERERiYqVDSIiIpFxGIWIiIhEpee5BodRiIiISFysbBAREYlNz0sbTDaIiIhExtUoRERERCJiZYOIiEhkXI1CREREotLzXIPDKERERKKTaWl7DqtWrULt2rVhYmICHx8fnD59+oVu5Xkw2SAiIqqmvv76a4SFhWH27Nk4e/YsmjdvDn9/f2RkZFRqHEw2iIiIRCbT0n8V9emnn2Ls2LEYPXo0PD09ER0dDTMzM6xfv16Eu3wyJhtEREQik8m0s1VEUVEREhIS4Ofnp26Ty+Xw8/NDXFyclu/w6ThBlIiIqIpQKpVQKpUabQqFAgqFolTfzMxMlJSUwNnZWaPd2dkZV65cETXO/6qWyYalSdUv2CiVSkRGRiI8PLzM/4mo8lSn70VDFzOpQ3gh1el7UXBupdQhvJDq9L2oDCZa+mkb8VEk5syZo9E2e/ZsREREaOcCIpEJgiBIHQSVlpubC2tra+Tk5MDKykrqcPQavxe6g98L3cHvhTQqUtkoKiqCmZkZtm3bhsDAQHV7UFAQsrOz8f3334sdrlrVLwEQERHpCYVCASsrK43tSZUlY2NjeHt74/Dhw+o2lUqFw4cPw9fXt7JCBlBNh1GIiIgICAsLQ1BQEFq1aoVXXnkFS5cuRX5+PkaPHl2pcTDZICIiqqZee+013LlzB7NmzUJaWhpatGiBffv2lZo0KjYmGzpKoVBg9uzZnHilA/i90B38XugOfi+qjtDQUISGhkoaAyeIEhERkag4QZSIiIhExWSDiIiIRMVkg4iIiETFZIOIiIhExWRDB61atQq1a9eGiYkJfHx8cPr0aalD0kvHjx9H37594ebmBplMhp07d0odkt6KjIxE69atYWlpCScnJwQGBiI5OVnqsPTSmjVr0KxZM/UDpXx9fbF3716pwyIdx2RDx3z99dcICwvD7NmzcfbsWTRv3hz+/v7IyMiQOjS9k5+fj+bNm2PVqlVSh6L3jh07hpCQEJw8eRIHDx5EcXExevTogfz8fKlD0zs1atTAggULkJCQgDNnzqBr167o378/kpKSpA6NdBiXvuoYHx8ftG7dGitXPnpJk0qlQs2aNTF+/Hh88MEHEkenv2QyGXbs2KHxfgGSzp07d+Dk5IRjx46hY8eOUoej9+zs7LBw4UKMGTNG6lBIR7GyoUOKioqQkJAAPz8/dZtcLoefnx/i4uIkjIxIt+Tk5AB49EOOpFNSUoKtW7ciPz+/0t+1QVULnyCqQzIzM1FSUlLqMbLOzs64cuWKRFER6RaVSoWJEyeiXbt2aNq0qdTh6KULFy7A19cXhYWFsLCwwI4dO+Dp6Sl1WKTDmGwQUZUSEhKCixcv4pdffpE6FL3l4eGBxMRE5OTkYNu2bQgKCsKxY8eYcNATMdnQIQ4ODjAwMEB6erpGe3p6OlxcXCSKikh3hIaGYvfu3Th+/Dhq1KghdTh6y9jYGPXr1wcAeHt7Iz4+HsuWLcPatWsljox0Feds6BBjY2N4e3vj8OHD6jaVSoXDhw9zPJT0miAICA0NxY4dO3DkyBHUqVNH6pDoX1QqFZRKpdRhkA5jZUPHhIWFISgoCK1atcIrr7yCpUuXIj8/H6NHj5Y6NL1z//59XLt2Tf35xo0bSExMhJ2dHdzd3SWMTP+EhIQgNjYW33//PSwtLZGWlgYAsLa2hqmpqcTR6Zfw8HD06tUL7u7uyMvLQ2xsLI4ePYr9+/dLHRrpMC591UErV67EwoULkZaWhhYtWmD58uXw8fGROiy9c/ToUXTp0qVUe1BQEDZu3Fj5AekxmUxWZvuGDRswatSoyg1Gz40ZMwaHDx9GamoqrK2t0axZM0ybNg3du3eXOjTSYUw2iIiISFScs0FERESiYrJBREREomKyQURERKJiskFERESiYrJBREREomKyQURERKJiskFERESiYrJBVA2NGjUKgYGB6s+dO3fGxIkTKz2Oo0ePQiaTITs7u9KvTUS6g8kGUSUaNWoUZDIZZDKZ+mVWc+fOxcOHD0W97vbt2zFv3rxy9WWCQETaxnejEFWynj17YsOGDVAqlfjxxx8REhICIyMjhIeHa/QrKiqCsbGxVq5pZ2enlfMQET0PVjaIKplCoYCLiwtq1aqF4OBg+Pn54YcfflAPfXz88cdwc3ODh4cHAODmzZsYMmQIbGxsYGdnh/79++PPP/9Un6+kpARhYWGwsbGBvb093n//ffz3LQT/HUZRKpWYNm0aatasCYVCgfr162PdunX4888/1e+DsbW1hUwmU797RKVSITIyEnXq1IGpqSmaN2+Obdu2aVznxx9/RMOGDWFqaoouXbpoxElE+ovJBpHETE1NUVRUBAA4fPgwkpOTcfDgQezevRvFxcXw9/eHpaUlfv75Z/z666+wsLBAz5491ccsXrwYGzduxPr16/HLL7/g7t272LFjx1OvOXLkSGzZsgXLly/H5cuXsXbtWlhYWKBmzZr47rvvAADJyclITU3FsmXLAACRkZH48ssvER0djaSkJEyaNAlvvPEGjh07BuBRUjRw4ED07dsXiYmJeOutt/DBBx+I9WUjoqpEIKJKExQUJPTv318QBEFQqVTCwYMHBYVCIUyZMkUICgoSnJ2dBaVSqe6/adMmwcPDQ1CpVOo2pVIpmJqaCvv37xcEQRBcXV2FqKgo9f7i4mKhRo0a6usIgiB06tRJmDBhgiAIgpCcnCwAEA4ePFhmjD/99JMAQLh37566rbCwUDAzMxNOnDih0XfMmDHC66+/LgiCIISHhwuenp4a+6dNm1bqXESkfzhng6iS7d69GxYWFiguLoZKpcKwYcMQERGBkJAQeHl5aczT+O2333Dt2jVYWlpqnKOwsBDXr19HTk4OUlNT4ePjo95naGiIVq1alRpKeSwxMREGBgbo1KlTuWO+du0aHjx4UOo14kVFRWjZsiUA4PLlyxpxAICvr2+5r0FE1ReTDaJK1qVLF6xZswbGxsZwc3ODoeH//xqam5tr9L1//z68vb2xefPmUudxdHR8ruubmppW+Jj79+8DAPbs2YOXXnpJY59CoXiuOIhIfzDZIKpk5ubmqF+/frn6vvzyy/j666/h5OQEKyurMvu4urri1KlT6NixIwDg4cOHSEhIwMsvv1xmfy8vL6hUKhw7dgx+fn6l9j+urJSUlKjbPD09oVAokJKS8sSKSOPGjfHDDz9otJ08efLZN0lE1R4niBLpsOHDh8PBwQH9+/fHzz//jBs3buDo0aN47733cOvWLQDAhAkTsGDBAuzcuRNXrlzBu++++9RnZNSuXRtBQUF48803sXPnTvU5v/nmGwBArVq1IJPJsHv3bty5cwf379+HpaUlpkyZgkmTJiEmJgbXr1/H2bNnsWLFCsTExAAA3nnnHVy9ehVTp05FcnIyYmNjsXHjRrG/RERUBTDZINJhZmZmOH78ONzd3TFw4EA0btwYY8aMQWFhobrSMXnyZIwYMQJBQUHw9fWFpaUlBgwY8NTzrlmzBoMHD8a7776LRo0aYezYscjPzwcAvPTSS5gzZw4++OADODs7IzQ0FAAwb948zJw5E5GRkWjcuDF69uyJPXv2oE6dOgAAd3d3fPfdd9i5cyeaN2+O6OhozJ8/X8SvDhFVFTLhSbPIiIiIiLSAlQ0iIiISFZMNIiIiEhWTDSIiIhIVkw0iIiISFZMNIiIiEhWTDSIiIhIVkw0iIiISFZMNIiIiEhWTDSIiIhIVkw0iIiISFZMNIiIiEhWTDSIiIhLV/wC3fYdtJ9SRLAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import StandardScaler, OneHotEncoder\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "from sklearn.metrics import classification_report, confusion_matrix, accuracy_score\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "# Загружаем набор данных\n", + "df = pd.read_csv(\"..//static//csv//ds_salaries.csv\")\n", + "\n", + "# Устанавливаем случайное состояние\n", + "random_state = 42\n", + "\n", + "\n", + "# Предобработка данных\n", + "# Определяем категориальные и числовые столбцы\n", + "categorical_features = ['employment_type', 'job_title', 'employee_residence', 'company_location', 'company_size']\n", + "numeric_features = ['work_year', 'salary_in_usd', 'remote_ratio']\n", + "\n", + "# Создаем пайплайн для обработки данных\n", + "preprocessor = ColumnTransformer(\n", + " transformers=[\n", + " ('num', StandardScaler(), numeric_features),\n", + " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)])\n", + "\n", + "# Определяем целевую переменную и признаки\n", + "X = df.drop('experience_level', axis=1)\n", + "y = df['experience_level']\n", + "\n", + "# Разделяем данные на обучающую и тестовую выборки\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=random_state)\n", + "\n", + "# Создаем и обучаем модель\n", + "model = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('classifier', RandomForestClassifier(random_state=random_state))])\n", + "\n", + "model.fit(X_train, y_train)\n", + "\n", + "# Делаем предсказания на тестовой выборке\n", + "y_pred = model.predict(X_test)\n", + "\n", + "# Оцениваем качество модели\n", + "print(\"Classification Report:\")\n", + "print(classification_report(y_test, y_pred))\n", + "\n", + "print(\"Confusion Matrix:\")\n", + "print(confusion_matrix(y_test, y_pred))\n", + "\n", + "print(f\"Accuracy Score: {accuracy_score(y_test, y_pred)}\")\n", + "\n", + "# Визуализация результатов\n", + "conf_matrix = confusion_matrix(y_test, y_pred)\n", + "sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')\n", + "plt.xlabel('Predicted')\n", + "plt.ylabel('Actual')\n", + "plt.title('Confusion Matrix')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Ориентир**\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAE: 37795.639591701794\n", + "MSE: 2482079980.9527493\n", + "RMSE: 49820.47752634201\n", + "R²: 0.37127352660208646\n", + "Ориентиры для предсказания заработной платы не достигнуты.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\MII\\AIM-PIbd-32-Kaznacheeva-E-K\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import StandardScaler, OneHotEncoder\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n", + "\n", + "df = pd.read_csv(\"..//static//csv//ds_salaries.csv\")\n", + "\n", + "# Предобработка данных\n", + "categorical_features = ['experience_level', 'employment_type', 'job_title', 'employee_residence', 'company_location', 'company_size']\n", + "numeric_features = ['work_year', 'remote_ratio']\n", + "\n", + "preprocessor = ColumnTransformer(\n", + " transformers=[\n", + " ('num', StandardScaler(), numeric_features),\n", + " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)])\n", + "\n", + "X = df.drop('salary_in_usd', axis=1)\n", + "y = df['salary_in_usd']\n", + "\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", + "\n", + "model = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('regressor', LinearRegression())])\n", + "\n", + "model.fit(X_train, y_train)\n", + "\n", + "y_pred = model.predict(X_test)\n", + "\n", + "mae = mean_absolute_error(y_test, y_pred)\n", + "mse = mean_squared_error(y_test, y_pred)\n", + "rmse = mean_squared_error(y_test, y_pred, squared=False)\n", + "r2 = r2_score(y_test, y_pred)\n", + "\n", + "print(f\"MAE: {mae}\")\n", + "print(f\"MSE: {mse}\")\n", + "print(f\"RMSE: {rmse}\")\n", + "print(f\"R²: {r2}\")\n", + "\n", + "# Проверяем, достигнуты ли ориентиры\n", + "if r2 >= 0.75 and mae <= 15000 and rmse <= 20000:\n", + " print(\"Ориентиры для предсказания заработной платы достигнуты!\")\n", + "else:\n", + " print(\"Ориентиры для предсказания заработной платы не достигнуты.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy: 0.7217043941411452\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " EN 0.55 0.48 0.51 67\n", + " EX 0.46 0.26 0.33 23\n", + " MI 0.48 0.54 0.51 157\n", + " SE 0.83 0.83 0.83 504\n", + "\n", + " accuracy 0.72 751\n", + " macro avg 0.58 0.53 0.55 751\n", + "weighted avg 0.72 0.72 0.72 751\n", + "\n", + "Confusion Matrix:\n", + "[[ 32 0 20 15]\n", + " [ 0 6 5 12]\n", + " [ 14 0 84 59]\n", + " [ 12 7 65 420]]\n", + "Ориентиры для классификации уровня опыта не достигнуты.\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import StandardScaler, OneHotEncoder\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "from sklearn.metrics import accuracy_score, classification_report, confusion_matrix\n", + "\n", + "# Загружаем набор данных\n", + "df = pd.read_csv(\"..//static//csv//ds_salaries.csv\")\n", + "\n", + "# Предобработка данных\n", + "categorical_features = ['employment_type', 'job_title', 'employee_residence', 'company_location', 'company_size']\n", + "numeric_features = ['work_year', 'salary_in_usd', 'remote_ratio']\n", + "\n", + "preprocessor = ColumnTransformer(\n", + " transformers=[\n", + " ('num', StandardScaler(), numeric_features),\n", + " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)])\n", + "\n", + "X = df.drop('experience_level', axis=1)\n", + "y = df['experience_level']\n", + "\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", + "\n", + "model = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('classifier', RandomForestClassifier(random_state=42))])\n", + "\n", + "model.fit(X_train, y_train)\n", + "\n", + "y_pred = model.predict(X_test)\n", + "\n", + "accuracy = accuracy_score(y_test, y_pred)\n", + "print(f\"Accuracy: {accuracy}\")\n", + "\n", + "print(\"Classification Report:\")\n", + "print(classification_report(y_test, y_pred))\n", + "\n", + "print(\"Confusion Matrix:\")\n", + "print(confusion_matrix(y_test, y_pred))\n", + "\n", + "# Проверяем, достигнуты ли ориентиры\n", + "if accuracy >= 0.80:\n", + " print(\"Ориентиры для классификации уровня опыта достигнуты!\")\n", + "else:\n", + " print(\"Ориентиры для классификации уровня опыта не достигнуты.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Конвейер" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "from sklearn.base import BaseEstimator, TransformerMixin\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.impute import SimpleImputer\n", + "from sklearn.preprocessing import OneHotEncoder, StandardScaler\n", + "from sklearn.pipeline import Pipeline\n", + "\n", + "# Определение столбцов\n", + "numeric_columns = [\"work_year\", \"salary\", \"salary_in_usd\", \"remote_ratio\"]\n", + "cat_columns = [\"experience_level\", \"employment_type\", \"job_title\", \"salary_currency\", \"employee_residence\", \"company_location\", \"company_size\"]\n", + "\n", + "# Обработка числовых данных: заполнение пропущенных значений медианой и стандартизация\n", + "preprocessing_num_class = Pipeline(steps=[\n", + " ('imputer', SimpleImputer(strategy='median')),\n", + " ('scaler', StandardScaler())\n", + "])\n", + "\n", + "# Обработка категориальных данных: заполнение пропущенных значений наиболее частым значением и one-hot encoding\n", + "preprocessing_cat_class = Pipeline(steps=[\n", + " ('imputer', SimpleImputer(strategy='most_frequent')),\n", + " ('onehot', OneHotEncoder(handle_unknown='ignore'))\n", + "])\n", + "\n", + "# Объединение всех преобразований в один ColumnTransformer\n", + "features_preprocessing = ColumnTransformer(\n", + " verbose_feature_names_out=False,\n", + " transformers=[\n", + " (\"prepocessing_num\", preprocessing_num_class, numeric_columns),\n", + " (\"prepocessing_cat\", preprocessing_cat_class, cat_columns),\n", + " ],\n", + " remainder=\"passthrough\"\n", + ")\n", + "\n", + "# Определение конвейера\n", + "pipeline_end = Pipeline(\n", + " [\n", + " (\"features_preprocessing\", features_preprocessing),\n", + " ]\n", + ")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'train_test_split' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[5], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;66;03m# Разделение данных на тренировочный и тестовый наборы\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m X_train, X_test \u001b[38;5;241m=\u001b[39m \u001b[43mtrain_test_split\u001b[49m(df, test_size\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0.2\u001b[39m, random_state\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m42\u001b[39m)\n\u001b[0;32m 4\u001b[0m \u001b[38;5;66;03m# Применение конвейера для предобработки данных\u001b[39;00m\n\u001b[0;32m 5\u001b[0m preprocessing_result \u001b[38;5;241m=\u001b[39m pipeline_end\u001b[38;5;241m.\u001b[39mfit_transform(X_train)\n", + "\u001b[1;31mNameError\u001b[0m: name 'train_test_split' is not defined" + ] + } + ], + "source": [ + "# Разделение данных на тренировочный и тестовый наборы\n", + "X_train, X_test = train_test_split(df, test_size=0.2, random_state=42)\n", + "\n", + "# Применение конвейера для предобработки данных\n", + "preprocessing_result = pipeline_end.fit_transform(X_train)\n", + "\n", + "# Получение имен столбцов после преобразования\n", + "feature_names = pipeline_end.named_steps['features_preprocessing'].get_feature_names_out()\n", + "\n", + "# Создание DataFrame с преобразованными данными\n", + "preprocessed_df = pd.DataFrame(\n", + " preprocessing_result,\n", + " columns=feature_names,\n", + ")\n", + "\n", + "# Вывод преобразованного DataFrame\n", + "print(preprocessed_df)" + ] } ], "metadata": {