Files
machine_learning_projects/3.宝可梦数据集分析/小组作业/宝可梦数据集.ipynb
T
less IS more 966c040379 小组作业
Signed-off-by: less IS more <13190735+wnflt@user.noreply.gitee.com>
2023-07-17 01:51:52 +00:00

2038 lines
94 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "c259bb65",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"from sklearn import preprocessing\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import accuracy_score,confusion_matrix,roc_curve,roc_auc_score\n",
"from sklearn.ensemble import RandomForestClassifier,BaggingClassifier,AdaBoostClassifier\n",
"from sklearn.naive_bayes import GaussianNB\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.svm import SVC\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.neighbors import KNeighborsClassifier \n",
"import warnings\n",
"warnings.filterwarnings('ignore')\n",
"\n",
"plt.rcParams['font.sans-serif'] = ['SimHei'] # matplotlib显示中文字体\n",
"plt.rcParams['axes.unicode_minus'] = False # matplotlib显示负号"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "0b7fc8fa",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>abilities</th>\n",
" <th>against_bug</th>\n",
" <th>against_dark</th>\n",
" <th>against_dragon</th>\n",
" <th>against_electric</th>\n",
" <th>against_fairy</th>\n",
" <th>against_fight</th>\n",
" <th>against_fire</th>\n",
" <th>against_flying</th>\n",
" <th>against_ghost</th>\n",
" <th>...</th>\n",
" <th>percentage_male</th>\n",
" <th>pokedex_number</th>\n",
" <th>sp_attack</th>\n",
" <th>sp_defense</th>\n",
" <th>speed</th>\n",
" <th>type1</th>\n",
" <th>type2</th>\n",
" <th>weight_kg</th>\n",
" <th>generation</th>\n",
" <th>is_legendary</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>['Overgrow', 'Chlorophyll']</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.5</td>\n",
" <td>0.5</td>\n",
" <td>0.5</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>1</td>\n",
" <td>65</td>\n",
" <td>65</td>\n",
" <td>45</td>\n",
" <td>grass</td>\n",
" <td>poison</td>\n",
" <td>6.9</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>['Overgrow', 'Chlorophyll']</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.5</td>\n",
" <td>0.5</td>\n",
" <td>0.5</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>2</td>\n",
" <td>80</td>\n",
" <td>80</td>\n",
" <td>60</td>\n",
" <td>grass</td>\n",
" <td>poison</td>\n",
" <td>13.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>['Overgrow', 'Chlorophyll']</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.5</td>\n",
" <td>0.5</td>\n",
" <td>0.5</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>3</td>\n",
" <td>122</td>\n",
" <td>120</td>\n",
" <td>80</td>\n",
" <td>grass</td>\n",
" <td>poison</td>\n",
" <td>100.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>['Blaze', 'Solar Power']</td>\n",
" <td>0.5</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.5</td>\n",
" <td>1.0</td>\n",
" <td>0.5</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>4</td>\n",
" <td>60</td>\n",
" <td>50</td>\n",
" <td>65</td>\n",
" <td>fire</td>\n",
" <td>NaN</td>\n",
" <td>8.5</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>['Blaze', 'Solar Power']</td>\n",
" <td>0.5</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.5</td>\n",
" <td>1.0</td>\n",
" <td>0.5</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>5</td>\n",
" <td>80</td>\n",
" <td>65</td>\n",
" <td>80</td>\n",
" <td>fire</td>\n",
" <td>NaN</td>\n",
" <td>19.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 41 columns</p>\n",
"</div>"
],
"text/plain": [
" abilities against_bug against_dark against_dragon \\\n",
"0 ['Overgrow', 'Chlorophyll'] 1.0 1.0 1.0 \n",
"1 ['Overgrow', 'Chlorophyll'] 1.0 1.0 1.0 \n",
"2 ['Overgrow', 'Chlorophyll'] 1.0 1.0 1.0 \n",
"3 ['Blaze', 'Solar Power'] 0.5 1.0 1.0 \n",
"4 ['Blaze', 'Solar Power'] 0.5 1.0 1.0 \n",
"\n",
" against_electric against_fairy against_fight against_fire \\\n",
"0 0.5 0.5 0.5 2.0 \n",
"1 0.5 0.5 0.5 2.0 \n",
"2 0.5 0.5 0.5 2.0 \n",
"3 1.0 0.5 1.0 0.5 \n",
"4 1.0 0.5 1.0 0.5 \n",
"\n",
" against_flying against_ghost ... percentage_male pokedex_number \\\n",
"0 2.0 1.0 ... 88.1 1 \n",
"1 2.0 1.0 ... 88.1 2 \n",
"2 2.0 1.0 ... 88.1 3 \n",
"3 1.0 1.0 ... 88.1 4 \n",
"4 1.0 1.0 ... 88.1 5 \n",
"\n",
" sp_attack sp_defense speed type1 type2 weight_kg generation \\\n",
"0 65 65 45 grass poison 6.9 1 \n",
"1 80 80 60 grass poison 13.0 1 \n",
"2 122 120 80 grass poison 100.0 1 \n",
"3 60 50 65 fire NaN 8.5 1 \n",
"4 80 65 80 fire NaN 19.0 1 \n",
"\n",
" is_legendary \n",
"0 0 \n",
"1 0 \n",
"2 0 \n",
"3 0 \n",
"4 0 \n",
"\n",
"[5 rows x 41 columns]"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv('pokemon0820.csv')\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "6846d64a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 801 entries, 0 to 800\n",
"Data columns (total 41 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 abilities 801 non-null object \n",
" 1 against_bug 801 non-null float64\n",
" 2 against_dark 801 non-null float64\n",
" 3 against_dragon 801 non-null float64\n",
" 4 against_electric 801 non-null float64\n",
" 5 against_fairy 801 non-null float64\n",
" 6 against_fight 801 non-null float64\n",
" 7 against_fire 801 non-null float64\n",
" 8 against_flying 801 non-null float64\n",
" 9 against_ghost 801 non-null float64\n",
" 10 against_grass 801 non-null float64\n",
" 11 against_ground 801 non-null float64\n",
" 12 against_ice 801 non-null float64\n",
" 13 against_normal 801 non-null float64\n",
" 14 against_poison 801 non-null float64\n",
" 15 against_psychic 801 non-null float64\n",
" 16 against_rock 801 non-null float64\n",
" 17 against_steel 801 non-null float64\n",
" 18 against_water 801 non-null float64\n",
" 19 attack 801 non-null int64 \n",
" 20 base_egg_steps 801 non-null int64 \n",
" 21 base_happiness 801 non-null int64 \n",
" 22 base_total 801 non-null int64 \n",
" 23 capture_rate 801 non-null object \n",
" 24 classfication 801 non-null object \n",
" 25 defense 801 non-null int64 \n",
" 26 experience_growth 801 non-null int64 \n",
" 27 height_m 781 non-null float64\n",
" 28 hp 801 non-null int64 \n",
" 29 japanese_name 801 non-null object \n",
" 30 name 801 non-null object \n",
" 31 percentage_male 703 non-null float64\n",
" 32 pokedex_number 801 non-null int64 \n",
" 33 sp_attack 801 non-null int64 \n",
" 34 sp_defense 801 non-null int64 \n",
" 35 speed 801 non-null int64 \n",
" 36 type1 801 non-null object \n",
" 37 type2 417 non-null object \n",
" 38 weight_kg 781 non-null float64\n",
" 39 generation 801 non-null int64 \n",
" 40 is_legendary 801 non-null int64 \n",
"dtypes: float64(21), int64(13), object(7)\n",
"memory usage: 256.7+ KB\n"
]
}
],
"source": [
"# 缺失值检测\n",
"df.info()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "2dd54e3f",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>against_bug</th>\n",
" <th>against_dark</th>\n",
" <th>against_dragon</th>\n",
" <th>against_electric</th>\n",
" <th>against_fairy</th>\n",
" <th>against_fight</th>\n",
" <th>against_fire</th>\n",
" <th>against_flying</th>\n",
" <th>against_ghost</th>\n",
" <th>against_grass</th>\n",
" <th>...</th>\n",
" <th>height_m</th>\n",
" <th>hp</th>\n",
" <th>percentage_male</th>\n",
" <th>pokedex_number</th>\n",
" <th>sp_attack</th>\n",
" <th>sp_defense</th>\n",
" <th>speed</th>\n",
" <th>weight_kg</th>\n",
" <th>generation</th>\n",
" <th>is_legendary</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>801.000000</td>\n",
" <td>801.000000</td>\n",
" <td>801.000000</td>\n",
" <td>801.000000</td>\n",
" <td>801.000000</td>\n",
" <td>801.000000</td>\n",
" <td>801.000000</td>\n",
" <td>801.000000</td>\n",
" <td>801.000000</td>\n",
" <td>801.000000</td>\n",
" <td>...</td>\n",
" <td>781.000000</td>\n",
" <td>801.000000</td>\n",
" <td>703.000000</td>\n",
" <td>801.000000</td>\n",
" <td>801.000000</td>\n",
" <td>801.000000</td>\n",
" <td>801.000000</td>\n",
" <td>781.000000</td>\n",
" <td>801.000000</td>\n",
" <td>801.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>0.996255</td>\n",
" <td>1.057116</td>\n",
" <td>0.968789</td>\n",
" <td>1.073970</td>\n",
" <td>1.068976</td>\n",
" <td>1.065543</td>\n",
" <td>1.135456</td>\n",
" <td>1.192884</td>\n",
" <td>0.985019</td>\n",
" <td>1.034020</td>\n",
" <td>...</td>\n",
" <td>1.163892</td>\n",
" <td>68.958801</td>\n",
" <td>55.155761</td>\n",
" <td>401.000000</td>\n",
" <td>71.305868</td>\n",
" <td>70.911361</td>\n",
" <td>66.334582</td>\n",
" <td>61.378105</td>\n",
" <td>3.690387</td>\n",
" <td>0.087391</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>0.597248</td>\n",
" <td>0.438142</td>\n",
" <td>0.353058</td>\n",
" <td>0.654962</td>\n",
" <td>0.522167</td>\n",
" <td>0.717251</td>\n",
" <td>0.691853</td>\n",
" <td>0.604488</td>\n",
" <td>0.558256</td>\n",
" <td>0.788896</td>\n",
" <td>...</td>\n",
" <td>1.080326</td>\n",
" <td>26.576015</td>\n",
" <td>20.261623</td>\n",
" <td>231.373075</td>\n",
" <td>32.353826</td>\n",
" <td>27.942501</td>\n",
" <td>28.907662</td>\n",
" <td>109.354766</td>\n",
" <td>1.930420</td>\n",
" <td>0.282583</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>0.250000</td>\n",
" <td>0.250000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.250000</td>\n",
" <td>0.000000</td>\n",
" <td>0.250000</td>\n",
" <td>0.250000</td>\n",
" <td>0.000000</td>\n",
" <td>0.250000</td>\n",
" <td>...</td>\n",
" <td>0.100000</td>\n",
" <td>1.000000</td>\n",
" <td>0.000000</td>\n",
" <td>1.000000</td>\n",
" <td>10.000000</td>\n",
" <td>20.000000</td>\n",
" <td>5.000000</td>\n",
" <td>0.100000</td>\n",
" <td>1.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>0.500000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>0.500000</td>\n",
" <td>1.000000</td>\n",
" <td>0.500000</td>\n",
" <td>0.500000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>0.500000</td>\n",
" <td>...</td>\n",
" <td>0.600000</td>\n",
" <td>50.000000</td>\n",
" <td>50.000000</td>\n",
" <td>201.000000</td>\n",
" <td>45.000000</td>\n",
" <td>50.000000</td>\n",
" <td>45.000000</td>\n",
" <td>9.000000</td>\n",
" <td>2.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>...</td>\n",
" <td>1.000000</td>\n",
" <td>65.000000</td>\n",
" <td>50.000000</td>\n",
" <td>401.000000</td>\n",
" <td>65.000000</td>\n",
" <td>66.000000</td>\n",
" <td>65.000000</td>\n",
" <td>27.300000</td>\n",
" <td>4.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>2.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>...</td>\n",
" <td>1.500000</td>\n",
" <td>80.000000</td>\n",
" <td>50.000000</td>\n",
" <td>601.000000</td>\n",
" <td>91.000000</td>\n",
" <td>90.000000</td>\n",
" <td>85.000000</td>\n",
" <td>64.800000</td>\n",
" <td>5.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>4.000000</td>\n",
" <td>4.000000</td>\n",
" <td>2.000000</td>\n",
" <td>4.000000</td>\n",
" <td>4.000000</td>\n",
" <td>4.000000</td>\n",
" <td>4.000000</td>\n",
" <td>4.000000</td>\n",
" <td>4.000000</td>\n",
" <td>4.000000</td>\n",
" <td>...</td>\n",
" <td>14.500000</td>\n",
" <td>255.000000</td>\n",
" <td>100.000000</td>\n",
" <td>801.000000</td>\n",
" <td>194.000000</td>\n",
" <td>230.000000</td>\n",
" <td>180.000000</td>\n",
" <td>999.900000</td>\n",
" <td>7.000000</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>8 rows × 34 columns</p>\n",
"</div>"
],
"text/plain": [
" against_bug against_dark against_dragon against_electric \\\n",
"count 801.000000 801.000000 801.000000 801.000000 \n",
"mean 0.996255 1.057116 0.968789 1.073970 \n",
"std 0.597248 0.438142 0.353058 0.654962 \n",
"min 0.250000 0.250000 0.000000 0.000000 \n",
"25% 0.500000 1.000000 1.000000 0.500000 \n",
"50% 1.000000 1.000000 1.000000 1.000000 \n",
"75% 1.000000 1.000000 1.000000 1.000000 \n",
"max 4.000000 4.000000 2.000000 4.000000 \n",
"\n",
" against_fairy against_fight against_fire against_flying \\\n",
"count 801.000000 801.000000 801.000000 801.000000 \n",
"mean 1.068976 1.065543 1.135456 1.192884 \n",
"std 0.522167 0.717251 0.691853 0.604488 \n",
"min 0.250000 0.000000 0.250000 0.250000 \n",
"25% 1.000000 0.500000 0.500000 1.000000 \n",
"50% 1.000000 1.000000 1.000000 1.000000 \n",
"75% 1.000000 1.000000 2.000000 1.000000 \n",
"max 4.000000 4.000000 4.000000 4.000000 \n",
"\n",
" against_ghost against_grass ... height_m hp \\\n",
"count 801.000000 801.000000 ... 781.000000 801.000000 \n",
"mean 0.985019 1.034020 ... 1.163892 68.958801 \n",
"std 0.558256 0.788896 ... 1.080326 26.576015 \n",
"min 0.000000 0.250000 ... 0.100000 1.000000 \n",
"25% 1.000000 0.500000 ... 0.600000 50.000000 \n",
"50% 1.000000 1.000000 ... 1.000000 65.000000 \n",
"75% 1.000000 1.000000 ... 1.500000 80.000000 \n",
"max 4.000000 4.000000 ... 14.500000 255.000000 \n",
"\n",
" percentage_male pokedex_number sp_attack sp_defense speed \\\n",
"count 703.000000 801.000000 801.000000 801.000000 801.000000 \n",
"mean 55.155761 401.000000 71.305868 70.911361 66.334582 \n",
"std 20.261623 231.373075 32.353826 27.942501 28.907662 \n",
"min 0.000000 1.000000 10.000000 20.000000 5.000000 \n",
"25% 50.000000 201.000000 45.000000 50.000000 45.000000 \n",
"50% 50.000000 401.000000 65.000000 66.000000 65.000000 \n",
"75% 50.000000 601.000000 91.000000 90.000000 85.000000 \n",
"max 100.000000 801.000000 194.000000 230.000000 180.000000 \n",
"\n",
" weight_kg generation is_legendary \n",
"count 781.000000 801.000000 801.000000 \n",
"mean 61.378105 3.690387 0.087391 \n",
"std 109.354766 1.930420 0.282583 \n",
"min 0.100000 1.000000 0.000000 \n",
"25% 9.000000 2.000000 0.000000 \n",
"50% 27.300000 4.000000 0.000000 \n",
"75% 64.800000 5.000000 0.000000 \n",
"max 999.900000 7.000000 1.000000 \n",
"\n",
"[8 rows x 34 columns]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 整体统计数据\n",
"df.describe()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "624120d8",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"is_legendary 1.000000\n",
"base_egg_steps 0.873488\n",
"base_total 0.485440\n",
"sp_attack 0.406281\n",
"weight_kg 0.393023\n",
"experience_growth 0.361038\n",
"sp_defense 0.343241\n",
"height_m 0.322155\n",
"speed 0.311639\n",
"hp 0.308405\n",
"attack 0.303295\n",
"defense 0.265587\n",
"pokedex_number 0.196785\n",
"against_ghost 0.170746\n",
"generation 0.139029\n",
"against_dark 0.136315\n",
"against_fairy 0.050165\n",
"percentage_male 0.045222\n",
"against_bug 0.027864\n",
"against_dragon 0.014844\n",
"against_ground 0.012812\n",
"against_ice 0.005580\n",
"against_steel 0.001397\n",
"against_fire -0.011073\n",
"against_rock -0.017588\n",
"against_water -0.020679\n",
"against_electric -0.023151\n",
"against_poison -0.024349\n",
"against_normal -0.034761\n",
"against_fight -0.059132\n",
"against_flying -0.062214\n",
"against_grass -0.070826\n",
"against_psychic -0.106047\n",
"base_happiness -0.413108\n",
"Name: is_legendary, dtype: float64"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 可视化变量与'is_legendary'的相关性\n",
"df.corr()['is_legendary'].sort_values(ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "7acf8619",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>attack</th>\n",
" <th>base_egg_steps</th>\n",
" <th>base_happiness</th>\n",
" <th>base_total</th>\n",
" <th>capture_rate</th>\n",
" <th>classfication</th>\n",
" <th>defense</th>\n",
" <th>experience_growth</th>\n",
" <th>height_m</th>\n",
" <th>hp</th>\n",
" <th>...</th>\n",
" <th>percentage_male</th>\n",
" <th>pokedex_number</th>\n",
" <th>sp_attack</th>\n",
" <th>sp_defense</th>\n",
" <th>speed</th>\n",
" <th>type1</th>\n",
" <th>type2</th>\n",
" <th>weight_kg</th>\n",
" <th>generation</th>\n",
" <th>is_legendary</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>49</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>318</td>\n",
" <td>45</td>\n",
" <td>Seed Pokémon</td>\n",
" <td>49</td>\n",
" <td>1059860</td>\n",
" <td>0.7</td>\n",
" <td>45</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>1</td>\n",
" <td>65</td>\n",
" <td>65</td>\n",
" <td>45</td>\n",
" <td>grass</td>\n",
" <td>poison</td>\n",
" <td>6.9</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>62</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>405</td>\n",
" <td>45</td>\n",
" <td>Seed Pokémon</td>\n",
" <td>63</td>\n",
" <td>1059860</td>\n",
" <td>1.0</td>\n",
" <td>60</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>2</td>\n",
" <td>80</td>\n",
" <td>80</td>\n",
" <td>60</td>\n",
" <td>grass</td>\n",
" <td>poison</td>\n",
" <td>13.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>100</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>625</td>\n",
" <td>45</td>\n",
" <td>Seed Pokémon</td>\n",
" <td>123</td>\n",
" <td>1059860</td>\n",
" <td>2.0</td>\n",
" <td>80</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>3</td>\n",
" <td>122</td>\n",
" <td>120</td>\n",
" <td>80</td>\n",
" <td>grass</td>\n",
" <td>poison</td>\n",
" <td>100.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>52</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>309</td>\n",
" <td>45</td>\n",
" <td>Lizard Pokémon</td>\n",
" <td>43</td>\n",
" <td>1059860</td>\n",
" <td>0.6</td>\n",
" <td>39</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>4</td>\n",
" <td>60</td>\n",
" <td>50</td>\n",
" <td>65</td>\n",
" <td>fire</td>\n",
" <td>NaN</td>\n",
" <td>8.5</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>64</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>405</td>\n",
" <td>45</td>\n",
" <td>Flame Pokémon</td>\n",
" <td>58</td>\n",
" <td>1059860</td>\n",
" <td>1.1</td>\n",
" <td>58</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>5</td>\n",
" <td>80</td>\n",
" <td>65</td>\n",
" <td>80</td>\n",
" <td>fire</td>\n",
" <td>NaN</td>\n",
" <td>19.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 22 columns</p>\n",
"</div>"
],
"text/plain": [
" attack base_egg_steps base_happiness base_total capture_rate \\\n",
"0 49 5120 70 318 45 \n",
"1 62 5120 70 405 45 \n",
"2 100 5120 70 625 45 \n",
"3 52 5120 70 309 45 \n",
"4 64 5120 70 405 45 \n",
"\n",
" classfication defense experience_growth height_m hp ... \\\n",
"0 Seed Pokémon 49 1059860 0.7 45 ... \n",
"1 Seed Pokémon 63 1059860 1.0 60 ... \n",
"2 Seed Pokémon 123 1059860 2.0 80 ... \n",
"3 Lizard Pokémon 43 1059860 0.6 39 ... \n",
"4 Flame Pokémon 58 1059860 1.1 58 ... \n",
"\n",
" percentage_male pokedex_number sp_attack sp_defense speed type1 type2 \\\n",
"0 88.1 1 65 65 45 grass poison \n",
"1 88.1 2 80 80 60 grass poison \n",
"2 88.1 3 122 120 80 grass poison \n",
"3 88.1 4 60 50 65 fire NaN \n",
"4 88.1 5 80 65 80 fire NaN \n",
"\n",
" weight_kg generation is_legendary \n",
"0 6.9 1 0 \n",
"1 13.0 1 0 \n",
"2 100.0 1 0 \n",
"3 8.5 1 0 \n",
"4 19.0 1 0 \n",
"\n",
"[5 rows x 22 columns]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 剔除与'is_legendary'的特征变量\n",
"index_to_drop = np.arange(19)\n",
"df.drop(df.columns[index_to_drop], axis=1, inplace=True)\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "2a618ea2",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>attack</th>\n",
" <th>base_egg_steps</th>\n",
" <th>base_happiness</th>\n",
" <th>base_total</th>\n",
" <th>capture_rate</th>\n",
" <th>classfication</th>\n",
" <th>defense</th>\n",
" <th>experience_growth</th>\n",
" <th>height_m</th>\n",
" <th>hp</th>\n",
" <th>...</th>\n",
" <th>percentage_male</th>\n",
" <th>pokedex_number</th>\n",
" <th>sp_attack</th>\n",
" <th>sp_defense</th>\n",
" <th>speed</th>\n",
" <th>type1</th>\n",
" <th>type2</th>\n",
" <th>weight_kg</th>\n",
" <th>generation</th>\n",
" <th>is_legendary</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>49</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>318</td>\n",
" <td>45</td>\n",
" <td>Seed Pokémon</td>\n",
" <td>49</td>\n",
" <td>1059860</td>\n",
" <td>0.7</td>\n",
" <td>45</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>1</td>\n",
" <td>65</td>\n",
" <td>65</td>\n",
" <td>45</td>\n",
" <td>grass</td>\n",
" <td>poison</td>\n",
" <td>6.9</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>62</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>405</td>\n",
" <td>45</td>\n",
" <td>Seed Pokémon</td>\n",
" <td>63</td>\n",
" <td>1059860</td>\n",
" <td>1.0</td>\n",
" <td>60</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>2</td>\n",
" <td>80</td>\n",
" <td>80</td>\n",
" <td>60</td>\n",
" <td>grass</td>\n",
" <td>poison</td>\n",
" <td>13.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>100</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>625</td>\n",
" <td>45</td>\n",
" <td>Seed Pokémon</td>\n",
" <td>123</td>\n",
" <td>1059860</td>\n",
" <td>2.0</td>\n",
" <td>80</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>3</td>\n",
" <td>122</td>\n",
" <td>120</td>\n",
" <td>80</td>\n",
" <td>grass</td>\n",
" <td>poison</td>\n",
" <td>100.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>52</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>309</td>\n",
" <td>45</td>\n",
" <td>Lizard Pokémon</td>\n",
" <td>43</td>\n",
" <td>1059860</td>\n",
" <td>0.6</td>\n",
" <td>39</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>4</td>\n",
" <td>60</td>\n",
" <td>50</td>\n",
" <td>65</td>\n",
" <td>fire</td>\n",
" <td>NaN</td>\n",
" <td>8.5</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>64</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>405</td>\n",
" <td>45</td>\n",
" <td>Flame Pokémon</td>\n",
" <td>58</td>\n",
" <td>1059860</td>\n",
" <td>1.1</td>\n",
" <td>58</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>5</td>\n",
" <td>80</td>\n",
" <td>65</td>\n",
" <td>80</td>\n",
" <td>fire</td>\n",
" <td>NaN</td>\n",
" <td>19.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 21 columns</p>\n",
"</div>"
],
"text/plain": [
" attack base_egg_steps base_happiness base_total capture_rate \\\n",
"0 49 5120 70 318 45 \n",
"1 62 5120 70 405 45 \n",
"2 100 5120 70 625 45 \n",
"3 52 5120 70 309 45 \n",
"4 64 5120 70 405 45 \n",
"\n",
" classfication defense experience_growth height_m hp ... \\\n",
"0 Seed Pokémon 49 1059860 0.7 45 ... \n",
"1 Seed Pokémon 63 1059860 1.0 60 ... \n",
"2 Seed Pokémon 123 1059860 2.0 80 ... \n",
"3 Lizard Pokémon 43 1059860 0.6 39 ... \n",
"4 Flame Pokémon 58 1059860 1.1 58 ... \n",
"\n",
" percentage_male pokedex_number sp_attack sp_defense speed type1 \\\n",
"0 88.1 1 65 65 45 grass \n",
"1 88.1 2 80 80 60 grass \n",
"2 88.1 3 122 120 80 grass \n",
"3 88.1 4 60 50 65 fire \n",
"4 88.1 5 80 65 80 fire \n",
"\n",
" type2 weight_kg generation is_legendary \n",
"0 poison 6.9 1 0 \n",
"1 poison 13.0 1 0 \n",
"2 poison 100.0 1 0 \n",
"3 NaN 8.5 1 0 \n",
"4 NaN 19.0 1 0 \n",
"\n",
"[5 rows x 21 columns]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = df.drop('japanese_name', axis=1)\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "6f4d6756",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>name</th>\n",
" <th>attack</th>\n",
" <th>base_egg_steps</th>\n",
" <th>base_happiness</th>\n",
" <th>base_total</th>\n",
" <th>capture_rate</th>\n",
" <th>classfication</th>\n",
" <th>defense</th>\n",
" <th>experience_growth</th>\n",
" <th>height_m</th>\n",
" <th>...</th>\n",
" <th>percentage_male</th>\n",
" <th>pokedex_number</th>\n",
" <th>sp_attack</th>\n",
" <th>sp_defense</th>\n",
" <th>speed</th>\n",
" <th>type1</th>\n",
" <th>type2</th>\n",
" <th>weight_kg</th>\n",
" <th>generation</th>\n",
" <th>is_legendary</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Bulbasaur</td>\n",
" <td>49</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>318</td>\n",
" <td>45</td>\n",
" <td>Seed Pokémon</td>\n",
" <td>49</td>\n",
" <td>1059860</td>\n",
" <td>0.7</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>1</td>\n",
" <td>65</td>\n",
" <td>65</td>\n",
" <td>45</td>\n",
" <td>grass</td>\n",
" <td>poison</td>\n",
" <td>6.9</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Ivysaur</td>\n",
" <td>62</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>405</td>\n",
" <td>45</td>\n",
" <td>Seed Pokémon</td>\n",
" <td>63</td>\n",
" <td>1059860</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>2</td>\n",
" <td>80</td>\n",
" <td>80</td>\n",
" <td>60</td>\n",
" <td>grass</td>\n",
" <td>poison</td>\n",
" <td>13.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Venusaur</td>\n",
" <td>100</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>625</td>\n",
" <td>45</td>\n",
" <td>Seed Pokémon</td>\n",
" <td>123</td>\n",
" <td>1059860</td>\n",
" <td>2.0</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>3</td>\n",
" <td>122</td>\n",
" <td>120</td>\n",
" <td>80</td>\n",
" <td>grass</td>\n",
" <td>poison</td>\n",
" <td>100.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Charmander</td>\n",
" <td>52</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>309</td>\n",
" <td>45</td>\n",
" <td>Lizard Pokémon</td>\n",
" <td>43</td>\n",
" <td>1059860</td>\n",
" <td>0.6</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>4</td>\n",
" <td>60</td>\n",
" <td>50</td>\n",
" <td>65</td>\n",
" <td>fire</td>\n",
" <td>NaN</td>\n",
" <td>8.5</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Charmeleon</td>\n",
" <td>64</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>405</td>\n",
" <td>45</td>\n",
" <td>Flame Pokémon</td>\n",
" <td>58</td>\n",
" <td>1059860</td>\n",
" <td>1.1</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>5</td>\n",
" <td>80</td>\n",
" <td>65</td>\n",
" <td>80</td>\n",
" <td>fire</td>\n",
" <td>NaN</td>\n",
" <td>19.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 21 columns</p>\n",
"</div>"
],
"text/plain": [
" name attack base_egg_steps base_happiness base_total \\\n",
"0 Bulbasaur 49 5120 70 318 \n",
"1 Ivysaur 62 5120 70 405 \n",
"2 Venusaur 100 5120 70 625 \n",
"3 Charmander 52 5120 70 309 \n",
"4 Charmeleon 64 5120 70 405 \n",
"\n",
" capture_rate classfication defense experience_growth height_m ... \\\n",
"0 45 Seed Pokémon 49 1059860 0.7 ... \n",
"1 45 Seed Pokémon 63 1059860 1.0 ... \n",
"2 45 Seed Pokémon 123 1059860 2.0 ... \n",
"3 45 Lizard Pokémon 43 1059860 0.6 ... \n",
"4 45 Flame Pokémon 58 1059860 1.1 ... \n",
"\n",
" percentage_male pokedex_number sp_attack sp_defense speed type1 \\\n",
"0 88.1 1 65 65 45 grass \n",
"1 88.1 2 80 80 60 grass \n",
"2 88.1 3 122 120 80 grass \n",
"3 88.1 4 60 50 65 fire \n",
"4 88.1 5 80 65 80 fire \n",
"\n",
" type2 weight_kg generation is_legendary \n",
"0 poison 6.9 1 0 \n",
"1 poison 13.0 1 0 \n",
"2 poison 100.0 1 0 \n",
"3 NaN 8.5 1 0 \n",
"4 NaN 19.0 1 0 \n",
"\n",
"[5 rows x 21 columns]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"column_to_move = df['name']\n",
"df.drop('name', axis=1, inplace=True)\n",
"df.insert(0, 'name', column_to_move)\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "c86f35a3",
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 801 entries, 0 to 800\n",
"Data columns (total 21 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 name 801 non-null object \n",
" 1 attack 801 non-null int64 \n",
" 2 base_egg_steps 801 non-null int64 \n",
" 3 base_happiness 801 non-null int64 \n",
" 4 base_total 801 non-null int64 \n",
" 5 capture_rate 801 non-null object \n",
" 6 classfication 801 non-null object \n",
" 7 defense 801 non-null int64 \n",
" 8 experience_growth 801 non-null int64 \n",
" 9 height_m 781 non-null float64\n",
" 10 hp 801 non-null int64 \n",
" 11 percentage_male 703 non-null float64\n",
" 12 pokedex_number 801 non-null int64 \n",
" 13 sp_attack 801 non-null int64 \n",
" 14 sp_defense 801 non-null int64 \n",
" 15 speed 801 non-null int64 \n",
" 16 type1 801 non-null object \n",
" 17 type2 417 non-null object \n",
" 18 weight_kg 781 non-null float64\n",
" 19 generation 801 non-null int64 \n",
" 20 is_legendary 801 non-null int64 \n",
"dtypes: float64(3), int64(13), object(5)\n",
"memory usage: 131.5+ KB\n"
]
}
],
"source": [
"# 再次检测缺失值\n",
"df.info()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "b7db1043",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"is_legendary 1.000000\n",
"base_egg_steps 0.873488\n",
"base_total 0.485440\n",
"sp_attack 0.406281\n",
"weight_kg 0.393023\n",
"experience_growth 0.361038\n",
"sp_defense 0.343241\n",
"height_m 0.322155\n",
"speed 0.311639\n",
"hp 0.308405\n",
"attack 0.303295\n",
"defense 0.265587\n",
"pokedex_number 0.196785\n",
"generation 0.139029\n",
"percentage_male 0.045222\n",
"base_happiness -0.413108\n",
"Name: is_legendary, dtype: float64"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.corr()['is_legendary'].sort_values(ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "13f0feb0",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA94AAAHqCAYAAADyGZa5AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABFVklEQVR4nO3dfVyUdb7/8fc4I4MkCiRZASlq5VGjzEi0zdo9lhaQaJ5udCvd3LRas3TZ5FTb7QK7W6zdapgr4mau601aLmlHzdw67ImOsvGDk6RSaKloNIOCo8L1+0Mdm7gRiWuuAV7Px+N62PX9XjcfUD/x9jtzjc0wDEMAAAAAAMAUnawuAAAAAACA9ozgDQAAAACAiQjeAAAAAACYiOANAAAAAICJCN4AAAAAAJiI4A0AAAAAgIkI3gAAAAAAmIjgDQAAAACAiRxWF9Ba6urq9PXXXys0NFQ2m83qcgAEMMMwVFVVpQsvvFCdOnWsf3+kVwJojo7cJyV6JYDmOZte2W6C99dff62YmBirywDQhpSXlys6OtrqMvyKXgngbHTEPinRKwGcneb0ynYTvENDQyWd+KK7detmcTUAApnb7VZMTIy3b3Qk9EoAzdGR+6RErwTQPGfTK9tN8D71MqBu3brRIAE0S0d8+SC9EsDZ6Ih9UqJXAjg7zemVHe9NOwAAAAAA+BHBGwAAAAAAExG8AQAAAAAwEcEbAAAAAAATEbwBAAAAADARwRsAAAAAABMRvAEAAAAAMBHBGwAAAAAAExG8AQAAAAAwEcEbAAAAAAATEbwBAAAAADARwRsAAAAAABMRvAEAAAAAMBHBGwAAAAAAE/k9eOfk5Mhms9XbcnJyVFRUpPj4eIWHhys1NVWGYfi7PAAAAAAAWpXfg/eECRNUWVnp3crLy9WjRw8NGzZMycnJGjJkiAoKClRcXKycnBx/lwcAAIAAMn36dJ/Fmn79+klSkws2LOYACDR+D95BQUEKCwvzbrm5uRo3bpxKSkrkcrmUlZWlvn37Kj09XQsWLPB3eQAAAAggn376qdauXetdtNm6das8Hk+jCzZNzQGAVSx9j/eRI0f04osvKi0tTYWFhUpISFBISIgkKS4uTsXFxVaWBwAAAAsdP35cRUVFGjFihHfRJjQ0VHl5eY0u2DQ1BwBWsTR4L1myRAkJCerdu7fcbrdiY2O9czabTXa7XZWVlQ2e6/F45Ha7fTYAAAC0H5999pkMw9AVV1yhLl26aPTo0frqq6+aXLBpyWIOP1cCMJvDypvPmzdPTz/99IlCHA45nU6f+eDgYFVXVys8PLzeuRkZGd5zrfD5q2N89i99cLVFlQAAALRPxcXFGjhwoF5++WX16NFDDz30kKZOnaoBAwY0umDT1GJOQz9TStb/XAn/2TziOsvufd2Hmy27N6xn2Yr3F198oS+++EIjR46UJEVERKiiosLnmKqqKgUFBTV4flpamlwul3crLy83vWYAAAD4z8SJE5Wfn6/4+HjFxsbqlVde0fr161VXV9fogk1TizmN4edKAGazbMV72bJlSkpKUufOnSVJ8fHxeuONN7zzZWVl8ng8ioiIaPB8p9NZr6kCAACg/QoLC1NdXZ3OP/98FRUV+cydWrCJiIhodK4x/FwJwGyWrXi/9957+ulPf+rdHzFihFwul3JzcyVJmZmZGjlypOx2u1UlAgAAwEIzZ87UsmXLvPuffPKJOnXqpMsuu0z5+fne8e8v2MTHxzc6BwBWsSR419TU6J///KeGDRvmHXM4HMrOzta0adPUs2dPLV++XJmZmVaUBwAAgABwxRVX6LHHHtOHH36ojRs3avr06Zo0aZJuvPHGRhdsWMwBEIgseal5ly5d5PF46o2npKSotLRUBQUFGj58uCIjIy2oDgAAAIHg7rvvVklJicaMGaPQ0FCNHTtW6enp3gWbCRMmKDU1VbW1tdq8+cSDq5qaAwCrWPpU84ZERUUpKirK6jIAAAAQADIyMpSRkVFvvKkFGxZzAASagAveAAAAQHM0tWDDYg6AQGLZw9UAAAAAAOgICN4AAAAAAJiI4A0AAAAAgIkI3gAAAAAAmIjgDQAAAACAiQjeAAAAAACYiOANAAAAAICJCN4AAAAAAJiI4A0AAAAAgIkI3gAAAAAAmIjgDQAAAACAiQjeAAAAAACYiOANAAAAAICJCN4AAAAAAJiI4A0AAAAAgIkI3gAAAAAAmIjgDQAAAACAiQjeAAAAAACYiOANAAAAAICJCN4AAAAAAJiI4A0AAAAAgIkI3gAAAAAAmIjgDQAAAACAiQjeAAAAAACYiOANAAAAAICJCN4AAAAAAJiI4A0AAAAAgIkI3gAAAAAAmIjgDQAAAACAiQjeAAAAAACYiOANAAAAAICJCN4AAAAAAJiI4A0AAAAAgIkI3gAAAAAAmIjgDQBt0OLFi3XRRRepa9euGjlypMrKyqwuCQAAAI0geANAG7Njxw499thjevvtt1VcXKxevXpp0qRJVpcFAACARhC8AaCN2bp1qxISEnTllVfqoosu0uTJk7V9+3arywIAAEAjCN4A0MYMGDBAGzdu1NatW+VyufTqq6/qhhtusLosAAAANMJhdQEAgLMzYMAAjR8/XldeeaUkKTY2Vv/85z8bPNbj8cjj8Xj33W63X2oEAADAaax4A0Abk5+fr3feeUf//Oc/VVVVpTvvvFM333yzDMOod2xGRoa6d+/u3WJiYiyoGAAAoGMjeANAG/PXv/5Vd9xxh66++mp17dpVzz33nHbu3KnCwsJ6x6alpcnlcnm38vJyCyoGAADo2HipOQC0McePH1dlZaV3v6qqSocPH1ZtbW29Y51Op5xOpz/LAwAAwA8QvAGgjbnmmmv0i1/8Qn/605/Us2dPvfHGG+rZs6fi4uKsLg0AAAANIHgDQBtz++236/PPP9ecOXP0zTffaNCgQVq5cqU6d+5sdWkAAABoAMEbANoYm82mJ598Uk8++aTVpQAAAKAZeLgaAAAAAAAmIngDAAAAAGAigjcAAAAAACYieAMAAAAAYCJLg/fs2bOVnJzs3S8qKlJ8fLzCw8OVmpoqwzAsrA4AAAAAgB/PsuBdVFSk1157TXPmzJEkeTweJScna8iQISooKFBxcbFycnKsKg8AAAAAgFZhSfA2DENTp07Vww8/rL59+0qS8vLy5HK5lJWVpb59+yo9PV0LFiywojwAAAAAAFqNJcF7/vz52rZtm2JjY/Xuu+/q2LFjKiwsVEJCgkJCQiRJcXFxKi4ubvQaHo9HbrfbZwMAAAAAINA4/H3DQ4cO6fHHH9fFF1+s3bt3a/Hixfrd736n4cOHKzY21nuczWaT3W5XZWWlwsPD610nIyNDTz/9tF9qLn/5Hp/9mOmL/HJfAAAAAEDb5/cV75UrV+rw4cPauHGjnnjiCa1fv17fffed/vznP8vpdPocGxwcrOrq6gavk5aWJpfL5d3Ky8v9UT4AAAAAAGfF7yveu3fv1tChQxUREXGiAIdDcXFxKisrU0VFhc+xVVVVCgoKavA6TqezXlAHAAAAACDQ+H3FOyYmRjU1NT5jX375pV544QXl5+d7x8rKyuTxeLwBHQAAAACAtsjvwTsxMVElJSWaN2+edu/erZdeeknbtm3TjTfeKJfLpdzcXElSZmamRo4cKbvd7u8SAQAAAABoNX5/qXlERITee+89zZo1SzNnztT555+vpUuXql+/fsrOztaECROUmpqq2tpabd682d/lAQAAAADQqvwevCUpISFBH330Ub3xlJQUlZaWqqCgQMOHD1dkZKTfa/vmtcd89i944Hd+rwEAAAAA0H5YErybEhUVpaioKKvLAAAAAACgVfj9Pd4AAAAAAHQkBG8AAAAAAExE8AYAAAAAwEQEbwAAAAAATETwBgAAAADARARvAAAAAABMRPAGAAAAAMBEBG8AAAAAAExE8AYAAAAAwEQEbwAAAAAATETwBgAAAADARA6rC8Bpf19ws8/+zff+3aJKAAAAAACthRVvAAAAAABMRPAGAABAmzB69Gjl5ORIkoqKihQfH6/w8HClpqbKMAzvcU3NAYAVCN4AAAAIeG+++abWrVsnSfJ4PEpOTtaQIUNUUFCg4uJibyBvag4ArELwBgAAQED79ttvNWvWLF166aWSpLy8PLlcLmVlZalv375KT0/XggULzjgHAFbh4WoAAAAIaLNmzdLYsWNVU1MjSSosLFRCQoJCQkIkSXFxcSouLj7jXGM8Ho88Ho933+12m/FlAOjAWPEGAABAwNq0aZM2bNig3//+994xt9ut2NhY777NZpPdbldlZWWTc43JyMhQ9+7dvVtMTIw5XwyADovgDQAAgIB05MgRTZ06VXPnzlW3bt284w6HQ06n0+fY4OBgVVdXNznXmLS0NLlcLu9WXl7eul8IgA6Pl5oDAAAgID377LOKj49XYmKiz3hERISKiop8xqqqqhQUFNTkXGOcTme9sA4ArYngDQAAgIC0ZMkSVVRUKCwsTJJUXV2tZcuWqXfv3jp27Jj3uLKyMnk8HkVERCg+Pl5vvPFGg3MAYBVeag4AAICAtGXLFhUVFWnbtm3atm2bbrnlFj3zzDP68MMP5XK5lJubK0nKzMzUyJEjZbfbNWLEiEbnAMAqrHgDAAAgIEVHR/vsd+3aVT169FCPHj2UnZ2tCRMmKDU1VbW1tdq8ebOkE+//bmwOAKxC8AYAAECbkJOT4/3vlJQUlZaWqqCgQMOHD1dkZGSz5gDACgRvAAAAtElRUVGKioo66zkA8Dfe4w0AAAAAgIkI3gDQAR144y2f/Yp58+sds39eVrOutfuVe1ulJgAAgPaK4A0AAAAAgIkI3gAAAAAAmIjgDQAAAACAiQjeAAAAAACYiOANAAAAAICJCN4AAAAAAJiI4A0AAAAAgIkI3gAAAAAAmMhhdQFW2T/vBZ/986bNsqgSAAAAAEB7xoo3AAAAAAAmIngDAAAAAGAigjcAAAAAACYieAMAAAAAYCKCNwAAAAAAJiJ4AwAAAABgIoI3AAAAAAAmIngDAAAAAGAigjcAAAAAACYieAMAAAAAYCKCNwAAAAAAJiJ4AwAAAABgIoI3AAAAAAAmsiR4T58+XTabzbv169dPklRUVKT4+HiFh4crNTVVhmFYUR4AAAAAAK3GkuD96aefau3ataqsrFRlZaW2bt0qj8ej5ORkDRkyRAUFBSouLlZOTo4V5QEAAAAA0Gr8HryPHz+uoqIijRgxQmFhYQoLC1NoaKjy8vLkcrmUlZWlvn37Kj09XQsWLPB3eQAAAAAAtCq/B+/PPvtMhmHoiiuuUJcuXTR69Gh99dVXKiwsVEJCgkJCQiRJcXFxKi4u9nd5AAAAAAC0Kr8H7+LiYg0cOFBvvfWWiouL1blzZ02dOlVut1uxsbHe42w2m+x2uyorKxu8jsfjkdvt9tkAAAAAAAg0fg/eEydOVH5+vuLj4xUbG6tXXnlF69evV11dnZxOp8+xwcHBqq6ubvA6GRkZ6t69u3eLiYnxR/kAAAAAAJwVyz9OLCwsTHV1dTr//PNVUVHhM1dVVaWgoKAGz0tLS5PL5fJu5eXl/igXAAAAAICz4vfgPXPmTC1btsy7/8knn6hTp0667LLLlJ+f7x0vKyuTx+NRREREg9dxOp3q1q2bzwYAAAAAQKBx+PuGV1xxhR577DGdf/75On78uKZPn65JkybpxhtvlMvlUm5uru6++25lZmZq5MiRstvt/i4RAAAAAIBW4/fgfffdd6ukpERjxoxRaGioxo4dq/T0dDkcDmVnZ2vChAlKTU1VbW2tNm/e7O/yAAAAAABoVX4P3tKJB6NlZGTUG09JSVFpaakKCgo0fPhwRUZGWlAdAAAAAACtx5Lg3ZSoqChFRUVZXUZAW5Izqt7YhEnrLKgEAAAAAHAmlj/VHAAAAACA9ozgDQAAAACAiQjeAAAAAACYiOANAAAAAICJCN4AAAAAAJiI4A0AAAAAgIkI3gAAAAAAmIjgDQAAAACAiQjeANCGzZ49W8nJyVaXAQAAgCY4rC4AANAyRUVFeu2117R161arSwEAAEATWPEGgDbIMAxNnTpVDz/8sPr27Wt1OQAAAGgCwRsA2qD58+dr27Ztio2N1bvvvqtjx45ZXRIAAAAaQfAGgDbm0KFDevzxx3XxxRdr9+7dysrK0ogRI3TkyJF6x3o8Hrndbp8NAAAA/kXwBoA2ZuXKlTp8+LA2btyoJ554QuvXr9d3332n3NzcesdmZGSoe/fu3i0mJqbR61bMm2dm2V6fzvPPw+DezBnll/ugdYxf8anVJQAAYBqCNwC0Mbt379bQoUMVEREhSXI4HIqLi9OuXbvqHZuWliaXy+XdysvL/V0uAABAh8dTzQGgjYmJiVFNTY3P2Jdffqmf/vSn9Y51Op1yOp3+Kg0AAAANYMUbANqYxMRElZSUaN68edq9e7deeuklbdu2TaNHj7a6NAAAADSA4A0AbUxERITee+89LV68WJdcconmzJmjpUuXqnfv3laXBgAAgAbwUnMAaIMSEhL00UcfWV0GAAAAmoEVbwAAAAAATETwBgAAAADARARvAAAAAABMRPAGAAAAAMBEBG8AAAAAAExE8AYAAAAAwEQEbwAAAAAATETwBgAAAADARARvAAAAAABMRPAGAAAAAMBEBG8AAAAAAExE8AYAAAAAwEQEbwAAAAAATETwBgAAAADARARvAAAAAABMRPAGAAAAAMBEBG8AAAAAAEzksLqAjuDj7CSf/eH3vWtRJSdkLRnlsz9zwjqLKgEAAACA9o8VbwAAAAS0gwcP6uOPP9aBAwesLgUAWoTgDQAAgIC1dOlS9evXTw8++KAuuugiLV26VJJUVFSk+Ph4hYeHKzU1VYZheM9pag4ArEDwBgAAQED67rvvNH36dG3ZskVbt27V66+/rkcffVQej0fJyckaMmSICgoKVFxcrJycHElqcg4ArELwBgAAQECqqqrSnDlzNGjQIEnS5ZdfrsrKSuXl5cnlcikrK0t9+/ZVenq6FixYIElNzgGAVXi4GgAAAAJSTEyMJk6cKEk6duyYnn/+eY0bN06FhYVKSEhQSEiIJCkuLk7FxcWS1ORcYzwejzwej3ff7Xab8eUA6MBY8QYAAEBAKywsVM+ePbV+/XrNmTNHbrdbsbGx3nmbzSa73a7Kysom5xqTkZGh7t27e7eYmBhTvx4AHQ/BGwAAAAEtLi5OGzZs0MCBAzV58mQ5HA45nU6fY4KDg1VdXd3kXGPS0tLkcrm8W3l5uSlfB4COi+ANAACAgGaz2TR48GDl5ORo9erVioiIUEVFhc8xVVVVCgoKanKuMU6nU926dfPZAKA1EbwBAAAQkDZu3KjU1FTvvsNx4vFE/fv3V35+vne8rKxMHo9HERERio+Pb3QOAKxC8AYAAEBA6t+/v15//XVlZ2ervLxcs2fP1o033qjExES5XC7l5uZKkjIzMzVy5EjZ7XaNGDGi0TkAsArBGwAAAAHpwgsv1N/+9jfNmTNHAwcOVHV1tRYvXiyHw6Hs7GxNmzZNPXv21PLly5WZmSlJTc4BgFX4ODEAAAAErFGjRjX4cWApKSkqLS1VQUGBhg8frsjIyGbNAYAVCN4AAABok6KiohQVFXXWcwDgb5a/1Hz06NHKycmRJBUVFSk+Pl7h4eFKTU2VYRjWFgcAAAAAwI9kafB+8803tW7dOkmSx+NRcnKyhgwZooKCAhUXF3sDOQAAAAAAbZVlwfvbb7/VrFmzdOmll0qS8vLy5HK5lJWVpb59+yo9PV0LFiywqjwAAAAAAFqFZe/xnjVrlsaOHauamhpJUmFhoRISEhQSEiJJiouLa/BBGqd4PB55PB7vvtvtNrdgAAAAAABawJIV702bNmnDhg36/e9/7x1zu92KjY317ttsNtntdlVWVjZ4jYyMDHXv3t27xcTEmF43AAAAAABny+/B+8iRI5o6darmzp2rbt26eccdDoecTqfPscHBwaqurm7wOmlpaXK5XN6tvLzc1LoBAAAAAGgJv7/U/Nlnn1V8fLwSExN9xiMiIlRUVOQzVlVVpaCgoAav43Q66wV1AAAAAAACjd+D95IlS1RRUaGwsDBJUnV1tZYtW6bevXvr2LFj3uPKysrk8XgUERHh7xIBAAAAAGg1fg/eW7Zs0fHjx737v/71r5WQkKBJkyZpwIABys3N1d13363MzEyNHDlSdrvd3yUCAAAAANBqWiV4G4ahurq6ZoXk6Ohon/2uXbuqR48e6tGjh7KzszVhwgSlpqaqtrZWmzdvbo3yACDgnU0fBYC2jp4HoKM564erPfDAAz4f4yVJGzdu1IABA1pUQE5OjiZNmiRJSklJUWlpqbKzs1VSUqKBAwe26JoAEMhau48CQCCj5wFAC4L366+/Xq95Dhw4UF999VWrFBQVFaUxY8YoMjKyVa4HAIHG7D4aSEpeHdOs4/6RnXTGY/IW3Nzo3IqFo5tdU6C46e3pVpcgSUpa/herS0A715F6HgA0ptkvNc/NzZV04qVBS5YsUUhIiHf/v/7rv3TVVVeZUyEAtBP0UQAdCT0PAE5rdvBeuHChJMlms+nNN9+Uw3Hi1E6dOqlfv3566623zKkQANoJ+iiAjoSeBwCnNTt4b9q0SdKJZrl27Vp169bNtKIAoD2ijwLoSOh5AHDaWb/He+rUqXI6nWbUAgAdAn0UQEdCzwOAFnyc2Ny5c+XxeFReXi7DMHzmLrroolYrDADaK/oogI6EngcALQjer7zyilJTU3X06FGf5mmz2VRbW9uqxQFAe0QfBdCR0PMAoAUvNf/tb3+rP/zhDzpy5Ijq6uq8G40TAJqHPgqgI6HnAUALgne3bt307//+7+rcubMZ9QBAu0cfBdCR0PMAoAXB++WXX9Z9992noqIiM+oBgHaPPgqgI6HnAUAL3uP90EMP6eDBg7r88ssVHh7u89EQO3fubNXiAKA9oo8C6EjoeQDQguCdk5NjQhkA0HHQRwF0JPQ8AGhB8I6NjTWjjnZh67xkn/3B096xqBIAgYw+CqAjoecBQAuCd+/evWWz2bwfB2Gz2bxzPJ0SAM6MPgqgI6HnAUALHq526uMf6urqdPjwYW3atEnXX3+9NmzYYEZ9ANDu0EcBdCT0PABowYr393Xp0kUjRozQmjVrNGLECH366aetVRcAdAj0UQAdCT0PQEd11iveDdm/f7+++eab1rgUAHRI9FEAHQk9D0BH06KHq/3wvTnffPONHn744dasCwDaLfoogI6EngcArfBxYjabTdHR0erTp09r1YTvWblwtM/+uMnvWVQJgNZCHwXQkdDzAKAFLzW/7rrrdN1116lLly46cOCAunTpQuMEgLNAHwXQkdDzAKAFK9579uzRmDFjVFpaqgsvvFBff/21LrnkEq1evVoXXnihGTUCQLtCHwXQkdDzAKAFK95Tp07VVVddpYqKCpWUlGjfvn268sor9ctf/tKM+gCg3aGPAuhI6HkA0IIV73/84x/67LPPFBQUJEkKDg7WY489pri4uFYvDgDaI/oogI6EngcALVjxvuyyy7Ro0SKfsUWLFmnQoEGtVhQAtGf0UQAdCT0PAFqw4j137lyNGjVKb775pmJjY7Vz505VVVVp/fr1ZtQHAO0OfRRAR0LPA4AWBO9BgwZp+/bteuedd1ReXq5JkyYpMTFR55xzjhn1AUC7Qx8F0JHQ8wCgBS81Ly4u1rXXXiu73a7U1FQ9++yzGjp0qLZv325GfQDQ7tBHAXQk9DwAaOFTzX/2s5/pxhtvlCTl5+crKSlJ06ZNa/XiAKA9oo8C6EjoeQDQgpeab9u2TcuWLVP37t0lSeecc46mT5+uAQMGtHpxANAe0UcBdCT0PABo4VPNFy9e7DO2ePFiDRw4sNWKAoD2jD4KoCOh5wFAC1a8X331Vd10001atGiRevfurV27dqmyslLvvfeeGfUBQLtDHwXQkdDzAKAFwXvw4MEqLS3Vu+++q927d+uuu+5SYmKiQkNDzagPANod+iiAjoSeBwAtCN6SFBoaqjvvvLO1awGADoM+CqAjoecB6OjO+j3eAAAAAACg+QjeAAAAAACYiOANAAAAAICJCN4AAAAAAJiI4A0AAAAAgIkI3gAAAAAAmIjgDQAAAACAiQjeAAAAAACYiOANAAAAAICJHFYX0FFteCPRZ//fp6y1qBIAAAAAgJlY8QaANmz06NHKycmxugwAAAA0geANAG3Um2++qXXr1lldBgAAAM6A4A0AbdC3336rWbNm6dJLL7W6FAAAAJwB7/EGgDZo1qxZGjt2rGpqaqwuBQAAAGfAijcAtDGbNm3Shg0b9Pvf//6Mx3o8Hrndbp8NAAAA/kXwBoA25MiRI5o6darmzp2rbt26nfH4jIwMde/e3bvFxMT4oUr/WP3nm+qNLVs42pR7pS8d5bP/xDJz7vNDN696rt5Y4soXmn1+4or5rVkOAABoIcuC98GDB/Xxxx/rwIEDVpUAAG3Os88+q/j4eCUmJp75YElpaWlyuVzerby83OQKAQAA8EOWBO+lS5eqX79+evDBB3XRRRdp6dKlkqSioiLFx8crPDxcqampMgzDivIAIGAtWbJEq1evVlhYmMLCwrRkyRI98MADeuCBBxo83ul0qlu3bj4bAAAA/Mvvwfu7777T9OnTtWXLFm3dulWvv/66Hn30UXk8HiUnJ2vIkCEqKChQcXExn00LAD+wZcsWFRUVadu2bdq2bZtuueUWPfPMM3rmmWesLg0AAACN8PtTzauqqjRnzhwNGjRIknT55ZersrJSeXl5crlcysrKUkhIiNLT0/Xggw9q8uTJ/i4RAAJWdHS0z37Xrl3Vo0cP9ejRw6KKAAAAcCZ+D94xMTGaOHGiJOnYsWN6/vnnNW7cOBUWFiohIUEhISGSpLi4OBUXF/u7PABoU3hlEAAAQOCz7HO8CwsL9dOf/lRBQUH6v//7Pz377LOKjY31zttsNtntdlVWVio8PLze+R6PRx6Px7vPR+QAAAAAAAKRZU81j4uL04YNGzRw4EBNnjxZDodDTqfT55jg4GBVV1c3eH57/ogcAAAAAED7YVnwttlsGjx4sHJycrR69WpFRESooqLC55iqqioFBQU1eD4fkQMAAAAAaAv8Hrw3btyo1NRU777DceLV7v3791d+fr53vKysTB6PRxEREQ1eh4/IAQAAAAC0BX4P3v3799frr7+u7OxslZeXa/bs2brxxhuVmJgol8ul3NxcSVJmZqZGjhwpu93u7xIBAAAAAGg1fg/eF154of72t79pzpw5GjhwoKqrq7V48WI5HA5lZ2dr2rRp6tmzp5YvX67MzEx/lwcAAAAAQKuy5Knmo0aNavCjwlJSUlRaWqqCggINHz5ckZGRFlQHAAAAAEDrsezjxBoTFRWlqKgoq8tok/686Eaf/V/cs96iSgAAAAAAp1j2VHMAAAAAADoCgjcAAAAC1urVq9WnTx85HA4NHTpUJSUlkqSioiLFx8crPDxcqampMgzDe05TcwBgBYI3AAAAAtKOHTs0efJkZWZmas+ePerVq5emTJkij8ej5ORkDRkyRAUFBSouLlZOTo4kNTkHAFYheAMAACAglZSUKD09Xbfddpt69uyp+++/XwUFBcrLy5PL5VJWVpb69u2r9PR0LViwQJKanAMAqwTcw9UAAAAASUpKSvLZ//zzz9WvXz8VFhYqISFBISEhkqS4uDjvJ+Y0NdcYj8cjj8fj3Xe73a35ZQAAwbu9m/uXUT779/98nUWVAAAAtNzRo0f1/PPP65FHHtHOnTsVGxvrnbPZbLLb7aqsrJTb7W50Ljw8vMFrZ2Rk6Omnnzb9awDQcfFScwAAAAS8xx9/XF27dtV9990nh8Mhp9PpMx8cHKzq6uom5xqTlpYml8vl3crLy035GgB0XKx4AwAAIKC9//77mjdvnvLz89W5c2dFRESoqKjI55iqqioFBQU1OdcYp9NZL6wDQGtixRsAAAABa+fOnZo4caLmzp2rAQMGSJLi4+OVn5/vPaasrEwej0cRERFNzgGAVQjeAAAACEg1NTVKSkpSSkqKxowZo0OHDunQoUO69tpr5XK5lJubK0nKzMzUyJEjZbfbNWLEiEbnAMAqvNQcAAAAAWndunUqKSlRSUmJ5s+f7x3ftWuXsrOzNWHCBKWmpqq2tlabN2+WJDkcjkbnAMAqBG8AAAAEpJSUFBmG0eBc7969VVpaqoKCAg0fPlyRkZE+5zU2BwBWIHgDAACgTYqKilJUVNRZzwGAv/EebwAAAAAATETwBgAAAADARARvAAAAAABMRPAGAAAAAMBEBG8AAAAAAExE8AYAAAAAwEQEbwAAAAAATETwBgAAAADARARvAAAAAABMRPAGAAAAAMBEDqsLQGB47q+j6o09fvs6CyoBAAAAgPaFFW8AAAAAAExE8AYAAAAAwEQEbwAAAAAATETwBgAAAADARARvAAAAAABMRPAGAAAAAMBEBG8AAAAAAExE8AYAAAAAwEQEbwAAAAAATETwBgAAAADARARvAECzffPaE5Kkr19L1Z5XZ7T4OgWvJ7dWSWeUmzPKb/c6k5tW333y12lnPPbmVc80Ope4MkuJK+c0MP5as2tJWpGrpOWLm338D92yfE2Lzhu7YkuL79lcf1q11/R7fN//Ltjv1/sBANoegjcAAAAAACZyWF0AAttvlo/22f/D+PcsqgQAAAAA2iZWvAEAAAAAMBHBGwAAAAAAExG8AQAAAAAwEcEbAAAAAAATEbwBAAAAADARwRsAAAAAABMRvAEAAAAAMBHBGwAAAAAAExG8AQAAAAAwEcEbAAAAAAATEbwBAAAAADCRw+oC0PZMXjXaZ3/h2PcaPO6mtx+pN5aX8idTagIAAACAQMWKNwAAAAAAJrIkeK9evVp9+vSRw+HQ0KFDVVJSIkkqKipSfHy8wsPDlZqaKsMwrCgPAAAAAIBW4/fgvWPHDk2ePFmZmZnas2ePevXqpSlTpsjj8Sg5OVlDhgxRQUGBiouLlZOT4+/yAAAAAABoVX4P3iUlJUpPT9dtt92mnj176v7771dBQYHy8vLkcrmUlZWlvn37Kj09XQsWLPB3eQAAAAAAtCq/P1wtKSnJZ//zzz9Xv379VFhYqISEBIWEhEiS4uLiVFxc3Oh1PB6PPB6Pd9/tdptTMAAAAAAAP4KlD1c7evSonn/+eT3wwANyu92KjY31ztlsNtntdlVWVjZ4bkZGhrp37+7dYmJi/FU2AAAAAADNZmnwfvzxx9W1a1fdd999cjgccjqdPvPBwcGqrq5u8Ny0tDS5XC7vVl5e7o+SAQAAAAA4K5Z9jvf777+vefPmKT8/X507d1ZERISKiop8jqmqqlJQUFCD5zudznpBHQAAAACAQGPJivfOnTs1ceJEzZ07VwMGDJAkxcfHKz8/33tMWVmZPB6PIiIirCgRAAAAAIBW4ffgXVNTo6SkJKWkpGjMmDE6dOiQDh06pGuvvVYul0u5ubmSpMzMTI0cOVJ2u93fJQIAAAAA0Gr8/lLzdevWqaSkRCUlJZo/f753fNeuXcrOztaECROUmpqq2tpabd682d/lAQAAAADQqvwevFNSUmQYRoNzvXv3VmlpqQoKCjR8+HBFRkb6uToAAAAAAFqXZQ9Xa0xUVJSioqKsLgMAAAAAgFZh6ceJAQAAAADQ3hG8AQAAAAAwEcEbAAAAAAATEbwBAAAAADARwRsAAAAAABMRvAEAAAAAMBHBGwAAAAAAExG8AQAAAAAwEcEbAAAAAAATEbwBAAAAADARwRsAAAAAABM5rC7AHyrmzffZj5z2S4sqAQAAAAB0NKx4AwAAAABgIoI3AAAAAAAmIngDAAAAAGAigjcAtEGrV69Wnz595HA4NHToUJWUlFhdEgAAABpB8AaANmbHjh2aPHmyMjMztWfPHvXq1UtTpkyxuiwAAAA0okM81RwA2pOSkhKlp6frtttukyTdf//9Gj16tMVVAQAAoDEEbwBoY5KSknz2P//8c/Xr18+iagAAAHAmBG8AaMOOHj2q559/Xo888kiD8x6PRx6Px7vvdrv9VRoAAABOIngDQBv2+OOPq2vXrrrvvvsanM/IyNDTTz99VtfcP+9lnTdtuiRp39w/SKpTz/tnN3jsnlcfbNY1P5t7iy67f43P2P+8nqyrp76j/84+vYK/eX6irvvl2mbXuurPN2nsL/IkScsXnv3L7ectHqVpd63z7r/05ijV2aSHJ6zTC2+N0qw71+n3S0c161rTV4xWnU16ddx7kqSJb49WjU06KqnW1kV5t6xq8Lyb356lv6e80Kx7JK76o37s41mSVuTo3Vsnnd05y5fr3fHjm3XsmOXrtHr8KKUsf19vj7+hwWPGrfhIK2+9psnr/MeKIv3t1kG6bcX/admt/XX7yh2yya6l43p7j5m1ardeGBvd6DVeW7VPD4zt2ay6JWntsgNKvK2Hd/+/llRo5IRISdKHf6nQiJ9H6qPcCl1zd2S9c7e+sV+Dp5zn3S+Zu0//dn/z792QvVklOn/mvzX7+H0v/UM9H/rJj7onAHzf737evN5vhsf+styye5uBh6sBQBv1/vvva968eVqyZIk6d+7c4DFpaWlyuVzerby83M9VAgAAgBVvAGiDdu7cqYkTJ2ru3LkaMGBAo8c5nU45nU4/VgYAAIAfIngDQBtTU1OjpKQkpaSkaMyYMTp06JAk6ZxzzpHNZrO4OgAAAPwQLzUHgDZm3bp1Kikp0fz58xUaGurdvvzyS6tLAwAAQAMI3gDQxqSkpMgwjHpb7969rS4NAExx8OBBxcbGqqyszDtWVFSk+Ph4hYeHKzU1VYZhNGsOAKxA8AYAAEDAOnDggJKSknxCt8fjUXJysoYMGaKCggIVFxcrJyfnjHMAYBWCNwAAAALWHXfcoTvuuMNnLC8vTy6XS1lZWerbt6/S09O1YMGCM84BgFUI3gAAAAhY2dnZmjFjhs9YYWGhEhISFBISIkmKi4tTcXHxGeca4/F45Ha7fTYAaE0EbwAAAASsPn361Btzu92KjY317ttsNtntdlVWVjY515iMjAx1797du8XExLTuFwGgwyN4AwAAoE1xOBxyOp0+Y8HBwaqurm5yrjFpaWlyuVzerby83JS6AXRcfI43AAAA2pSIiAgVFRX5jFVVVSkoKKjJucY4nc56YR0AWhMr3gAAAGhT4uPjlZ+f790vKyuTx+NRREREk3MAYBWCNwAAANqUESNGyOVyKTc3V5KUmZmpkSNHym63NzkHAFbhpeYAAABoUxwOh7KzszVhwgSlpqaqtrZWmzdvPuMcAFiF4I1WcdPqO33288a8ZVElAACgPTIMw2c/JSVFpaWlKigo0PDhwxUZGdmsOQCwAsEbAAAAbVJUVJSioqLOeg4A/I33eAMAAAAAYCKCNwAAAAAAJiJ4AwAAAABgIoI3AAAAAAAmIngDAAAAAGAigjcAAAAAACYieAMAAAAAYCKCNwAAAAAAJiJ4AwAAAABgIoI3AAAAAAAmIngDAAAAAGAigjcAAAAAACayLHgfPHhQsbGxKisr844VFRUpPj5e4eHhSk1NlWEYVpUHAAAAAECrsCR4HzhwQElJST6h2+PxKDk5WUOGDFFBQYGKi4uVk5NjRXkAAAAAALQaS4L3HXfcoTvuuMNnLC8vTy6XS1lZWerbt6/S09O1YMECK8oDAAAAAKDVWBK8s7OzNWPGDJ+xwsJCJSQkKCQkRJIUFxen4uJiK8oDAAAAAKDVOKy4aZ8+feqNud1uxcbGevdtNpvsdrsqKysVHh5e73iPxyOPx+NzPgAAAAAAgSZgnmrucDjkdDp9xoKDg1VdXd3g8RkZGerevbt3i4mJ8UeZAAAAAACclYAJ3hEREaqoqPAZq6qqUlBQUIPHp6WlyeVyebfy8nJ/lAkAAAAAwFmx5KXmDYmPj9cbb7zh3S8rK5PH41FERESDxzudznor5AAAAAAABJqAWfEeMWKEXC6XcnNzJUmZmZkaOXKk7Ha7xZUBAAAAANByAbPi7XA4lJ2drQkTJig1NVW1tbXavHmz1WUBAAAAAPCjWBq8DcPw2U9JSVFpaakKCgo0fPhwRUZGWlQZAAAAAACtI2BWvE+JiopSVFSU1WUAAAAAANAqAuY93gAAAAAAtEcEbwAAAAAATETwBgAAAADARARvAAAAAABMRPAGAAAAAMBEAfdUc7R/N6960mf/72OftqgSAAAAADAfwRsAOrCKeQsl1X5vf26Dx+2d+5zOv//xJq/11UvjddFDy7Xz5RTV2gzVSZLt9Hzh3FtUZzMaPX/L/CRJ0gfzE1Vnk342Za3+642bVWeTTp319wU3q85mKOkXed7zVi4cXe9ab+WMkiT95eSvkrRw0Y2afM96LcgdpTpJxvdqe/Uvo/Tgz9d59/+0ZJRP7ZL0u7+OUq33vBOTs/82WsdtUt33jv3lqtGaP/a9ejXdtPo2ScG+Y2/PkE0O3fx2qiSH/p6SoZtX/VYnXpB2+kVpN6/K1N/Hzq53TUlKXPmS1o57SIkrX5VkU+LKuZLRSWtvnXpifsUbkmyyyXayblu9ayQtf/Pkf3XSu+PvVNLypafvb9gkm03Jy1fonfG3Knn5297r3bL8He8114xP1Jjl70myaczy9SfvJ6Us36i3x/9MY1d8cPKap+8/bkW+Vt6aoFtXfCKbOmn8iv+V1EnLb71CknTbihJJNt2+stTn+zF15VcKtnWSQ9J/rtoju2wKkvTE2Av1h1XfqLNsenHVXnWWTfNW7pNDNk0Zd54WrayQwzhxJbtsJ341pLHje2jN3w7ILunvfz0guyGNuqOH934fvFmhTpK2LK7wVvHPnP0aOuk8Ffx5v3fsX/P3K+6X5+n/zdunTpI+f22fOtVJNkOy1xmKnXG+vsraK3utIZsh2U78SZTNVqvzU3tp7/M7JJ08QXWSTdqbVaTzZw7Svj8V+sz1fPgq7Xvxn+o5Y6j2vfjf3uP3vfShej40Qvtf3qTzpv9U+1/e4HPeeb8arf2vrNV5v0rU/lfX6MTfrpNzD47T/tf+Jum4Dh053OCfNwBAy/BScwAAAAAATETwBgAAAADARARvAAAAAABMRPAGAAAAAMBEBG8AAAAAAExE8AYAAAAAwEQEbwAAAAAATETwBgAAAADARARvAAAAAABMRPAGAAAAAMBEDqsLACTp5lW/99n/+9hHLaoEAAAAAFoXK94AAAAAAJiI4A0AAAAAgIkI3gAAAAAAmIjgDQAAAACAiQjeAAAAAACYiOANAAAAAICJ2t3HiR1446/ydOni3Y+8/+cWVgN/SVqxwGf/3VvvtagSAAAAAPDFijcAAAAAACYieAMAAAAAYCKCNwAAAAAAJiJ4AwAAAABgIoI3AAAAAAAmIngDAAAAAGCidvdxYgAAAEBrGpKaa9m9P/3j3ZbdG0DrYcUbAAAAAAATEbwBAAAAADARLzUHAAAA0KquefkaS+770fSPLLkvcCaseAMAAAAAYCJWvBGwEle+6LO/dtwMJa6YV++4tbdO81dJGrN8nc/+6vGj/HZvAAAAAG0TK94AAAAAAJiIFW8AAAAAsNArs96x7N6/eiHZsnv/GCW/22jJff/tsZ+16DxWvAEAAAAAMBHBGwAAAAAAExG8AQAAAAAwEe/xRoeStHypz/674+/40dccu2KTz/6qW396VuffvmK7z/5fb72kweMyV33jsz977AWNXvOvKw743uPWHg0et/HNCp/9n02MbPSabcX+V/7us3/er262qBIAAADgBFa8AQAAAAAwEcEbAAAAAAATEbwBAAAAADARwRsAAAAAABMRvAEAAAAAMBFPNUe7lbR8sc/+u+PvavC45OUr6o29M/5W3bJ8jc/YmvG3NPve41b8d72xlbcO0/gVW33Glt86uMHzH1pV7rP/0tiYRu+VvXK/z/59485r8Lh3l/k+6TzptoafdC5J+Yt8n3aecE+kCuf73ufyX56n0lf2+Yxd/Kue2vNH36evR6VeoL3P76x3j/N/3Ud7s/6f79jMgdo351OfsZ4PD9G+Fz/yHZtxjfa/vKHeNc+b/u8Nfj37X13psx9818gGjwMAAADMwIo3AAAAAAAmCrjgXVRUpPj4eIWHhys1NVWGYVhdEgAEHHolADSNPgkgkARU8PZ4PEpOTtaQIUNUUFCg4uJi5eTkWF0WAAQUeiUANI0+CSDQBFTwzsvLk8vlUlZWlvr27av09HQtWLDA6rIAIKDQKwGgafRJAIEmoB6uVlhYqISEBIWEhEiS4uLiVFxc3OCxHo9HHo/Hu+9yuSRJVUdqfI5zut2qqmlo7IjPWLDbfeL8Go/P+Dlut6pqjvqMud1uHao51qwxSTrcwHhDY9UNjh0/49ip8ZoGjm1o7Ej1mcdOjXsaOPZoA2PHq+vXfrza93t5avzYD8ZPjB1p5pjv72Vj442PVZ9xrOljD7do7PT4oWaNHa2uqjd2pN7YOZKkmnrjwaquNxbU4NjhemNOSdLhmvrjh+qNBTcw1kVVR+rX+cMxSQpxu1V15NAZx7q43ao6crj+WE3973Gw262qmuozjh09+Xezrb7ssLV6pdvbH2slGd5fDR0/+X07IsM4LqlOho6f+P2p8Zzsix4ZxlFJtTKMoyeudeTYyWseU53NUJ2kOtvp/nhi/8S4YZPqdLof1nrHDBnfO+9wzTHV2U5Ud2o7NVddc/zktYzTc/Kd0/fGamqOe3/9YQ2n5o5UH/fe79R9jlQf99Z3+lebt0cet5049vjJc47aTv3dPq5jNumYpDrbsRMXVaeT/fGoZBiSbCe/750k1X6vR3Y6OdfJ2w+9fdFobK7m5LhNMjrVG7OdmjtZ+7HqmhNfjGzf+xNz6rxqef9t3rBJthPnn57zvd7pax72ud+psdNznU7OdfrB3CHZ6n3Nh2ST/cTxtpO/yu7tkTZbJ9VKkmyyy+b9vTxSXaXak1c7Lps6GZJDNrndwaqprpLdOFGF/eQxduN0j7Qbks2QOhmne6Tb7dTh6qoT1XnnnDpcU+Xtg51OnnfiWqfHOhlSp7oTfzjthiG3O0RVR6pkrzVkM3SyakM2W+3J/ld14mDbyT/NthN/L0/3xjrv3KneeLpH/mCu5vDJv8e+c6d64uneePpvz+mx4zrkOfH/0I7QJ6XGe+Wpn+VqPfV//vCXUzU0pjwzwU+V+IqZnd/k/PEGfl71hzN9vw4ft6Yuqenaajz1fx71l6bqOnLsWKNzZjvT7+WhI/V/FvSH79d16r+b1SuNADJz5kzjgQce8Bnr0aOH8e2339Y79sknn/z+z2FsbGxsZ72Vl5f7q721KnolGxubv7aO0CcNg17Jxsb247bm9MqAWvF2OBxyOp0+Y8HBwaqurlZ4eLjPeFpammbOnOndr6ur07fffqtzzz1XNptNANAYwzBUVVWlCy+80OpSWoReCcBsHalPSvRKAC1zNr0yoIJ3RESEioqKfMaqqqoUFBRU71in01mvoYaFhZlZHoB2pHv37laX0GL0SgD+0FH6pESvBNByze2VAfVwtfj4eOXnn36/SFlZmTwejyIiIiysCgACC70SAJpGnwQQaAIqeI8YMUIul0u5ubmSpMzMTI0cOVJ2u93iygAgcNArAaBp9EkAgcZmGIH1uMq3335bEyZMUGhoqGpra7V582YNHDjQ6rIAIKDQKwGgafRJAIEkoFa8JSklJUWlpaXKzs5WSUkJDbKd+uCDD9S7d2+/nPvUU09p0qRJLboXEKjolfi+QOiLOTk5uv7661v1msCPQZ9ERzRp0iQ99dRTVpeBBgTUw9VOiYqKUlRUlNVlIED95Cc/0b/+9a9WvabNZtOuXbta/I8BgBXolTiFvgg0jD6Js0Hfg5kCbsUbOBOHw6Fu3bpZXQYABAz6IgAAgY3gDUutWbNGvXr1Unh4uF566SVJ0ieffKKhQ4eqe/fuGjdunFwul885jb2kcuPGjYqNjVVUVJR+85vfKCYmRmvWrPHOP/PMMwoLC1OvXr20ZcsWSVL//v29n88ZGxsrm82mpUuXnrFum82mGTNm6LzzzlNmZqauueYaxcTEqLy8vKXfCgAdXP/+/bVx40a9/fbbstlsOnTokFJTU/XQQw+1ib74ffv27VNsbKwWLlzoHXvrrbd0/vnn6+KLL1ZqaqrOO+88FRYWntV1AbQ9OTk5uvrqqzVmzBh1795do0eP1jfffCOp6Z/5rr/+euXk5CgrK0u9evXy6V0bNmxQXFycQkNDddNNN2n37t3euffee0+XXXaZwsLCNGXKFHk8Hkmn32LTkr43b948xcTEKDQ0VCkpKaqqqvLONdbbDMPQH//4R/Xq1UsXXHCBXnzxxTN+rz744ANFR0fr5z//uS644AK9/vrr6tWrl66//noZhqHjx4/r/vvvV0REhCIjI/Wf//mfzfo9OHbsmH7zm9/oggsuUO/evbVs2bJmnYdWZgAW2LRpk9G1a1dj2LBhxmeffWa8+OKLRlBQkPH1118b5557rvH0008bX375pTFq1Cjj3nvvrXdur169fMbq6uqMCy+80Fi8eLGxadMm45xzzjG2b99uuN1u48knnzQiIyONu+66y9ixY4dx5513Gtdee61hGIbhdruNyspKQ5JRWFhoVFZWGkePHj1j/ZKMX//618bs2bONzp07Gx9++KHRr18/4y9/+UurfY8AdCx33nmnMXfuXCMjI8O45pprjIKCAmPMmDFGVlZWm+iLCxcuNK677jrj8OHDxlVXXWU899xz3rnKykqja9euxqZNm4zFixcbPXv2NL755hujpqbmx3/jAAS0hQsXGpKMjIwMY+fOncYtt9xi3HLLLUZlZWWTve26664zEhISjMTERGPdunVGRUWFYRiGsWvXLiMkJMRYuHChUV5ebtxxxx3GmDFjDMMwjC+++MIICgoyFixYYHzxxRfGFVdcYTz77LOGYRgt7nv/+te/DLvdbrz//vtGeXm5MWzYMCMzM9MwjKZ7W25urhEeHm58/PHHxscff2x07drV2LJlS5Pfq02bNhmSjJUrVxojRowwLrnkEuPjjz82JBm7d+82Xn75ZeOiiy4ytm/fbvzrX/8yunXrZuTn5/tc45577jGefPJJn7FnnnnG6NOnj/HZZ58Za9asMZxOp7Fz586W/YaixVjxhmUOHTqkuXPnatCgQZo2bZqOHj2q9evXq3PnznriiSd00UUX6ZFHHvH5F87GVFRU6Ouvv9Ztt92m66+/XqGhoTpw4IBCQ0MlSXa7XdnZ2erTp48mTZrkXZkODQ1VWFiYJKlbt24KCwtT586dm1X/vffeq0svvVRXXnmlrr32WkVFRenYsWMt+2YA6PAGDx6s7du36/PPP1dSUpI+//xzlZaWyu12t5m+WFdXpzvvvFMHDx7UY4895h3fvn27QkNDdf311+s//uM/tG/fPhmGoeDg4LP8LgFoi6Kjo/Xoo48qNjZWTz31lNauXat33333jL3t0KFDWrVqlW688Ub16NFDkrRkyRKNGDFCkyZNUnR0tP74xz9qypQpkk6sPg8ePFi/+MUv1LdvX02bNs3nmi3pexdffLH27t2r+Ph4lZSUyDAMbd++XVLTvW3RokW67777NGzYMA0bNkxJSUnN6t09e/bU2LFjFRsbq7Fjx2rYsGGSTqxa33333frss88UEhKikpISOZ1Oby1NWbRokVJTUzVo0CAlJydr8ODBysvLO+N5aF0B+XA1dAzh4eG6/PLLJUlBQUGSpL1796qiokLh4eGSTvwQV1VVpSNHjjT5A9q5556rsLAw/fd//7eio6PlcrnUr18/7/ywYcO85wcFBclohU/RO3U9fnAE0BoGDx6szZs36+jRo5oyZYry8vK0Z88eBQcHt5m++I9//EOJiYkKCQnR6tWrNWbMGElSr169VFlZqR07dmj37t2KiIhQz549f/T9ALQN0dHR3pdyR0VFqba2Vnv27Dljb5s2bVq9f/jbvXu3z1troqOjFR0dLUnas2eP/vd//9cboo8fP66uXbt6j21J36upqdGUKVO0efNmDR48WA6HQ7W1tZKa7m179uzRxx9/rHnz5kmSjhw5opSUlDPe7/t9/Yc9fteuXZo0aZL27t2rYcOGqWvXrt5amrJnzx79+te/1uzZsyVJ1dXVuu666854HloXwRuWaehBQMePH9dVV13lfV+NYRhyuVxnXG2pq6vTkCFDdPPNN+v48ePKzMxUZGRkk/f6PpvN1io/dAJASw0ePFglJSWKjY3VJZdcohkzZqhfv36Kjo5uM32xb9++WrZsmdauXau0tDQlJSXJbrcrODhY/fv318CBA2W327Vw4UJ16sSL7oCO4quvvlJdXZ06deqkr776Sg6Ho1m97Zxzzql3rZiYGG3evNm7v337dt1+++369NNPFR0drVtuuUXPP/+8JKm2tlbV1dXeY1vS91588UVVVFRo3759CgoK0m9+8xvt379fkprsbdHR0br33ns1fvx4SZLH4/EuNLXUjBkzdMMNN+gPf/iDJOnqq69u1nnR0dF69tlnlZCQIOnEPybwQE7/4/96CCiJiYn68ssv9T//8z+y2+1aunSpRo8efcYf/rZs2aJvv/1WBQUF+uqrr/TII4+c1X379euntWvXas+ePfrwww9/zJcAAC1y7rnn6tixY+rRo4ciIyO1Y8cOXXnllW2qL0ZFRalLly669dZb5XQ6vQ9XW7FihaKiorR161aVl5frtttuO6taALRtX3/9tTIyMrRr1y4988wzGjNmTIt725133qktW7YoJydH5eXleu6553TeeeepU6dO3rnS0lJJJ0Lz5MmTm11nQ33v0KFDMgxDBw4c0JIlSzR37lxvjU31tnvuuUdvvfWWqqqqVF1drfvuu0+vvvrq2X7rfBw6dEjHjh3T7t279dvf/laffPJJs/6B9J577lFOTo6OHTumgwcPaty4cVq1atWPqgVnj+CNgBIWFqY1a9bohRdeUP/+/bVq1SqtWbNGDkfTL864+uqrVVFRoZ/85Ce64IIL1K1bNz3zzDPNvu+8efM0Z84c9evXT6+//vqP/TIAoEUGDx6sSy65RNKJHwCvvPLKNtkXbTabnn76aT311FOqqanRDTfcoI8++kjDhw9Xjx491KNHD73xxhtndU0AbVdCQoK2bt2qK664QkePHtUrr7zS4t7Wu3dvrV69WllZWRo4cKC+++477z/y9enTR4sWLdLMmTM1cOBAFRUV6a233mp2nQ31vRkzZsgwDF1yySVauHCh7r33Xm3btk2SmuxtEydO1O23367ExEQNHz5csbGxZ9WDG5KZmanVq1crLi5Oe/fu1Q033KCtW7ee8bxHH31Ul112ma699lqNHj1aiYmJuv/++39ULTh7NoPX16IdeOKJJ7R792797ne/U1BQkN5//3396le/0sGDB60uDQAsEUh98a677lKvXr00ffp02Ww25ebm6q233tKnn37q91oA+FdOTo5ycnL0wQcfWF1Kq6O34Wyw4o12ISUlRSUlJbrkkksUHR2tjIwM78MsWuIf//iHwsLCGtxmzpzZipUDgDkCqS9OnDhR77zzjmJjY9W7d28tX75cL7zwQotrAYBA0JLelpmZ2WgvXblypZ8qhxVY8QYacOTIEe3du7fBudDQUJ177rl+rggArEVfBIAf77vvvtN3333X4FxkZGSDD5RD+0DwBgAAAADARLzUHAAAAAAAExG8AQAAAAAwEcEbAAAAAAATEbwBAAAAADARwRsAAAAAABMRvAEAAAAAMBHBGwAAAAAAExG8AQAAAAAw0f8H5IK/rSx78xYAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 1000x500 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 体重、身高和男性比例有缺失值,观察总体分布看能否填充\n",
"fig, axes = plt.subplots(1, 3, figsize=(10, 5))\n",
"columns_to_plot = ['height_m', 'weight_kg', 'percentage_male']\n",
"for i, column in enumerate(columns_to_plot):\n",
" ax = axes[i] \n",
" ax.tick_params(axis='x', which='both', bottom=False, top=False, labelbottom=False)\n",
" sns.countplot(x=column, data=df, ax=ax) \n",
" ax.set_xlabel(column) \n",
"plt.tight_layout() "
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "dad019aa",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"name 0\n",
"attack 0\n",
"base_egg_steps 0\n",
"base_happiness 0\n",
"base_total 0\n",
"capture_rate 0\n",
"classfication 0\n",
"defense 0\n",
"experience_growth 0\n",
"height_m 0\n",
"hp 0\n",
"percentage_male 0\n",
"pokedex_number 0\n",
"sp_attack 0\n",
"sp_defense 0\n",
"speed 0\n",
"type1 0\n",
"type2 384\n",
"weight_kg 0\n",
"generation 0\n",
"is_legendary 0\n",
"dtype: int64"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 用中位数填充缺失值\n",
"df[['height_m','weight_kg', 'percentage_male']] = df[['height_m','weight_kg', 'percentage_male']].fillna(df[['height_m','weight_kg', 'percentage_male']].median())\n",
"df.isnull().sum()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "fb7a0102",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>name</th>\n",
" <th>attack</th>\n",
" <th>base_egg_steps</th>\n",
" <th>base_happiness</th>\n",
" <th>base_total</th>\n",
" <th>capture_rate</th>\n",
" <th>classification</th>\n",
" <th>defense</th>\n",
" <th>experience_growth</th>\n",
" <th>height_m</th>\n",
" <th>...</th>\n",
" <th>percentage_male</th>\n",
" <th>pokedex_number</th>\n",
" <th>sp_attack</th>\n",
" <th>sp_defense</th>\n",
" <th>speed</th>\n",
" <th>type1</th>\n",
" <th>type2</th>\n",
" <th>weight_kg</th>\n",
" <th>generation</th>\n",
" <th>is_legendary</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Bulbasaur</td>\n",
" <td>49</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>318</td>\n",
" <td>45</td>\n",
" <td>Seed Pokémon</td>\n",
" <td>49</td>\n",
" <td>1059860</td>\n",
" <td>0.7</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>1</td>\n",
" <td>65</td>\n",
" <td>65</td>\n",
" <td>45</td>\n",
" <td>grass</td>\n",
" <td>poison</td>\n",
" <td>6.9</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Ivysaur</td>\n",
" <td>62</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>405</td>\n",
" <td>45</td>\n",
" <td>Seed Pokémon</td>\n",
" <td>63</td>\n",
" <td>1059860</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>2</td>\n",
" <td>80</td>\n",
" <td>80</td>\n",
" <td>60</td>\n",
" <td>grass</td>\n",
" <td>poison</td>\n",
" <td>13.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Venusaur</td>\n",
" <td>100</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>625</td>\n",
" <td>45</td>\n",
" <td>Seed Pokémon</td>\n",
" <td>123</td>\n",
" <td>1059860</td>\n",
" <td>2.0</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>3</td>\n",
" <td>122</td>\n",
" <td>120</td>\n",
" <td>80</td>\n",
" <td>grass</td>\n",
" <td>poison</td>\n",
" <td>100.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Charmander</td>\n",
" <td>52</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>309</td>\n",
" <td>45</td>\n",
" <td>Lizard Pokémon</td>\n",
" <td>43</td>\n",
" <td>1059860</td>\n",
" <td>0.6</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>4</td>\n",
" <td>60</td>\n",
" <td>50</td>\n",
" <td>65</td>\n",
" <td>fire</td>\n",
" <td>NaN</td>\n",
" <td>8.5</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Charmeleon</td>\n",
" <td>64</td>\n",
" <td>5120</td>\n",
" <td>70</td>\n",
" <td>405</td>\n",
" <td>45</td>\n",
" <td>Flame Pokémon</td>\n",
" <td>58</td>\n",
" <td>1059860</td>\n",
" <td>1.1</td>\n",
" <td>...</td>\n",
" <td>88.1</td>\n",
" <td>5</td>\n",
" <td>80</td>\n",
" <td>65</td>\n",
" <td>80</td>\n",
" <td>fire</td>\n",
" <td>NaN</td>\n",
" <td>19.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>796</th>\n",
" <td>Celesteela</td>\n",
" <td>101</td>\n",
" <td>30720</td>\n",
" <td>0</td>\n",
" <td>570</td>\n",
" <td>25</td>\n",
" <td>Launch Pokémon</td>\n",
" <td>103</td>\n",
" <td>1250000</td>\n",
" <td>9.2</td>\n",
" <td>...</td>\n",
" <td>50.0</td>\n",
" <td>797</td>\n",
" <td>107</td>\n",
" <td>101</td>\n",
" <td>61</td>\n",
" <td>steel</td>\n",
" <td>flying</td>\n",
" <td>999.9</td>\n",
" <td>7</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>797</th>\n",
" <td>Kartana</td>\n",
" <td>181</td>\n",
" <td>30720</td>\n",
" <td>0</td>\n",
" <td>570</td>\n",
" <td>255</td>\n",
" <td>Drawn Sword Pokémon</td>\n",
" <td>131</td>\n",
" <td>1250000</td>\n",
" <td>0.3</td>\n",
" <td>...</td>\n",
" <td>50.0</td>\n",
" <td>798</td>\n",
" <td>59</td>\n",
" <td>31</td>\n",
" <td>109</td>\n",
" <td>grass</td>\n",
" <td>steel</td>\n",
" <td>0.1</td>\n",
" <td>7</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>798</th>\n",
" <td>Guzzlord</td>\n",
" <td>101</td>\n",
" <td>30720</td>\n",
" <td>0</td>\n",
" <td>570</td>\n",
" <td>15</td>\n",
" <td>Junkivore Pokémon</td>\n",
" <td>53</td>\n",
" <td>1250000</td>\n",
" <td>5.5</td>\n",
" <td>...</td>\n",
" <td>50.0</td>\n",
" <td>799</td>\n",
" <td>97</td>\n",
" <td>53</td>\n",
" <td>43</td>\n",
" <td>dark</td>\n",
" <td>dragon</td>\n",
" <td>888.0</td>\n",
" <td>7</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>799</th>\n",
" <td>Necrozma</td>\n",
" <td>107</td>\n",
" <td>30720</td>\n",
" <td>0</td>\n",
" <td>600</td>\n",
" <td>3</td>\n",
" <td>Prism Pokémon</td>\n",
" <td>101</td>\n",
" <td>1250000</td>\n",
" <td>2.4</td>\n",
" <td>...</td>\n",
" <td>50.0</td>\n",
" <td>800</td>\n",
" <td>127</td>\n",
" <td>89</td>\n",
" <td>79</td>\n",
" <td>psychic</td>\n",
" <td>NaN</td>\n",
" <td>230.0</td>\n",
" <td>7</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>800</th>\n",
" <td>Magearna</td>\n",
" <td>95</td>\n",
" <td>30720</td>\n",
" <td>0</td>\n",
" <td>600</td>\n",
" <td>3</td>\n",
" <td>Artificial Pokémon</td>\n",
" <td>115</td>\n",
" <td>1250000</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>50.0</td>\n",
" <td>801</td>\n",
" <td>130</td>\n",
" <td>115</td>\n",
" <td>65</td>\n",
" <td>steel</td>\n",
" <td>fairy</td>\n",
" <td>80.5</td>\n",
" <td>7</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>801 rows × 21 columns</p>\n",
"</div>"
],
"text/plain": [
" name attack base_egg_steps base_happiness base_total \\\n",
"0 Bulbasaur 49 5120 70 318 \n",
"1 Ivysaur 62 5120 70 405 \n",
"2 Venusaur 100 5120 70 625 \n",
"3 Charmander 52 5120 70 309 \n",
"4 Charmeleon 64 5120 70 405 \n",
".. ... ... ... ... ... \n",
"796 Celesteela 101 30720 0 570 \n",
"797 Kartana 181 30720 0 570 \n",
"798 Guzzlord 101 30720 0 570 \n",
"799 Necrozma 107 30720 0 600 \n",
"800 Magearna 95 30720 0 600 \n",
"\n",
" capture_rate classification defense experience_growth height_m \\\n",
"0 45 Seed Pokémon 49 1059860 0.7 \n",
"1 45 Seed Pokémon 63 1059860 1.0 \n",
"2 45 Seed Pokémon 123 1059860 2.0 \n",
"3 45 Lizard Pokémon 43 1059860 0.6 \n",
"4 45 Flame Pokémon 58 1059860 1.1 \n",
".. ... ... ... ... ... \n",
"796 25 Launch Pokémon 103 1250000 9.2 \n",
"797 255 Drawn Sword Pokémon 131 1250000 0.3 \n",
"798 15 Junkivore Pokémon 53 1250000 5.5 \n",
"799 3 Prism Pokémon 101 1250000 2.4 \n",
"800 3 Artificial Pokémon 115 1250000 1.0 \n",
"\n",
" ... percentage_male pokedex_number sp_attack sp_defense speed \\\n",
"0 ... 88.1 1 65 65 45 \n",
"1 ... 88.1 2 80 80 60 \n",
"2 ... 88.1 3 122 120 80 \n",
"3 ... 88.1 4 60 50 65 \n",
"4 ... 88.1 5 80 65 80 \n",
".. ... ... ... ... ... ... \n",
"796 ... 50.0 797 107 101 61 \n",
"797 ... 50.0 798 59 31 109 \n",
"798 ... 50.0 799 97 53 43 \n",
"799 ... 50.0 800 127 89 79 \n",
"800 ... 50.0 801 130 115 65 \n",
"\n",
" type1 type2 weight_kg generation is_legendary \n",
"0 grass poison 6.9 1 0 \n",
"1 grass poison 13.0 1 0 \n",
"2 grass poison 100.0 1 0 \n",
"3 fire NaN 8.5 1 0 \n",
"4 fire NaN 19.0 1 0 \n",
".. ... ... ... ... ... \n",
"796 steel flying 999.9 7 1 \n",
"797 grass steel 0.1 7 1 \n",
"798 dark dragon 888.0 7 1 \n",
"799 psychic NaN 230.0 7 1 \n",
"800 steel fairy 80.5 7 1 \n",
"\n",
"[801 rows x 21 columns]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = df.rename(columns={'classfication': 'classification'})\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "31621c98",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"name Nidoran♀\n",
"attack 47\n",
"base_egg_steps 5120\n",
"base_happiness 70\n",
"base_total 275\n",
"capture_rate 235\n",
"classification Poison Pin Pokémon\n",
"defense 52\n",
"experience_growth 1059860\n",
"height_m 0.4\n",
"hp 55\n",
"percentage_male 0.0\n",
"pokedex_number 29\n",
"sp_attack 40\n",
"sp_defense 40\n",
"speed 41\n",
"type1 poison\n",
"type2 NaN\n",
"weight_kg 7.0\n",
"generation 1\n",
"is_legendary 0\n",
"Name: 28, dtype: object"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"row_label = df.iloc[28]\n",
"row_label"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "f4136c25",
"metadata": {},
"outputs": [],
"source": [
"rows_to_drop = [28, 31, 771, 773]\n",
"df = df.drop(rows_to_drop, axis=0)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "42b158e3",
"metadata": {},
"outputs": [],
"source": [
"# 获得清洗后的数据集\n",
"df.to_csv('pokemon_cleaned.csv', index=False) "
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "169e75c0",
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"is_legendary 1.000000\n",
"base_egg_steps 0.882049\n",
"base_total 0.486499\n",
"sp_attack 0.407070\n",
"weight_kg 0.390628\n",
"experience_growth 0.361969\n",
"sp_defense 0.343366\n",
"height_m 0.320015\n",
"speed 0.312677\n",
"hp 0.308594\n",
"attack 0.303616\n",
"defense 0.265465\n",
"pokedex_number 0.198117\n",
"generation 0.140170\n",
"percentage_male -0.051146\n",
"base_happiness -0.417184\n",
"Name: is_legendary, dtype: float64"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 再次检测变量之间相关性\n",
"df.corr()['is_legendary'].sort_values(ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fd6d2754",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "11d09bd3",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}