Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
Python Lab
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Andrii Skyba
Python Lab
Commits
e69af998
Commit
e69af998
authored
8 months ago
by
Andrii Skyba
Browse files
Options
Downloads
Patches
Plain Diff
lab 4,5,6
parent
31f42551
Branches
main
No related tags found
No related merge requests found
Changes
3
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
Lab4.ipynb
+943
-0
943 additions, 0 deletions
Lab4.ipynb
Lab5.ipynb
+187
-0
187 additions, 0 deletions
Lab5.ipynb
Lab6.ipynb
+262
-0
262 additions, 0 deletions
Lab6.ipynb
with
1392 additions
and
0 deletions
Lab4.ipynb
0 → 100644
+
943
−
0
View file @
e69af998
{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"id": "37adaf49-0222-4be7-8977-5957e21e6792",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting xlrd\n",
" Downloading xlrd-2.0.1-py2.py3-none-any.whl.metadata (3.4 kB)\n",
"Downloading xlrd-2.0.1-py2.py3-none-any.whl (96 kB)\n",
"Installing collected packages: xlrd\n",
"Successfully installed xlrd-2.0.1\n"
]
}
],
"source": [
"!pip install xlrd"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "687a9237-70e6-4c71-9f07-b2312dd79040",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting openpyxl\n",
" Downloading openpyxl-3.1.5-py2.py3-none-any.whl.metadata (2.5 kB)\n",
"Collecting et-xmlfile (from openpyxl)\n",
" Downloading et_xmlfile-2.0.0-py3-none-any.whl.metadata (2.7 kB)\n",
"Downloading openpyxl-3.1.5-py2.py3-none-any.whl (250 kB)\n",
"Downloading et_xmlfile-2.0.0-py3-none-any.whl (18 kB)\n",
"Installing collected packages: et-xmlfile, openpyxl\n",
"Successfully installed et-xmlfile-2.0.0 openpyxl-3.1.5\n"
]
}
],
"source": [
"!pip install openpyxl\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "af57f689-9056-483e-b262-81a4561030c9",
"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>Country</th>\n",
" <th>Energy Supply</th>\n",
" <th>Energy Supply per Capita</th>\n",
" <th>% Renewable</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>American Samoa</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>0.641026</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>Bolivia</td>\n",
" <td>3.360000e+08</td>\n",
" <td>32</td>\n",
" <td>31.477120</td>\n",
" </tr>\n",
" <tr>\n",
" <th>164</th>\n",
" <td>South Korea</td>\n",
" <td>1.100700e+10</td>\n",
" <td>221</td>\n",
" <td>2.279353</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Country Energy Supply Energy Supply per Capita % Renewable\n",
"3 American Samoa NaN ... 0.641026\n",
"24 Bolivia 3.360000e+08 32 31.477120\n",
"164 South Korea 1.100700e+10 221 2.279353"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Імпорт необхідних бібліотек\n",
"import pandas as pd\n",
"import numpy as np\n",
"\n",
"# Завантаження файлу Excel\n",
"file_path = 'C:/Users/skiba/python_khpi/En_In.xls'\n",
"energy_data = pd.read_excel(file_path, skiprows=17, usecols=\"C:F\")\n",
"\n",
"# Перейменування стовпців\n",
"energy_data.columns = ['Country', 'Energy Supply', 'Energy Supply per Capita', '% Renewable']\n",
"\n",
"# Перетворення 'Energy Supply' у ГДж, заміна '...' на NaN\n",
"energy_data['Energy Supply'] = pd.to_numeric(energy_data['Energy Supply'], errors='coerce') * 1_000_000\n",
"\n",
"# Очищення назв країн від цифр та тексту в дужках\n",
"energy_data['Country'] = energy_data['Country'].str.replace(r'\\d+|\\(.*\\)', '', regex=True).str.strip()\n",
"\n",
"# Перейменування вказаних країн\n",
"country_renames = {\n",
" \"Republic of Korea\": \"South Korea\", \n",
" \"United States of America\": \"United States\", \n",
" \"United Kingdom of Great Britain and Northern Ireland\": \"United Kingdom\", \n",
" \"China, Hong Kong Special Administrative Region\": \"Hong Kong\"\n",
"}\n",
"energy_data['Country'] = energy_data['Country'].replace(country_renames)\n",
"\n",
"# Фільтрація для перевірки результату (American Samoa, South Korea, Bolivia)\n",
"filtered_countries = energy_data.loc[energy_data['Country'].isin(['American Samoa', 'South Korea', 'Bolivia'])]\n",
"filtered_countries\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "c4b4031d-5205-44e0-b0fa-e3585b18ec53",
"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>Country Name</th>\n",
" <th>Country Code</th>\n",
" <th>Indicator Name</th>\n",
" <th>Indicator Code</th>\n",
" <th>1960</th>\n",
" <th>1961</th>\n",
" <th>1962</th>\n",
" <th>1963</th>\n",
" <th>1964</th>\n",
" <th>1965</th>\n",
" <th>...</th>\n",
" <th>2006</th>\n",
" <th>2007</th>\n",
" <th>2008</th>\n",
" <th>2009</th>\n",
" <th>2010</th>\n",
" <th>2011</th>\n",
" <th>2012</th>\n",
" <th>2013</th>\n",
" <th>2014</th>\n",
" <th>2015</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Aruba</td>\n",
" <td>ABW</td>\n",
" <td>GDP at market prices (constant 2010 US$)</td>\n",
" <td>NY.GDP.MKTP.KD</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2.467704e+09</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1 rows × 60 columns</p>\n",
"</div>"
],
"text/plain": [
" Country Name Country Code Indicator Name \\\n",
"0 Aruba ABW GDP at market prices (constant 2010 US$) \n",
"\n",
" Indicator Code 1960 1961 1962 1963 1964 1965 ... 2006 2007 2008 \\\n",
"0 NY.GDP.MKTP.KD NaN NaN NaN NaN NaN NaN ... NaN NaN NaN \n",
"\n",
" 2009 2010 2011 2012 2013 2014 2015 \n",
"0 NaN 2.467704e+09 NaN NaN NaN NaN NaN \n",
"\n",
"[1 rows x 60 columns]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"import pandas as pd\n",
"\n",
"\n",
"gdp_data = pd.read_csv('C:/Users/skiba/python_khpi/gpd.csv', skiprows=4)\n",
"\n",
"\n",
"country_renames = {\n",
" \"Korea, Rep.\": \"South Korea\", \n",
" \"Iran, Islamic Rep.\": \"Iran\", \n",
" \"Hong Kong SAR, China\": \"Hong Kong\"\n",
"}\n",
"gdp_data['Country Name'] = gdp_data['Country Name'].replace(country_renames)\n",
"\n",
"\n",
"gdp_data.head(1)\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "22abd678-8561-410c-ab1d-58ee49394567",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(15, 20)\n"
]
},
{
"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>Rank</th>\n",
" <th>Documents</th>\n",
" <th>Citable documents</th>\n",
" <th>Citations</th>\n",
" <th>Self-citations</th>\n",
" <th>Citations per document</th>\n",
" <th>H index</th>\n",
" <th>Energy Supply</th>\n",
" <th>Energy Supply per Capita</th>\n",
" <th>% Renewable</th>\n",
" <th>2006</th>\n",
" <th>2007</th>\n",
" <th>2008</th>\n",
" <th>2009</th>\n",
" <th>2010</th>\n",
" <th>2011</th>\n",
" <th>2012</th>\n",
" <th>2013</th>\n",
" <th>2014</th>\n",
" <th>2015</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Country</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>China</th>\n",
" <td>1</td>\n",
" <td>127050</td>\n",
" <td>126767</td>\n",
" <td>597237</td>\n",
" <td>411683</td>\n",
" <td>4.70</td>\n",
" <td>138</td>\n",
" <td>1.271910e+11</td>\n",
" <td>93</td>\n",
" <td>19.75491</td>\n",
" <td>3.992331e+12</td>\n",
" <td>4.559041e+12</td>\n",
" <td>4.997775e+12</td>\n",
" <td>5.459247e+12</td>\n",
" <td>6.039659e+12</td>\n",
" <td>6.612490e+12</td>\n",
" <td>7.124978e+12</td>\n",
" <td>7.672448e+12</td>\n",
" <td>8.230121e+12</td>\n",
" <td>8.797999e+12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>United States</th>\n",
" <td>2</td>\n",
" <td>96661</td>\n",
" <td>94747</td>\n",
" <td>792274</td>\n",
" <td>265436</td>\n",
" <td>8.20</td>\n",
" <td>230</td>\n",
" <td>9.083800e+10</td>\n",
" <td>286</td>\n",
" <td>11.57098</td>\n",
" <td>1.479230e+13</td>\n",
" <td>1.505540e+13</td>\n",
" <td>1.501149e+13</td>\n",
" <td>1.459484e+13</td>\n",
" <td>1.496437e+13</td>\n",
" <td>1.520402e+13</td>\n",
" <td>1.554216e+13</td>\n",
" <td>1.577367e+13</td>\n",
" <td>1.615662e+13</td>\n",
" <td>1.654857e+13</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Japan</th>\n",
" <td>3</td>\n",
" <td>30504</td>\n",
" <td>30287</td>\n",
" <td>223024</td>\n",
" <td>61554</td>\n",
" <td>7.31</td>\n",
" <td>134</td>\n",
" <td>1.898400e+10</td>\n",
" <td>149</td>\n",
" <td>10.23282</td>\n",
" <td>5.496542e+12</td>\n",
" <td>5.617036e+12</td>\n",
" <td>5.558527e+12</td>\n",
" <td>5.251308e+12</td>\n",
" <td>5.498718e+12</td>\n",
" <td>5.473738e+12</td>\n",
" <td>5.569102e+12</td>\n",
" <td>5.644659e+12</td>\n",
" <td>5.642884e+12</td>\n",
" <td>5.669563e+12</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Rank Documents Citable documents Citations Self-citations \\\n",
"Country \n",
"China 1 127050 126767 597237 411683 \n",
"United States 2 96661 94747 792274 265436 \n",
"Japan 3 30504 30287 223024 61554 \n",
"\n",
" Citations per document H index Energy Supply \\\n",
"Country \n",
"China 4.70 138 1.271910e+11 \n",
"United States 8.20 230 9.083800e+10 \n",
"Japan 7.31 134 1.898400e+10 \n",
"\n",
" Energy Supply per Capita % Renewable 2006 \\\n",
"Country \n",
"China 93 19.75491 3.992331e+12 \n",
"United States 286 11.57098 1.479230e+13 \n",
"Japan 149 10.23282 5.496542e+12 \n",
"\n",
" 2007 2008 2009 2010 \\\n",
"Country \n",
"China 4.559041e+12 4.997775e+12 5.459247e+12 6.039659e+12 \n",
"United States 1.505540e+13 1.501149e+13 1.459484e+13 1.496437e+13 \n",
"Japan 5.617036e+12 5.558527e+12 5.251308e+12 5.498718e+12 \n",
"\n",
" 2011 2012 2013 2014 \\\n",
"Country \n",
"China 6.612490e+12 7.124978e+12 7.672448e+12 8.230121e+12 \n",
"United States 1.520402e+13 1.554216e+13 1.577367e+13 1.615662e+13 \n",
"Japan 5.473738e+12 5.569102e+12 5.644659e+12 5.642884e+12 \n",
"\n",
" 2015 \n",
"Country \n",
"China 8.797999e+12 \n",
"United States 1.654857e+13 \n",
"Japan 5.669563e+12 "
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"import pandas as pd\n",
"\n",
"\n",
"scimago_data = pd.read_excel('C:/Users/skiba/python_khpi/scimagojr.xlsx')\n",
"\n",
"scimago_top15 = scimago_data[scimago_data['Rank'] <= 15]\n",
"\n",
"energy_data = pd.read_excel('C:/Users/skiba/python_khpi/En_In.xls', skiprows=17, usecols=\"C:F\")\n",
"energy_data.columns = ['Country', 'Energy Supply', 'Energy Supply per Capita', '% Renewable']\n",
"energy_data['Energy Supply'] = pd.to_numeric(energy_data['Energy Supply'], errors='coerce') * 1_000_000\n",
"energy_data['Country'] = energy_data['Country'].str.replace(r'\\d+|\\(.*\\)', '', regex=True).str.strip()\n",
"country_renames = {\n",
" \"Republic of Korea\": \"South Korea\", \n",
" \"United States of America\": \"United States\", \n",
" \"United Kingdom of Great Britain and Northern Ireland\": \"United Kingdom\", \n",
" \"China, Hong Kong Special Administrative Region\": \"Hong Kong\"\n",
"}\n",
"energy_data['Country'] = energy_data['Country'].replace(country_renames)\n",
"\n",
"gdp_data = pd.read_csv('C:/Users/skiba/python_khpi/gpd.csv', skiprows=4)\n",
"gdp_data.rename(columns={'Country Name': 'Country'}, inplace=True)\n",
"gdp_filtered = gdp_data[['Country', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015']]\n",
"\n",
"gdp_country_renames = {\n",
" \"Korea, Rep.\": \"South Korea\", \n",
" \"Iran, Islamic Rep.\": \"Iran\", \n",
" \"Hong Kong SAR, China\": \"Hong Kong\"\n",
"}\n",
"\n",
"# Заміна назв країн у GDP із використанням .loc\n",
"gdp_filtered.loc[:, 'Country'] = gdp_filtered['Country'].replace(gdp_country_renames)\n",
"\n",
"\n",
"\n",
"# Об'єднання даних\n",
"merged_data = scimago_top15.merge(energy_data, how='inner', on='Country')\n",
"merged_data = merged_data.merge(gdp_filtered, how='inner', on='Country')\n",
"\n",
"\n",
"final_columns = ['Rank', 'Documents', 'Citable documents', 'Citations', 'Self-citations', \n",
" 'Citations per document', 'H index', 'Energy Supply', 'Energy Supply per Capita', \n",
" '% Renewable', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015']\n",
"final_data = merged_data.set_index('Country')[final_columns]\n",
"\n",
"print(final_data.shape) \n",
"final_data.head(3) \n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "e1294e32-5a5b-4632-aaed-f247d7c944cb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Country\n",
"United States 1.536434e+13\n",
"China 6.348609e+12\n",
"Japan 5.542208e+12\n",
"Germany 3.493025e+12\n",
"France 2.681725e+12\n",
"United Kingdom 2.487907e+12\n",
"Brazil 2.189794e+12\n",
"Italy 2.120175e+12\n",
"India 1.769297e+12\n",
"Canada 1.660647e+12\n",
"Russian Federation 1.565459e+12\n",
"Spain 1.418078e+12\n",
"Australia 1.164043e+12\n",
"South Korea 1.106715e+12\n",
"Iran 4.441558e+11\n",
"Name: avgGDP, dtype: float64"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def task_eight(data):\n",
" # Обчислення середнього значення ВВП за період з 2006 по 2015 рік\n",
" avg_gdp = data.loc[:, '2006':'2015'].mean(axis=1)\n",
" # Сортування за спаданням\n",
" avg_gdp_sorted = avg_gdp.sort_values(ascending=False)\n",
" \n",
" avg_gdp_sorted.name = 'avgGDP'\n",
" return avg_gdp_sorted\n",
"\n",
"\n",
"task_eight_result = task_eight(final_data)\n",
"task_eight_result\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "c303dc26-4820-49af-bf8e-b504883c9c39",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"('France', 153345695364.24023)"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Функція для обчислення зміни ВВП для країни з 5-м найвищим середнім ВВП\n",
"def task_nine(data):\n",
" # Обчислення середнього ВВП кожної країни за останні 10 років та сортування за спаданням\n",
" avg_gdp = data.loc[:, '2006':'2015'].mean(axis=1).sort_values(ascending=False)\n",
" # Отримання країни з 5-м найвищим середнім ВВП\n",
" fifth_country = avg_gdp.index[4]\n",
" # Обчислення зміни ВВП за останні 10 років для цієї країни\n",
" gdp_change = data.loc[fifth_country, '2015'] - data.loc[fifth_country, '2006']\n",
" return (fifth_country, gdp_change)\n",
"\n",
"\n",
"task_nine_result = task_nine(final_data)\n",
"task_nine_result\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "0f5c8f0e-f124-43bb-8181-9a77c0e959ff",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"('Brazil', 69.64803)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Функція для визначення країни з максимальним відсотком поновлюваних джерел енергії\n",
"def task_ten(data):\n",
" # Знаходимо країну з найбільшим % Renewable\n",
" max_renewable_country = data['% Renewable'].idxmax()\n",
" # Отримуємо значення максимального % Renewable\n",
" max_renewable_value = data.loc[max_renewable_country, '% Renewable']\n",
" return (max_renewable_country, max_renewable_value)\n",
"\n",
"\n",
"task_ten_result = task_ten(final_data)\n",
"task_ten_result\n"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "3d83b785-0fad-4101-99af-88bda4360a73",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"('Japan', 127409395.97315437)"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Функція для оцінки чисельності населення та визначення шостої країни за населенням\n",
"def task_eleven(data):\n",
" # Оцінка чисельності населення\n",
" data['Estimated Population'] = data['Energy Supply'] / data['Energy Supply per Capita']\n",
" # Сортування за населенням за спаданням\n",
" sorted_population = data['Estimated Population'].sort_values(ascending=False)\n",
" # Отримання 6-ї країни за населенням\n",
" sixth_country = sorted_population.index[5]\n",
" sixth_population = sorted_population.iloc[5]\n",
" return (sixth_country, sixth_population)\n",
"\n",
"\n",
"task_eleven_result = task_eleven(final_data)\n",
"task_eleven_result\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "4b01c65d-49cd-4a01-a7d1-e7c024543761",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.7940010435442946"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Функція для обчислення кореляції між цитованими документами на душу населення та енергопостачанням на душу населення\n",
"def task_twelve(data):\n",
" # Оцінка чисельності населення\n",
" data['Estimated Population'] = data['Energy Supply'] / data['Energy Supply per Capita']\n",
" # Обчислення цитованих документів на душу населення\n",
" data['Cited Documents per Capita'] = data['Citable documents'] / data['Estimated Population']\n",
" # Переконуємося, що дані числові, і видаляємо пропущені значення\n",
" data_cleaned = data[['Cited Documents per Capita', 'Energy Supply per Capita']].dropna()\n",
" data_cleaned = data_cleaned.apply(pd.to_numeric, errors='coerce').dropna() # Забезпечуємо числовий тип даних\n",
" # Обчислення кореляції\n",
" correlation = data_cleaned['Cited Documents per Capita'].corr(data_cleaned['Energy Supply per Capita'])\n",
" return correlation\n",
"\n",
"task_twelve_result = task_twelve(final_data)\n",
"task_twelve_result\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "cfb7eaa8-6bc1-4df5-99ad-bf373fd8124d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Country\n",
"Australia 0\n",
"Brazil 1\n",
"Canada 1\n",
"China 1\n",
"France 1\n",
"Germany 1\n",
"India 0\n",
"Iran 0\n",
"Italy 1\n",
"Japan 0\n",
"Russian Federation 1\n",
"South Korea 0\n",
"Spain 1\n",
"United Kingdom 0\n",
"United States 0\n",
"Name: High Renewable, dtype: int32"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Функція для створення нового стовпця на основі медіани % Renewable\n",
"def task_thirteen(data):\n",
" # Обчислення медіани для % Renewable\n",
" renewable_median = data['% Renewable'].median()\n",
" # Створення нового стовпця: 1, якщо % Renewable >= медіани, інакше 0\n",
" data['High Renewable'] = (data['% Renewable'] >= renewable_median).astype(int)\n",
" # Повертаємо Series, відсортований за Rank у порядку зростання, індексований за назвою країни\n",
" sorted_series = data['High Renewable'].sort_index(ascending=True)\n",
" return sorted_series\n",
"\n",
"task_thirteen_result = task_thirteen(final_data)\n",
"task_thirteen_result\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "d2402833-9146-4a85-9efa-a63f81268620",
"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>size</th>\n",
" <th>sum</th>\n",
" <th>mean</th>\n",
" <th>std</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Continent</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Asia</th>\n",
" <td>5</td>\n",
" <td>2898666386.6106</td>\n",
" <td>579733277.32212</td>\n",
" <td>6.790979e+08</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Australia</th>\n",
" <td>1</td>\n",
" <td>23316017.316017</td>\n",
" <td>23316017.316017</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Europe</th>\n",
" <td>6</td>\n",
" <td>457929667.216372</td>\n",
" <td>76321611.202729</td>\n",
" <td>3.464767e+07</td>\n",
" </tr>\n",
" <tr>\n",
" <th>North America</th>\n",
" <td>2</td>\n",
" <td>352855249.48025</td>\n",
" <td>176427624.740125</td>\n",
" <td>1.996696e+08</td>\n",
" </tr>\n",
" <tr>\n",
" <th>South America</th>\n",
" <td>1</td>\n",
" <td>205915254.237288</td>\n",
" <td>205915254.237288</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" size sum mean std\n",
"Continent \n",
"Asia 5 2898666386.6106 579733277.32212 6.790979e+08\n",
"Australia 1 23316017.316017 23316017.316017 NaN\n",
"Europe 6 457929667.216372 76321611.202729 3.464767e+07\n",
"North America 2 352855249.48025 176427624.740125 1.996696e+08\n",
"South America 1 205915254.237288 205915254.237288 NaN"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def task_forteen(data):\n",
" # Словник континентів\n",
" ContinentDict = {\n",
" 'China':'Asia', 'United States':'North America', 'Japan':'Asia',\n",
" 'United Kingdom':'Europe', 'Russian Federation':'Europe', 'Canada':'North America',\n",
" 'Germany':'Europe', 'India':'Asia', 'France':'Europe', 'South Korea':'Asia',\n",
" 'Italy':'Europe', 'Spain':'Europe', 'Iran':'Asia', 'Australia':'Australia',\n",
" 'Brazil':'South America'\n",
" }\n",
" \n",
" data['Estimated Population'] = data['Energy Supply'] / data['Energy Supply per Capita']\n",
" data['Continent'] = data.index.to_series().map(ContinentDict)\n",
" \n",
" continent_stats = data.groupby('Continent')['Estimated Population'].agg(['size', 'sum', 'mean', 'std'])\n",
" return continent_stats\n",
"\n",
"task_forteen_result = task_forteen(final_data)\n",
"task_forteen_result\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "791927f6-9b3d-47b8-b852-405420083db6",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA+QAAAK9CAYAAACtq6aaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACLEElEQVR4nOzdd3RU1d7G8WfSewUSEkgCBAg99CYdRRAVQcQKKIoFsYD3Kr72ftVrL1i44FXxYgRRUBFEadJLpEmoIZCQBFJJLzPvH6MjMQkkZJITyPez1iwz5+yzz2/iEnlm77O3yWKxWAQAAAAAAOqUg9EFAAAAAADQEBHIAQAAAAAwAIEcAAAAAAADEMgBAAAAADAAgRwAAAAAAAMQyAEAAAAAMACBHAAAAAAAAxDIAQAAAAAwAIEcAAAAAAADEMgBALgATJ48WV5eXudsFx8fL5PJpFdfffWcbZ966imZTCZ7lFdl8+bNk8lk0tatW+v0vgAA1EcEcgAA7OjPwHnmq0mTJhoyZIh++OEHo8trcN577z3NmzfP6DIAAKiQk9EFAABwMXrmmWfUokULWSwWpaSkaN68eRo1apSWLFmi0aNHG11eg/Hee++pUaNGmjx5stGlAABQDoEcAIBaMHLkSPXo0cP2fsqUKQoKCtIXX3xBIK8DeXl58vDwMLoMAADOiinrAADUAT8/P7m7u8vJ6a/vwletWiWTyaRVq1aVafvnc+AVTbU+fPiwRowYIU9PT4WEhOiZZ56RxWKp8J6vv/66wsPD5e7urkGDBmn37t1VqvWzzz5T9+7d5e7uroCAAF1//fU6duxYla5NTEzUlClTFBISIldXV7Vo0UJ33323ioqKyrQrLCzUjBkz1LhxY3l6euqaa67RyZMny7T55ptvdMUVV9j6atWqlZ599lmVlpaWaTd48GB17NhR27Zt08CBA+Xh4aFHH31UERER2rNnj1avXm17fGDw4MFV+hwAANQFRsgBAKgFWVlZOnXqlCwWi1JTU/X2228rJydHN99883n3WVpaqssvv1x9+vTRyy+/rGXLlunJJ59USUmJnnnmmTJt//vf/+r06dOaNm2aCgoK9Oabb2ro0KHatWuXgoKCKr3H888/r8cff1zXXXedbr/9dp08eVJvv/22Bg4cqB07dsjPz6/Sa5OSktSrVy9lZmZq6tSpioqKUmJior766ivl5eXJxcXF1nb69Ony9/fXk08+qfj4eL3xxhu69957tWDBAlubefPmycvLSzNmzJCXl5d+/vlnPfHEE8rOztYrr7xS5t5paWkaOXKkrr/+et18880KCgrS4MGDNX36dHl5een//u//JOmsnx0AgDpnAQAAdjN37lyLpHIvV1dXy7x588q0/eWXXyySLL/88kuZ40eOHLFIssydO9d2bNKkSRZJlunTp9uOmc1myxVXXGFxcXGxnDx5ssy17u7uluPHj9vabtq0ySLJ8uCDD9qOPfnkk5Yz/yoQHx9vcXR0tDz//PNl6tm1a5fFycmp3PG/mzhxosXBwcGyZcuWcufMZnOZ38/w4cNtxywWi+XBBx+0ODo6WjIzM23H8vLyyvVz5513Wjw8PCwFBQW2Y4MGDbJIssyePbtc+w4dOlgGDRp01roBADAKU9YBAKgF7777rlasWKEVK1bos88+05AhQ3T77bdr0aJFNer33nvvtf1sMpl07733qqioSD/99FOZdmPGjFFoaKjtfa9evdS7d299//33lfa9aNEimc1mXXfddTp16pTtFRwcrNatW+uXX36p9Fqz2azFixfryiuvLPPs/Jm1nmnq1Klljg0YMEClpaU6evSo7Zi7u7vt59OnT+vUqVMaMGCA8vLytG/fvjL9ubq66tZbb620PgAA6iOmrAMAUAt69epVJpjecMMN6tq1q+69916NHj26zPTtqnJwcFDLli3LHGvTpo0k63PnZ2rdunW569u0aaMvv/yy0v4PHDggi8VS4bWS5OzsXOm1J0+eVHZ2tjp27FhpmzOFhYWVee/v7y9JysjIsB3bs2ePHnvsMf3888/Kzs4u0z4rK6vM+9DQ0PP6nQIAYCQCOQAAdcDBwUFDhgzRm2++qQMHDqhDhw7lRo3/9PdFy+qK2WyWyWTSDz/8IEdHx3Lnvby87HavivqXZFugLjMzU4MGDZKPj4+eeeYZtWrVSm5ubtq+fbsefvhhmc3mMtedOZoOAMCFgkAOAEAdKSkpkSTl5ORI+mtUODMzs0y7M6dtn8lsNuvw4cO2UXFJ2r9/vyQpIiKiTNsDBw6Uu37//v3l2p2pVatWslgsatGiRZl7VEXjxo3l4+NT5ZXcz2XVqlVKS0vTokWLNHDgQNvxI0eOVKufyr70AACgPuAZcgAA6kBxcbGWL18uFxcXtWvXTpIUHh4uR0dHrVmzpkzb9957r9J+3nnnHdvPFotF77zzjpydnTVs2LAy7RYvXqzExETb+82bN2vTpk0aOXJkpX2PHTtWjo6Oevrpp8ttpWaxWJSWllbptQ4ODhozZoyWLFmirVu3ljv/9/7O5c8R9DOvKyoqOuvvpiKenp7lvvAAAKC+YIQcAIBa8MMPP9gWHktNTdX8+fN14MABPfLII/Lx8ZEk+fr6avz48Xr77bdlMpnUqlUrLV26VKmpqRX26ebmpmXLlmnSpEnq3bu3fvjhB3333Xd69NFH1bhx4zJtIyMjdckll+juu+9WYWGh3njjDQUGBuqf//xnpTW3atVKzz33nGbNmqX4+HiNGTNG3t7eOnLkiL7++mtNnTpVDz30UKXXv/DCC1q+fLkGDRqkqVOnql27djpx4oRiYmK0bt26s26Z9nf9+vWTv7+/Jk2apPvuu08mk0mffvpptYN99+7d9f777+u5555TZGSkmjRpoqFDh1arDwAAaguBHACAWvDEE0/YfnZzc1NUVJTef/993XnnnWXavf322youLtbs2bPl6uqq6667Tq+88kqFi6M5Ojpq2bJluvvuu/WPf/xD3t7eevLJJ8vc608TJ06Ug4OD3njjDaWmpqpXr15655131LRp07PW/cgjj6hNmzZ6/fXX9fTTT0uSmjdvrssuu0xXXXXVWa8NDQ3Vpk2b9Pjjj+vzzz9Xdna2QkNDNXLkSHl4eJz12r8LDAzU0qVLNXPmTD322GPy9/fXzTffrGHDhmnEiBFV7ueJJ57Q0aNH9fLLL+v06dMaNGgQgRwAUG+YLNX9qhkAAAAAANQYz5ADAAAAAGAAAjkAAAAAAAYgkAMAAAAAYAACOQAAAAAABiCQAwAAAABgAAI5AAAAAAAGuOj3ITebzUpKSpK3t7dMJpPR5QAAAAAALnIWi0WnT59WSEiIHBwqHwe/6AN5UlKSmjdvbnQZAAAAAIAG5tixY2rWrFml5y/6QO7t7S3J+ovw8fExuBoAAAAAwMUuOztbzZs3t+XRylz0gfzPaeo+Pj4EcgAAAABAnTnXY9Ms6gYAAAAAgAEI5AAAAAAAGIBADgAAAACAAQjkAAAAAAAYgEAOAAAAAIABCOQAAAAAABiAQA4AAAAAgAEI5AAAAAAAGIBADgAAAACAAQjkAAAAAAAYgEAOAAAAAIABCOQAAAAAABiAQA4AAAAAgAEI5AAAAAAAGMDJ6AIAAAAAAKhQabGUd0wqPCXlJ0oleZKDi+TeVHJrLLmHSs5eRld53gjkAAAAAID6xVwiZe+TUn6WsuMkS0kFjUzWQB48TPLrIjl71nmZNUUgBwAAAADUH4UZUvIKKXWVZCk9S0OLlH9cOvKJ5NNBan6N5Nm8rqq0C54hBwAAAADUD4Xp0tH5UsrKc4Txv8neIx2YLeXE11pptcHQQB4RESGTyVTuNW3aNElSQUGBpk2bpsDAQHl5eWncuHFKSUkxsmQAAAAAQG0wF0snfpQyd57f9UWnpCOfWUP9BcLQQL5lyxadOHHC9lqxYoUkafz48ZKkBx98UEuWLFFMTIxWr16tpKQkjR071siSAQAAAAC1IWuvlLqmZn3kH7P2YbHYp6ZaZrJY6k+lDzzwgJYuXaoDBw4oOztbjRs31vz583XttddKkvbt26d27dppw4YN6tOnT5X6zM7Olq+vr7KysuTj41Ob5QMAAAAAqiAiIkKurq5yd3dXYWGhukZ31kczO8nTfKzmnTu6K/rWFVr760Z5e3srIiJCixcvVnR0dM37rqKq5tB68wx5UVGRPvvsM912220ymUzatm2biouLNXz4cFubqKgohYWFacOGDZX2U1hYqOzs7DIvAAAAAED9smDBAsXGxmrPnj3KSk/RvAU/lmtTWmqufsel+Ypd8Y68vb3tUGXtqjerrC9evFiZmZmaPHmyJCk5OVkuLi7y8/Mr0y4oKEjJycmV9vPiiy/q6aefrsVKAQAAAAD2UlRUpLycLPn7BGje0jh98t1+Bfi4av+xLH04a6A27ErRF8sPqbjELGcnB701s5/6dgpS7P5TmvzMals/hxOzNfOmznry9u4yBQ9VRkZGuTxZ39SbQD5nzhyNHDlSISEhNepn1qxZmjFjhu19dna2mje/sJa+BwAAAICL3YQJE+Tu7q74+Hh1bx+i64a11GfLDmjTnlTt+HSc2ob7SZIim/loxo2dJUkbd6Vo8rOrtO/LCYpu00ixn42TJP2yNUl3vLhGt18V9dcNirMl+dXpZ6quehHIjx49qp9++kmLFi2yHQsODlZRUZEyMzPLfKuRkpKi4ODgSvtydXWVq6trbZYLAAAAAKihBQsWKDo6WiUlJbrz+gF6+N1N6tQqQP06B9vCuCTtiEvT8/N2KC2rQE6ODoo7mqX8ghK5u1nj7O5D6br1uVVa+u/LFdrE868blBbV8SeqvnrxDPncuXPVpEkTXXHFFbZj3bt3l7Ozs1auXGk7FhcXp4SEBPXt29eIMgEAAAAAdubk5KRxI7pr2YbjkiQv97/GjYuKSzX2keV69b7e2v3FeK2ZfaUkqbDYukd50slcjfnncs19bLA6tgoo27HJsW4+QA0YPkJuNps1d+5cTZo0SU5Of5Xj6+urKVOmaMaMGQoICJCPj4+mT5+uvn37VnmFdQAAAABA/ffz1kS1Dfctd7ygsFRFxWaFBXlJkt6O2W07dzq3SFfMWKan7+iuIT0qePTZyavW6rUXwwP5Tz/9pISEBN12223lzr3++utycHDQuHHjVFhYqBEjRui9994zoEoAAAAAgD39+Qx5SUmJwkP8NXtGP63cklimjY+Xi567q4d63bZYjXzddP2lrWznFq2K176jmXrls5165bOdkqS7xrbTXWPbWxs4OtfZZzlf9Wof8trAPuQAAAAAUM8VpEq/v/LHQmw1ZZLa3i/5trNDX+fngtuHHAAAAADQQLk1kRoPsE9fXi0lz3D79FXLCOQAAAAAAOM16ie5BtWsDwcXqdkYycnDLiXVNgI5AAAAAMB4bo2kiBskR/fz7MBkDePere1ZVa0ikAMAAAAA6gffdlLLKZKTd/WuMzlLYddap72bTLVTWy0wfJV1AAAAAABs/DtJLg9IJ36QMrZLFvPZ23uES82vkXzaSqYLa8yZQA4AAAAAqF88m0ktJkpNBkuZO6WsvVJxhmQukuQoufhKnhFSQA/JK0JyvjB31CKQAwAAAADqH0dXyae19VU6WirKlCzFksnRGsCdPI2usMYI5AAAAACA+s3RVXKv4Qrs9dCFNcEeAAAAAICLBIEcAAAAAAADEMgBAAAAADAAgRwAAAAAAAMQyAEAAAAAMACBHAAAAAAAAxDIAQAAAAAwAIEcAAAAAAADEMgBAAAAADAAgRwAAAAAAAMQyAEAAAAAMACBHAAAAAAAAxDIAQAAAAAwAIEcAAAAAAADEMgBAAAAADAAgRwAAAAAAAMQyAEAAAAAMACBHAAAAAAAAxDIAQAAAAAwAIEcAAAAAAADEMgBAAAAADAAgRwAAAAAAAMQyAEAAAAAMACBHAAAAAAAAxDIAQAAAAAwAIEcAAAAAAADEMgBAAAAADAAgRwAAAAAAAMQyAEAAAAAMACBHAAAAAAAAxDIAQAAAAAwAIEcAAAAAAADEMgBAAAAADAAgRwAAAAAAAMQyAEAAAAAMACBHAAAAAAAAxDIAQAAAAAwAIEcAAAAAAADEMgBAAAAADAAgRwAAAAAAAMQyAEAAAAAMACBHAAAAAAAAzgZXQAA4MJy+rR04oRUUCBZLJKLi9SokdS4sdGVAQAAXFgI5ACAc7JYrCF8/35p9WopKanseT8/qV8/qVMnqXlzydnZkDIBAAAuKARyAMBZlZRIW7ZIMTFSbm7FbTIzpe+/l5Yvl4YPly69VPLyqtMyAQAALjgEcgBApcxmad06acEC68/nUlIiLVtmndY+diyhHAAA4GxY1A0AUKmdO60j41UJ42f69Vfp55+tU90BAABQMQI5ADQgJSUlevrppxUVFaWOHTsqOjpaU6dOVWZmZrm2eXnW0e6SkvO7188/S4mJf71funSpBg8efH6dAQAAXISYsg4ADciUKVOUnp6uDRs2yN/fXxaLRV999ZXS09Pl5+dXpu3Ro1J8/PnfKz9fiouTmjWrUckAAAAXLQI5ADQQBw8eVExMjBISEuTv7y9JMplMGj9+vJKTkzVkyBBlZ2eroKBAgwcPUY8eb8licVBc3DwdPPiZ3NwaKz19txwdXTV8+Jfy8WmpvLxkrVx5g4qLs1VaWqCmTYeof/+3ZDI5yGwu1sMP36+MjBUKDPTXgAEDbLUkJyfrhhtusN1vyJAheuutt+TgwMQtAADQcPA3HwBoILZv367WrVurUaNG5c75+flpyZIl2rZtm3bu3KnDh+O1ZMmXtvOpqVvUs+cLGj9+l0JDhys29l+SJBcXP11++RKNHbtN48btVE5OvA4dsl73++8f6sSJOC1btkfr1q3T9u3bK71ffHy8vvzySwEAADQkBHIAgMxmsx5++GF16dJFXbt21fbtW5WUFGs7HxTUVz4+LWw/nz596M8rtWnTw/rqqy5atKirTp7cqrQ063WJiSvVps1EmUwucnFx0W233Vbp/bZu3arY2L/uBwAA0BAwZR0AGohu3brpwIEDSktLU2BgYJlzr732mlJTU7Vp0ya5ubnp3ntnaPPmAtt5R0c3288mk6PMZutKbzt3vqb8/FSNGbNJTk5u2rBhhkpLC8r07ej453WmSu83Y8YMFRSUvQ4AAOBixwg5ADQQkZGRGjdunKZMmWJbVd1isWjhwoXatm2bgoOD5ebmpuTkZH3zTYycnc/dZ2Fhhjw8guXk5Ka8vGQdPhxjOxcaOlyHDn0mk6lYRUVFmjt3ru1cRkZGmfvFxMRU1D0AAMBFjRFyAGhA/vOf/+i5555T79695eTkJLPZrIEDB+rNN9/Utddeqw4dOigkJETDhw/X6dPn7q9Tp/u1YsW1ionpIA+PEIWGDreda9fuDjk57dall7aXv791Ubdt27ZJku6///5y9wMAAGhoTBaLxWJ0EbUpOztbvr6+ysrKko+Pj9HlAMAF48QJ6ZVXpNzc8+/jvvukDh3sVxMAAMCFoKo5lCnrAIAKNW0q9e59/tc3by6Fh9uvHgAAgIsNgRwAUKmhQ6UWLap/naendP31kpeX/WsCAAC4WBDIAQCVatxYmjhRatWq6tf4+Eh33CFFRtZeXQAAABcDFnUDAJxVSIh0223Sxo3SunVSRkbF7Tw8pG7dpIEDmaoOAABQFQRyAMA5NWokjR4t9e0rHT4sbd0qZWZKpaXWaeldukht2ljD+xnbjQMAAOAsCOQAgCoLDLS+evaULBbJbJYcHY2uCgAA4MLEM+QAgPNiMhHGAQAAaoJADgAAAACAAQwP5ImJibr55psVGBgod3d3derUSVu3brWdt1gseuKJJ9S0aVO5u7tr+PDhOnDggIEVAwAAAABQc4YG8oyMDPXv31/Ozs764YcftHfvXv373/+Wv7+/rc3LL7+st956S7Nnz9amTZvk6empESNGqKCgwMDKAQAAAACoGZPFYrEYdfNHHnlEv/76q9auXVvheYvFopCQEM2cOVMPPfSQJCkrK0tBQUGaN2+err/++nPeIzs7W76+vsrKypKPj49d6wcAAAAA4O+qmkMNHSH/9ttv1aNHD40fP15NmjRR165d9dFHH9nOHzlyRMnJyRo+fLjtmK+vr3r37q0NGzZU2GdhYaGys7PLvAAAAAAAqG8MDeSHDx/W+++/r9atW+vHH3/U3Xffrfvuu0+ffPKJJCk5OVmSFBQUVOa6oKAg27m/e/HFF+Xr62t7NW/evHY/BAAAAAAA58HQQG42m9WtWze98MIL6tq1q6ZOnao77rhDs2fPPu8+Z82apaysLNvr2LFjdqwYAAAAAAD7MDSQN23aVO3bty9zrF27dkpISJAkBQcHS5JSUlLKtElJSbGd+ztXV1f5+PiUeQEAAAAAUN8YGsj79++vuLi4Msf279+v8PBwSVKLFi0UHByslStX2s5nZ2dr06ZN6tu3b53WCgAAAACAPTkZefMHH3xQ/fr10wsvvKDrrrtOmzdv1ocffqgPP/xQkmQymfTAAw/oueeeU+vWrdWiRQs9/vjjCgkJ0ZgxY4wsHQAAAACAGjE0kPfs2VNff/21Zs2apWeeeUYtWrTQG2+8oZtuusnW5p///Kdyc3M1depUZWZm6pJLLtGyZcvk5uZmYOUAAAAAANSMofuQ1wX2IQcAAAAA1KULYh9yAAAAAAAaKgI5AAAAAAAGIJADAAAAAGAAAjkAAAAAAAYgkAMAAAAAYAACOQAAAAAABiCQAwAAAABgAAI5AAAAAAAGIJADAAAAAGAAAjkAAAAAAAYgkAMAAAAAYAACOQAAAAAABiCQAwAAAABgAAI5AAAAAAAGIJADAAAAAGAAAjkAAAAAAAYgkAMAAAAAYAACOQAAAAAABiCQAwAAAABgAAI5AAAAAAAGIJADAAAAAGAAAjkAAAAAAAYgkAMAAAAAYAACOQAAAAAABiCQAwAAAABgAAI5AAAAAAAGIJADAAAAAGAAAjkAAAAAAAYgkAMAAAAAYAACOQAAAAAABiCQAwAAAABgAAI5AAAAAAAGIJADAAAAAGAAAjkAAAAAAAYgkAMAAAAAYAACOQAAAAAABiCQAwAAAABgAAI5AAAAAAAGIJADAAAAAGAAAjkAAAAAAAYgkAMAAAAAYAACOQAAAAAABiCQAwAAAABgAAI5AAAAAAAGIJADAAAAAGAAAjkAAAAAAAYgkAMAAAAAYAACOQAAAAAABiCQAwAAAABgAAI5AAAAAAAGIJADAAAAAGAAAjkAAAAAAAYgkAMAAAAAYAACOQAAAAAABiCQAwAAAABgAAI5AAAAAAAGIJADAAAAAGAAAjkAAAAAAAYgkAMAAAAAYAACOQAAAAAABiCQAwAAAABgAAI5AAAAAAAGIJADAAAAAGAAAjkAAAAAAAYgkAMAAAAAYAACOQAAAAAABiCQAwAAAABgAAI5AAAAAAAGIJADAAAAAGAAAjkAAAAAAAYgkAMAAAAAYAACOQAAAAAABjA0kD/11FMymUxlXlFRUbbzBQUFmjZtmgIDA+Xl5aVx48YpJSXFwIoBAAAAALAPw0fIO3TooBMnTthe69ats5178MEHtWTJEsXExGj16tVKSkrS2LFjDawWAAAAAAD7cDK8ACcnBQcHlzuelZWlOXPmaP78+Ro6dKgkae7cuWrXrp02btyoPn361HWpAAAAAADYjeEj5AcOHFBISIhatmypm266SQkJCZKkbdu2qbi4WMOHD7e1jYqKUlhYmDZs2FBpf4WFhcrOzi7zAgAAAACgvjE0kPfu3Vvz5s3TsmXL9P777+vIkSMaMGCATp8+reTkZLm4uMjPz6/MNUFBQUpOTq60zxdffFG+vr62V/PmzWv5UwAAAAAAUH2GTlkfOXKk7efOnTurd+/eCg8P15dffil3d/fz6nPWrFmaMWOG7X12djahHAAAAABQ7xg+Zf1Mfn5+atOmjQ4ePKjg4GAVFRUpMzOzTJuUlJQKnzn/k6urq3x8fMq8AAAAAACob+pVIM/JydGhQ4fUtGlTde/eXc7Ozlq5cqXtfFxcnBISEtS3b18DqwQAAAAAoOYMnbL+0EMP6corr1R4eLiSkpL05JNPytHRUTfccIN8fX01ZcoUzZgxQwEBAfLx8dH06dPVt29fVlgHAAAAAFzwDA3kx48f1w033KC0tDQ1btxYl1xyiTZu3KjGjRtLkl5//XU5ODho3LhxKiws1IgRI/Tee+8ZWTIAAAAAAHZhslgsFqOLqE3Z2dny9fVVVlYWz5MDAAAAAGpdVXNovXqGHAAAAACAhoJADgAAAACAAQjkAAAAAAAYgEAOAAAAAIABCOQAAAAAABiAQA4AAAAAgAEI5AAAAAAAGIBADgAAAACAAQjkAAAAAAAYgEAOAAAAAIABCOQAAAAAABiAQA4AAAAAgAEI5AAAAAAAGIBADgAAAACAAQjkAAAAAAAYgEAOAAAAAIABCOQAAAAAABiAQA4AAAAAgAEI5AAAAAAAGIBADgAAAACAAQjkAAAAAAAYgEAOAAAAAIABCOQAAAAAABiAQA4AAAAAgAEI5AAAAAAAGIBADgAAAACAAQjkAAAAAAAYgEAOAAAAAIABCOQAAAAAABiAQA4AAAAAgAEI5AAAAAAAGIBADgAAAACAAQjkAAAAAAAYgEAOAAAAAIABCOQAAAAAABiAQA4AAAAAgAEI5AAAAAAAGIBADgAAAACAAQjkAAAAAAAYgEAOAAAAAIABCOQAAAAAABiAQA4AAAAAgAEI5AAAAAAAGIBADgAAAACAAQjkAAAAAAAYgEAOAAAAAIABCOQAAAAAABiAQA4AAAAAgAEI5AAAAAAAGIBADgAAAACAAQjkAAAAAAAYgEAOAAAAAIABCOQAAAAAABiAQA4AAAAAgAEI5AAAAAAAGIBADgAAAACAAQjkAAAAAAAYgEAOAAAAAIABCOQAAAAAABiAQA4AAAAAgAEI5AAAAAAAGIBADgAAAACAAQjkAAAAAAAYgEAOAAAAAIABCOQAAAAAABjgvAL52rVrdfPNN6tv375KTEyUJH366adat26dXYsDAAAAAOBiVe1AvnDhQo0YMULu7u7asWOHCgsLJUlZWVl64YUX7F4gAAAAAAAXo2oH8ueee06zZ8/WRx99JGdnZ9vx/v37a/v27XYtDgAAAACAi1W1A3lcXJwGDhxY7rivr68yMzPtURMAAAAAABe9agfy4OBgHTx4sNzxdevWqWXLlnYpCgAAAACAi121A/kdd9yh+++/X5s2bZLJZFJSUpI+//xzPfTQQ7r77rtro0YAAAAAAC46TtW94JFHHpHZbNawYcOUl5engQMHytXVVQ899JCmT59eGzUCAAAAAHDRqfYIuclk0v/93/8pPT1du3fv1saNG3Xy5Ek9++yzNSrkpZdekslk0gMPPGA7VlBQoGnTpikwMFBeXl4aN26cUlJSanQfAAAAAADqg/Pah1ySXFxc1L59e/Xq1UteXl41KmLLli364IMP1Llz5zLHH3zwQS1ZskQxMTFavXq1kpKSNHbs2BrdCwAAAACA+qBKU9arE4IXLVpUrQJycnJ000036aOPPtJzzz1nO56VlaU5c+Zo/vz5Gjp0qCRp7ty5ateunTZu3Kg+ffpU6z4AAAAAANQnVQrkvr6+tVbAtGnTdMUVV2j48OFlAvm2bdtUXFys4cOH245FRUUpLCxMGzZsqDSQFxYWqrCw0PY+Ozu71moHAAAAAOB8VSmQz507t1Zu/r///U/bt2/Xli1byp1LTk6Wi4uL/Pz8yhwPCgpScnJypX2++OKLevrpp+1dKgAAAAAAdnXez5CnpqZq7dq1Wrt2rVJTU6t9/bFjx3T//ffr888/l5ub2/mWUc6sWbOUlZVlex07dsxufQMAAAAAYC/VDuTZ2dm65ZZbFBoaqkGDBmnQoEEKDQ3VzTffrKysrCr3s23bNqWmpqpbt25ycnKSk5OTVq9erbfeektOTk4KCgpSUVGRMjMzy1yXkpKi4ODgSvt1dXWVj49PmRcAAAAAAPVNtQP5HXfcoU2bNmnp0qXKzMxUZmamli5dqq1bt+rOO++scj/Dhg3Trl27FBsba3v16NFDN910k+1nZ2dnrVy50nZNXFycEhIS1Ldv3+qWDQAAAABAvVKlZ8jPtHTpUv3444+65JJLbMdGjBihjz76SJdffnmV+/H29lbHjh3LHPP09FRgYKDt+JQpUzRjxgwFBATIx8dH06dPV9++fVlhHQAAAABwwat2IA8MDKxw1XVfX1/5+/vbpag/vf7663JwcNC4ceNUWFioESNG6L333rPrPQAAAAAAMILJYrFYqnPBhx9+qJiYGH366ae2Z7mTk5M1adIkjR07tlrT1utCdna2fH19lZWVxfPkAAAAAIBaV9UcWqUR8q5du8pkMtneHzhwQGFhYQoLC5MkJSQkyNXVVSdPnqx3gRwAAAAAgPqoSoF8zJgxtVwGAAAAAHspKS3R6aLTKjGXyMnBSd6u3nJyqPbTqgBqWbWnrF9omLIOAACAhiIzP1NHMo9oXcI6JZ5OVElpiZwdnRXuF65+zfspwjdCPm78nRiobXadsg4AAACg/rJYLIpNjtXC3xfqZO7JcufT89O148QONfVuqvHtx6tDkw4GVAng76q9D3lpaaleffVV9erVS8HBwQoICCjzAgAAAFB3LBaLNiVu0pwdcyoM42c6cfqEPtz2oWKTY+umOABnVe1A/vTTT+u1117ThAkTlJWVpRkzZmjs2LFycHDQU089VQslAgAAAKjM/rT9mr9zvopLi6vUvqCkQP+N/a+OZByp5coAnEu1A/nnn3+ujz76SDNnzpSTk5NuuOEGffzxx3riiSe0cePG2qgRAAAAaPAWLVqk7t27Kzo6WlFRURo6dKhKSku0LmGdCksLq9VXbnGuhvQdotOnT9dStQCqotrPkCcnJ6tTp06SJC8vL2VlZUmSRo8erccff9y+1QEAAADQiRMnNHXqVG3btk3h4eGSpO3btyvxdKJ+S/7tvPq89s1rlWvKlbe87VkqgGqodiBv1qyZTpw4obCwMLVq1UrLly9Xt27dtGXLFrm6utZGjQAAAECDlpKSIkdHxzJrNnXr1k2r41dr7q1z1bJ/SyXtTFJRbpHaXd5OXcZ2kSRt/M9Gndh9QuZSs5zdnTXw3oHya+YnSfr35f/WqD2jFNw+WBEREZo4caJWrFih5ORkTZkyRY899pgRHxVoUKodyK+55hqtXLlSvXv31vTp03XzzTdrzpw5SkhI0IMPPlgbNQIAAAANWufOnXXJJZcoPDxcgwYNUr9+/XTjjTcqq8A6WzU/M1/XvHaNCk8XauEDCxXULkjB7YLVZVwX9bmtjyTp4JqDWv/Reo16epSt35ziHNvPmZmZ2rBhg06dOqVWrVrp1ltvVWhoaN1+UKCBqXYgf+mll2w/T5gwQeHh4Vq/fr1at26tK6+80q7FAQAAAJAcHBy0cOFC7du3T6tXr9YPP/yg559/Xi8ueFGS1PbStjKZTHLzcVOLvi2U+FuigtsFKzE2UbuX7lZxfrEsFosKT5d91txisdh+vvHGGyVJjRo1UsuWLXXkyBECOVDLarwPeZ8+fdSnTx971AIAAADgLKKiohQVFaU777xTl19+uXau2VlhO5NMyjmZo18/+FXX/Psa+TT1UdqRNC15dEmZdp7Onraf3dzcbD87OjqqpKSkdj4EAJtqr7IeFhamiRMnas6cOTp06FBt1AQAAADgDImJifr1119t7zMyMnTkyBFFt4+WSSbtX7lfklRwukDxG+MV0iVERblFcnB0kEeAhywWi/Z8t6dcv029m9bZZwBQXrVHyF944QWtWbNG//rXv3THHXcoNDRUgwYN0qBBgzR48GC1bt26NuoEAAAAGqySkhI988wzOnLkiDw8PFRSUqJJkybptutv06P/eFRuPm5a9OAiFeUWqcMVHRTcLliS1GpgK8VMi5Grj6siekeU6zfEO6SOPwmAM5ksZz44Uk0nTpzQ6tWrtXTpUi1YsEBms1mlpaX2rK/GsrOz5evrq6ysLPn4+BhdDgAAAGBXoWGhuuQfl8gvwq/K17g4umh6r+lq06hN7RUGNGBVzaHn9Qx5Xl6e1q1bp1WrVumXX37Rjh071LFjRw0ePPh86wUAAABwHpwdnDWsxTDt0A6ZLeZztndycNINHW9Q60BmtgJGq3Yg79evn3bs2KF27dpp8ODBeuSRRzRw4ED5+/vXRn0AAAAAziI+Pl7FpcVqd7ydvt73tXKLcitt6+Pqo+s6XKfuId1lMpnqsEoAFal2IN+3b588PT1tKzy2a9eOMA4AAAAYyNnRWQPCBygyIFIH0g9odfxqncw9qWJzsVwcXdTUq6kGRQxSq4BWauLZxOhyAfyh2s+QWywW7dq1S6tWrdLq1au1Zs0aubi4aNCgQRoyZIjuuOOO2qr1vPAMOQAAABqa3KJcZRVkqdRSKkcHR/m7+cvd2d3osoAGo6o5tEaLulksFm3btk3vvPOOPv/8cxZ1AwAAAAA0eLW2qNv27du1atUqrVq1SuvWrdPp06fVqVMnTZ8+XYMGDapR0QAAAAAANBTVDuS9evVS165dNWjQIN1xxx0aOHCgfH19a6M2AAAAAAAuWtUO5Onp6Uz9BgAAAACghhyqe4GPj48yMzP18ccfa9asWUpPT5dkncqemJho9wIBAAAAALgYVXuEfOfOnRo2bJj8/PwUHx+vO+64QwEBAVq0aJESEhL03//+tzbqBAAAAADgolLtEfIZM2bo1ltv1YEDB+Tm5mY7PmrUKK1Zs8auxQEAAAAAcLGqdiDfsmWL7rzzznLHQ0NDlZycbJeiAAAAAAC42FU7kLu6uio7O7vc8f3796tx48Z2KQoAAAAAgItdtQP5VVddpWeeeUbFxcWSJJPJpISEBD388MMaN26c3QsEAAAAAOBiVO1A/u9//1s5OTlq0qSJ8vPzNWjQIEVGRsrb21vPP/98bdQIAAAAAMBFp9qrrPv6+mrFihVat26ddu7cqZycHHXr1k3Dhw+vjfoAAAAAALgomSwWi8XoImpTdna2fH19lZWVJR8fH6PLAQAAAABc5KqaQ6s9Qi5JK1eu1MqVK5Wamiqz2Vzm3H/+85/z6RIAAAAAgAal2oH86aef1jPPPKMePXqoadOmMplMtVEXAAAAAAAXtWoH8tmzZ2vevHm65ZZbaqMeAAAAAAAahGoH8qKiIvXr1682agEAAABqhdliVm5RriTJ3dldTg7n9eQmANhVtf8kuv322zV//nw9/vjjtVEPAAAAYBcFJQVKyEzQvlP7dCD9gDILMmWxWOTt6q1WAa3UrlE7RfhFyNPF0+hSATRQ1Q7kBQUF+vDDD/XTTz+pc+fOcnZ2LnP+tddes1txAAAAwPk4nHFYS/cv1e8nf5fZUnYR4pN5J3U447B+OvSTwv3CNSZqjNo2aisHk4NB1QJoqKq97dmQIUMq78xk0s8//1zjouyJbc8AAAAaDrPFrM2Jm/W/Xf9Tfkl+la5xdnDWVVFXaXD4YLk4udRyhQAaglrb9uyXX36pUWEAAABAbdl+Yrs+/e1TlZhLqnxNsblYi/YukqPJUUNbDGUXIQB15rzn5Rw8eFA//vij8vOt3zxWc6AdAAAAsKvj2ce1YPeCaoXxP1lk0eJ9i3Ug/UAtVAYAFat2IE9LS9OwYcPUpk0bjRo1SidOnJAkTZkyRTNnzrR7gQAAAMDZREREaMeOHXr2zWeVcCihStdsnb9V6z9aX+ZYUWmRvtv/nQpLCmujTAAop9qB/MEHH5Szs7MSEhLk4eFhOz5hwgQtW7bMrsUBAAAAVXEy96S+i/lOmccza9TP/rT9Opp11D5FAcA5VPsZ8uXLl+vHH39Us2bNyhxv3bq1jh7lDy8AAADUve+Xf6+UAynK/jhb277Ypp639JRXIy+tfX+tSgpLVFpcqsiBkeo2oVu5a2Omx2jAPQMU3C5YZotZ789+X0k7k7RgwQIDPgmAhqTagTw3N7fMyPif0tPT5erqapeiAAAAgOpo0a2FGkc2VqerOimiT4QkqSivSKOfGy1HZ0eVFJbom39+o9AuoQqKCipzbcfRHbXnuz0KbhcsSYr5JEZfzPmirj8CgAao2lPWBwwYoP/+97+29yaTSWazWS+//PJZt0QDAAAAakt2YXa5Y6VFpVr99mrFTI/R4n8sVs7JHKUdSSvXrvXg1kralaS8jDwl702W2WLWgAED6qJsAA1ctUfIX375ZQ0bNkxbt25VUVGR/vnPf2rPnj1KT0/Xr7/+Whs1AgAAAGflaHIsd2zzp5vl5uOmcW+Mk4Ojg5a/sFylRaXl2jm5Oqnt0Lb6/cfflXksU32v6VsXJQNA9UfIO3bsqP379+uSSy7R1VdfrdzcXI0dO1Y7duxQq1ataqNGAAAA4KwaeTaSs4ezinKLbMcKcwrlFeglB0cHZR7PVOJviZVe3/6K9tr34z4l7UzSVeOvqouSAaD6I+SS5Ovrq//7v/8rc6ygoECvvvqqHnroIbsUBgAAAFRVoHug2o1op43/2ahd3+5Sz1t6qtt13fTL679o/8/75dPURyGdQiq93quRlwJbBso3xFdtgtvUYeUAGrJqBfKTJ09q06ZNcnFx0bBhw+To6Kji4mK99957evHFF1VSUkIgBwAAQJ2Kj49XdmG2fjP9pvCe4WXOjX9nfIXX9LixR5n3xQXFSjucpuH3DFe4b3iF1wCAvVV5yvq6devUunVrXXXVVRo5cqT69eunvXv3qkOHDvrggw/01FNP6dixY7VZKwAAAFAhH1cfXdry0vO6du8Pe/XlPV+q/cj2uqLXFWrq3dTO1QFAxUwWi8VSlYaDBw9WSEiIHn30UX3yySf697//rdatW+v555/XtddeW9t1nrfs7Gz5+voqKytLPj4+RpcDAACAWpJTlKOPt3+s30/+fl7XB3kF6b5e96mRZyM7VwagoalqDq1yIA8MDNTatWvVvn175efny8vLS4sWLdLVV19tt6JrA4EcAACg4UjMTtRH2z/SidMnqnWdj6uP7uxxpyIDImupMgANSVVzaJWnrGdkZKhRI+u3he7u7vLw8FDHjh1rXikAAABgJ6E+oZrabao6B3Wu8jUt/Vvq7p53E8YB1LlqLeq2d+9eJScnS5IsFovi4uKUm5tbpk3nzlX/ww8AAACwtxCfEN0afat2pe7Sz0d+1tHMo7Ko/KTQYK9gDW0xVF2Cu8jPza/uCwXQ4FV5yrqDg4NMJpMqav7ncZPJpNLSUrsXWRNMWQcAAGi48orylJSTpPT8dGXkZ8hiscjXzVeBHoEK9gyWjxt/PwRgf1XNoVUeIT9y5IhdCgMAAADqioeLB1PRAdRbVQ7k4eHsxwgAAAAAgL1UeVE3AAAAAABgPwRyAAAAAAAMQCAHAAAAAMAABHIAAAAAAAxQrX3I/+7UqVPatGmTSktL1bNnTzVt2tRedQEAAAAAcFE770C+cOFCTZkyRW3atFFxcbHi4uL07rvv6tZbb7VnfQAAAAAAXJSqPGU9JyenzPunn35amzdv1ubNm7Vjxw7FxMTo//7v/+xeIAAAAAAAF6MqB/Lu3bvrm2++sb13cnJSamqq7X1KSopcXFzsWx0AAAAAABcpk8VisVSlYXx8vKZNmyYXFxe9++67OnTokK6//nqVlpaqpKREDg4OmjdvnkaNGlXbNVdLdna2fH19lZWVJR8fH6PLAQAAAABc5KqaQ6v8DHlERIS+++47ffHFFxo0aJDuu+8+HTx4UAcPHlRpaamioqLk5uZml+IBAAAAALjYVXvbsxtuuEFbtmzRb7/9psGDB8tsNis6OpowDgAAAABANVRrlfXvv/9ev//+u7p06aKPP/5Yq1ev1k033aSRI0fqmWeekbu7e23VCQAAAADARaXKI+QzZ87Urbfeqi1btujOO+/Us88+q0GDBmn79u1yc3NT165d9cMPP9RmrQAAAAAAXDSqvKhbYGCgli9fru7duys9PV19+vTR/v37bef37t2rO++8U2vXrq21Ys8Hi7oBAAAAAOpSVXNolUfIPT09deTIEUnSsWPHyj0z3r59+2qH8ffff1+dO3eWj4+PfHx81Ldv3zKj7AUFBZo2bZoCAwPl5eWlcePGKSUlpVr3AAAAAACgPqpyIH/xxRc1ceJEhYSEaNCgQXr22WdrfPNmzZrppZde0rZt27R161YNHTpUV199tfbs2SNJevDBB7VkyRLFxMRo9erVSkpK0tixY2t8XwAAAAAAjFblKeuSlJaWpsOHD6t169by8/OrlYICAgL0yiuv6Nprr1Xjxo01f/58XXvttZKkffv2qV27dtqwYYP69OlTpf6Ysg4AAAAAqEt234dcsj5HHhgYWOPiKlJaWqqYmBjl5uaqb9++2rZtm4qLizV8+HBbm6ioKIWFhZ01kBcWFqqwsND2Pjs7u1bqBQAAAACgJqq9D7m97dq1S15eXnJ1ddVdd92lr7/+Wu3bt1dycrJcXFzKjcQHBQUpOTm50v5efPFF+fr62l7Nmzev5U8AAAAAAED1GR7I27Ztq9jYWG3atEl33323Jk2apL179553f7NmzVJWVpbtdezYMTtWCwAAAACAfVRrynptcHFxUWRkpCSpe/fu2rJli958801NmDBBRUVFyszMLDNKnpKSouDg4Er7c3V1laura22XDQAAAABAjRg+Qv53ZrNZhYWF6t69u5ydnbVy5Urbubi4OCUkJKhv374GVggAAAAAQM0ZOkI+a9YsjRw5UmFhYTp9+rTmz5+vVatW6ccff5Svr6+mTJmiGTNmKCAgQD4+Ppo+fbr69u1b5RXWAQAAAACorwwN5KmpqZo4caJOnDghX19fde7cWT/++KMuvfRSSdLrr78uBwcHjRs3ToWFhRoxYoTee+89I0sGAAAAAMAuqrUP+YWIfcgBAAAAAHWpqjm03j1DDgAAAABAQ0AgBwAAAADAAARyAAAAAAAMQCAHAAAAAMAABHIAAAAAAAxAIAcAAAAAwAAEcgAAAAAADEAgBwAAAADAAARyAAAAAAAMQCAHAAAAAMAABHIAAAAAAAxAIAcAAAAAwAAEcgAAAAAADEAgBwAAAADAAARyAAAAAAAMQCAHAAAAAMAABHIAAAAAAAxAIAcAAAAAwAAEcgAAAAAADEAgBwAAAADAAARyAAAAAAAMQCAHAAAAAMAABHIAAAAAAAxAIAcAAAAAwAAEcgAAAAAADEAgBwAAAADAAARyAAAAAAAMQCAHAAAAAMAABHIAAAAAAAxAIAcAAAAAwAAEcgAAAAAADEAgBwAAAADAAARyAAAAAAAMQCAHAAAAAMAABHIAAAAAAAxAIAcAAAAAwAAEcgAAAAAADEAgBwAAAADAAARyAAAAAAAMQCAHAAAAAMAABHIAAAAAAAxAIAcAAAAAwAAEcgAAAAAADEAgBwAAAADAAARyAAAAAAAMQCAHAAAAAMAABHIAAAAAAAxAIAcAAAAAwAAEcgAAAAAADEAgBwAAAADAAARyAAAAAAAMQCAHAAAAAMAABHIAAAAAAAxAIAcAAAAAwAAEcgAAAAAADEAgBwAAAADAAARyAAAAAAAM4GR0AQ2exSLl50slJdafnZwkV1frPwEAAAAAFy1SX10rLJROnJAyMqTkZOnAASktzRrIJcnBQfL0lFq1kpo3lwIDpcaNJT8/Q8sGAAAAANgXgbyupKdLhw9La9ZIBw9KpaVnb3/kyF8/N24sDRggtWsnNWtmDe0AAAAAgAsagby2ZWZKW7ZIP/9sDeXn4+RJadEi61T2rl2loUOl8HC7lgkAAAAAqFsE8tpisVinoy9cKMXH26fPwkJp40Zp1y5p7FipWzfJw8M+fQMAAAAA6hSBvDbk5kpr10rffScVFdVO/59+Ku3cKY0ZI4WE2P8eAAAAAIBaRSC3t9OnpaVLpVWrav9ev/0mpaZKt97KFHYAAAAAuMCwOpg95eRI33xTN2H8TydOSB9/LB07Vnf3BAAAAADUGIHcXkpKpJ9+sk5Vr2upqdLcudZ/AgAAAAAuCARye9m7V1q+3Lj7JyZaV3IvLjauBgAAAABAlRHI7eHkSSkm5tx7i9e21autXwwAAAAAAOo9AnlNlZZKv/xSP6aLm83Sl1/Wj1oAAAAAAGdFIK+p48eNeW68MqdOMUoOAAAAABcAAnlN7d1bO3uN18Tq1dbt1wAAAAAA9RaBvCbS0+vX6PifkpKk+HijqwAAAAAAnAWBvCYSEqS0NKOrqNjmzUZXAAAAAAA4C0MD+YsvvqiePXvK29tbTZo00ZgxYxQXF1emTUFBgaZNm6bAwEB5eXlp3LhxSklJMajiv0lIMLqCyh05ImVnG10FAAAAAKAShgby1atXa9q0adq4caNWrFih4uJiXXbZZcrNzbW1efDBB7VkyRLFxMRo9erVSkpK0tixYw2s+g9ms3TwYIWnSsxmPb1tm6IWLFDHmBhFL1yoqWvWaHF8vKIXLqzwmqTcXA349lv71ZeRIWVm2q8/AAAAAIBdORl582XLlpV5P2/ePDVp0kTbtm3TwIEDlZWVpTlz5mj+/PkaOnSoJGnu3Llq166dNm7cqD59+pTrs7CwUIWFhbb32bU1SpyZKVUyUj9l9WqlFxZqw5gx8nd1lcVi0VdHjii9oKDS7kI8PbX2qqvsV19JibXGsDD79QkAAAAAsJt69Qx5VlaWJCkgIECStG3bNhUXF2v48OG2NlFRUQoLC9OGDRsq7OPFF1+Ur6+v7dW8efPaKTY7W/qj3jMdzMpSzOHDmjt4sPxdXSVJJpNJ41u2VEsfH5WYzbpn3Tp1+eordYiJ0daTJyVJ8adPy2/ePFs/pg8/1As7dqjX11+rxRdfaO4ZU/kf2rhRPb/+WtELF2rgt98qrrKR8Pr6fDsAAAAAoP4EcrPZrAceeED9+/dXx44dJUnJyclycXGRn59fmbZBQUFKTk6usJ9Zs2YpKyvL9jp27FjtFFxaKlks5Q5vP3VKrX191cjNrcLL9mVmalKbNvrt2ms1vUMH/d+WLZXewtXRUZuvuUY/jByp+9avV4nZLEl6uEsXbbnmGsWOG6d72rfX/evXV9zBGTMFAAAAAAD1i6FT1s80bdo07d69W+vWratRP66urnL9Y2S6VpWWntdlkT4+6t2kiSSpb1CQXt25s9K2N0VGSpKi/PzkZDIpOS9Pzby8tCIxUW/v3q3TxcUyWyxKryx4l5ScV40AAAAAgNpXLwL5vffeq6VLl2rNmjVq1qyZ7XhwcLCKioqUmZlZZpQ8JSVFwcHBBlR6BkfHCg93a9RIB7KylFZQoMAKRsndnP76lTuaTLZR74q4nXEPR5NJJRaLEnJydO+vv2rLNdeolY+PdqalaeCSJRV34FQv/vUCAAAAACpg6JR1i8Wie++9V19//bV+/vlntWjRosz57t27y9nZWStXrrQdi4uLU0JCgvr27VvX5Zbl5CQ5lP/1Rfr6alyLFpqyerUy/xi5tlgsWnj4sA7bYYG5rKIiOTs4qKmHhywWi97Zs6fyxpVMmwcAVF1uUa6OZx9X3Kk47T25V3Gn4nQ8+7hyi3LPfTEAAMBZGDqEOm3aNM2fP1/ffPONvL29bc+F+/r6yt3dXb6+vpoyZYpmzJihgIAA+fj4aPr06erbt2+FK6zXKR8fyc9PSk8vd+o/gwfrue3b1XvxYjk5OMhssWhgcLBG2mHF804BAbq+VSt1iIlRoKurxkREVN44MLDG9wOAhqigpEBHM49q+4nt2ndqn9Lz01VUWmQ77+zorAD3ALUNbKvuId0V7hsud2d3AysGAAAXIpPFUsHKZHV1c5OpwuNz587V5MmTJUkFBQWaOXOmvvjiCxUWFmrEiBF67733qjxlPTs7W76+vsrKypKPj4+9Srcu6PbWW9Levfbr056cnaWHH5Zqa5V5ALgIWSwWHUg/oKX7l+pA2gGZLZU/VvQnk0xqFdBKV7a9Um0D21b6/zYAANBwVDWHGhrI60KtBXJJ+u476dtv7dunvTRpYg3kXl5GVwIAF4TcolytTVir7/d/r8LS6u9S4eLoopGRIzUwYqC8XPizFwCAhqyqOZRVv2rCDlPQa01kJGEcAKoopyhHS+KWaFX8qvPuo6i0SN/EfaO0/DSNiRojb1dv+xUIAAAuSvVmH/ILUliYFBRkdBXlmUxSz55GVwEAF4Ti0mL9ePDHGoXxM61LWKcfDvygopKiczcGAAANGoG8Jnx9pYEDja6ivLAwKTzc6CoA4IKw5+Qe/XT4J7v2+Uv8L9p9crdd+wQAABcfAnlNtW1b/7YXGzRI8vQ0ugoAqPdO5p5UzJ6YKi3eVh1mi1lf7f1Kqbmpdu0XAABcXAjkNdWsmTRsmNFV/CU0VGrXzugqAOCCsD9tv07lnaqVvtPy0rTv1L5a6RsAAFwcCOQ1ZTJJl1xSP7YXc3KSrr1WCggwuhIAMERxcbGefvppRUVFqUOHDuratavGjBmj2NjYcm3zivK0On51rdazOn61copyavUeqDmzxay0vDQlZCXoaOZRHc8+zr83AECdYJV1ewgIkMaNk959VyouNq6OSy+VoqKMuz/QAGUWZCo+I15HMo8opyhHLo4uauzZWK38W6m5b3M5mPjesy7deuutysnJ0YYNG+Tv7y9J+umnnxQXF6fo6OgybVNyU5SQlVCuD4vZuhuoyaHm+4knZicqJSdFXgHselHfWCwWJZ1O0oH0A9qWtE0pOSk6XXRaZotZLo4u8nfzV4R/hHqG9FSEXwSr5gMAagX7kNuL2SwtXy4tXiwZ8SuNjJSmTGF0HKgjJ3NPakfyDq1LWKeUnJRy510dXdU5qLP6h/VXVKMomUw1D3c4uwMHDig6OlrHjh1TQCV/Fr766qv68ssvVVJSIjdfN0XcHCHvJt7aOn+r0o+mq6SgRDmncjRw2kAte3aZOlzRQQlbE1ScX6zB9w/W4fWHdWLXCZlLzRr2j2EKCA9QXkaeVr66UsV5xSotKlXTTk3Vf2p/mRxMilsZp7xteWrVrJV2794tV1dXffnll2rZsqVGjx6tG2+8UTfeeKMkafny5Xr88ce1adOmuvy1NUiZBZlaf2y9VhxaobzivHO2D/MN05ioMYpqFCVHB8c6qBAAcKGrag5l6MZeHBykwYOlESPq/t7Nm0s330wYB+pIYnai5myfo4V7F1YYxiWpsLRQW5K26N0t72ptwlqVmEvquMqGZ8eOHYqMjKw0jM+fP19xcXHasGGDtm/frn4j+2nd7HW286lxqRr8wGBd9+518gz0VFFukRpHNta4N8Ypely0vn/qe0X0itC4N8epzdA22vbFNkmSi6eLLn/sco19fazGvTVOOak5OrTukK3fPbF79MILL2jXrl0aPny4/vWvf0mS7r//fr3zzju2du+++67uvffe2vjV4AzHso5p9tbZ+mbfN1UK45KUkJWg97a8px8O/KC8oqpdAwBAVTBl3Z7c3KyB3NFR+v77uhkpb9VKuuUWqWnT2r8XAKXmpGpe7LwKpzpXpLi0WF/s+kLODs7q06wPI+V16NChQxo3bpzy8/PVr18/5ebmasuWLerevbskKT0vvcxzws27N5eHv4ftvaOLoyL6REiSGrduLGc3Z4V0DrG+b9NYB1cftDa0SJs+2aTkvcmSRcrPypd/uL8iB0ZKkiK7RKpFixaSpL59++rtt9+WJF166aV64IEHtGPHDgUEBGjz5s368ssva/V30tAdyzqmD7d9eF6r35eYS7Rk/xIVlhbqijZXyM2pnu2wAgC4IBHI7c3DwxrK/f2lr7+WcnNr5z4ODlK/ftLll0uNG9fOPQCUYbFYtPLIyiqH8T+ZLWb9b/f/FOoTqjDfsFqqDl27dtXBgweVkZEhf39/tWrVSrGxsZo3b54WL14sZ2dnzZo1S1OnTpUkLfp9kX48+KPtemc35zL9OTr/NTXZ5GCSo8tf7x0cHGQutW6VtnPxTuVn5mvMq2Pk5OKkDXM2qLSo1NbWxcXlrz4dHVVS8tdsifvuu09vv/22goKCdNttt8nV1dVOvw38XXZBthbsWVDjreiWH1qupl5N1S+sn50qAwA0ZExZrw2urtKAAdL990udOtm//4AA6Y47pAkTCOO44EVERKht27aKjo5W27Zt9dJLL9n9HklJSRowYECN+zmRc0JbErdIkuJWxmnu9XO18P6FttfJAycrvbagpEC/n/y9zLEePXpo1apVNa7rTLGxsfrf//5X5lh0dLROnz5t1/vUR61bt9bVV1+tKVOmKDMz03Y8948vRseMGaPZs2crPT1dkuTh4KFTh2q+5VlhTqE8/D3k5OKkvIw8Hf71cJnzzo7OlVwp3XLLLfrxxx81d+5c3XXXXTWuBZXbnLRZB9IO2KWvRb8v0rGsY3bpCwDQsDFCXpvCw6Vbb5V27pR++klKTKzZNHZvb6lvX6l/fyk42H51AgZbsGCBoqOjlZiYqPbt22vo0KHq1auX3foPCQnR2rVra9zPgbQDyi3+a9ZLSKcQjfi/qq8bsTZhrXqH9pafu99511BSUiInp8r/6I6NjdXixYt1/fXXlznWUMybN0/PP/+8evfuLScnJ/n7+6tx48Z6+OGH1bdvX6WlpWnIkCGSpJyCHDXp30SNWjWq0T07XdVJK15aoZhpMfII8FBol9Ay510dKx/19vDw0NixY5WUlKTm9WH7zItUam5qmdkQNXW66LS2ndim5r78OwMA1AyrrNeVnBzp6FFp40Zp1y4pP79q1zk6WhdtGzTI+rx4UFDt1gnUsYiICC1evNi2JVXv3r310EMPafz48Ro8eLAeeOABjRkzRpJ07bXXavTo0Zo8ebI+/vhjvfbaa3JxcVFpaak+/vhj9ezZU/fdd59WrlwpFxcXOTk56ddff1VycrKio6Nto6Y33XST4uLiVFRUpObNm2vOnDkKDg5WfHy8oqOjdf/992vp0qXKysrSW2+9pVGjRsliseiVX1/RoQzrYl1xK+MUvzG+XCDPy8jT+g/X63TqaZUUlSiid4R63txTkpT8e7Li/hsnJzmpZ8+e2rFjh9544w0NHjxYycnJuu+++xQfH6/8/HxdffXVeu6552y/owkTJuiXX35R69at9e9//1s33HCDsrOzVVBQoCFDhuitt97SqVOn1KNHD2VlZalFixbq06ePZs+eLZPJpIyMDPn5+Wnr1q267777lJOTIzc3N73++uvq37//WT/7xepY1jH969d/qbi09rardHJw0sOXPFzpowqlpaXq3r273n77bbvM4mjoIiIi5OrqKnd3d0nWWSgff/yxNh7fqLk75tr1Xr6uvvpH/3+osScz1QAA5VU1hzJCXle8vKQOHaR27aSUFCkzU0pLk44csY6cl5RYR88dHSU/P+s2ZkFB1mfRGzWyPpsOXOT27duntLQ0DR48+JxtZ86cqX379qlp06YqLi5WYWGhfvvtN61cuVJ79uyRg4ODsrKyyjy/+6c33nhDjf943OOll17SU089pdmzZ0uSsrKy1LlzZz399NNatmyZ7r//fo0aNUqFpYXKLyn7RVrSriQtvH+hJMndz12jnh6lVW+sUvT4aIV0DJG51KxlzyzT4XWHFd47XCtfWalX331Vd113l5YvX6558+bZ+po0aZIeffRRDRo0SCUlJRo9erRiYmI0fvx4SVJaWpo2bdokk8mkgoICLVmyRF5eXiotLdXVV1+tL7/8Utdff72eeeYZLV68WIsXLy73uYuKijR27Fh99NFHGjFihNatW6dx48bp4MGDZ/3sF6um3k3VvnF7/Zb8W63dI6pRlJp6Vbzo5rfffqv77rtPI0eOJIzb0Z8zbs60K2WXJMlcapaDo32e1ssqzFJqbiqBHABQIwTyuubgYF0R/c9V0S+5xBrES0ut/3RykliFGQ3MhAkT5ODgoLi4OL3++uu2sHw2w4YN0y233KIrr7xSI0eOVJs2bdSyZUuVlJTotttu05AhQ3TFFVfIwaH8X77nz5+vTz/9VAUFBSooKFCjRn9NWXZzc9PYsWMlWVfEPnTIOiJuUvn/Lv8+Zb24oFiJvyUqP/Ov4F6cX6zMxEz5HveVg4OD+g7sK0m67LLL1LJlS0nWZ5xXrlyplJS/tlDLyclRXFyc7f3kyZNtK7SbzWY9/PDDWrdunSwWi1JTU9WxY8cy09QrEhcXJwcHB434Y3vGSy65REFBQYqNjVWzZs0q/ewXKycHJ/Vv3r9WA/klYZdU+gz5VVddpauuuqrW7g3rIwz/mfcfnTSfVEpCigZOG6iUfSk6tOaQLZz3m9pPQVHW2Wfzb5+vNkPa6HjsceVn5KvtpW3VbUI3SVJuWq7Wf7RemYmZMsmk8N7hOtXplE6fPq0ZM2bot99+U0FBgfr06aN33nmnwi8DAQD4OwJ5fWAyWYM40ED9OaL1008/6corr9TQoUPVqVMnOTk5qbT0r9WqCwoKbD8vXLhQ27Zt06pVqzRq1Cg999xzuv7667V7926tXr1av/zyi2bNmqU1a9aUeeZ63bp1euutt7RhwwY1adJE3377rZ544gnbeVdXV1vwdXR0tN3fxdFFXi5eZ/8gfzwAdPUrV8vJpex/02lH0iSpzFZJf97nzyeHNm7cKDe3irdS8vL6696vvfaaUlNTtWnTJrm5uWnGjBllfjfVceY2bJV99otZq4BW6tC4g/ac3GP3vtsGtlVkQKTd+8XZTZgwwTZlfdKkSdq6eauue+s6uQZZn+X3aeqjzmM6S5JS9qVo1ZurNOH9CbbrC3MLNeaVMSrILtAXU79Q2+Ft5RnoqZ9f+1nNopvp0kculWTd3u5k3knNfGGmBgwYoI8++kgWi0V33HGH3nzzTf3jH/+o408OALgQsco6gHpj+PDhuvvuu/XYY49JkiIjI7Vp0yZJ0pEjR7Ru3TpJ1oXNDh06pB49euihhx7Stddeq82bN+vkyZPKzc3VZZddphdeeEERERHau3dvmXtkZGTI29tbgYGBKioq0gcffFCl2kwmk/o063PWNs7uzgrpFKLYr2Jtx3LTcpVzKkd+zfxksph0YJt1leeffvrJNgLt5eWlIUOGlFlhPikpScePH6/wPhkZGQoODpabm5uSk5MVExNjO+fj46OsrKwKr2vbtq3MZrNWrFghSVq/fr3t+fqGysvFS1dFXSUPZ/s+FuTm5KYx7cbI29Xbrv3i3BYsWKDY2FjFxsbK399fPXr3kH8zf9v5tMNpWjJriWLujdG699cpKzFLJYV/bUX35/7xbj5u8gny0emU0yrOL1by3mRbkJckd193WSwWLV68WK+88oqio6PVtWtXrV271vYYCAAA58KwLIB65fHHH1dkZKS2bdumf/7zn5owYYI6deqkDh06qHfv3pKsC2HddtttSk9Pl5OTkxo3bqy5c+fq2LFjuuOOO1RcXKzS0lL1799fI0eOVGJioq3/yy+/XJ999pnatm2rwMBADR8+vMz5s4kMiJS3i7dOF1W+hdjQmUO1Yc4GxdwbI5kkZ1dnDZg2QF6NvPTce8/psYcf06yHZqlnz57q0qWL7brPP/9cM2bMUMeOHWUymeTp6akPPvhAzZo1K3eP+++/X9dee606dOigkJAQDR8+3HZu2LBhevXVV9W5c2f169fP9my8ZN0Pe9GiRbrvvvs0c+ZMubm56auvvpKXl5dOnar59l8Xqgi/CE3oOEGf/vapSswl577gHBxNjprQYYJa+re0Q3WoKS8vL7k6uiqvOE+lxaVa/uJyjX5+tJq0bqKivCLNu36eSotL5eRq/SvRmfvNmxxNtv3mK+Lp7CmLxaKFCxeqTZs2tf5ZAAAXHwI5AEPFx8eXee/v76+0tDTb+y1btlR43Zo1a8oda9asmbZt21bueEREhG2FdWdnZy1YsKDM+eeff75cO8n6F/kzN6II8gpSv+b99OOhH9V2WFu1Hda23L3c/dw1dObQcsc9XTw1dtBYTb92eoWfp0mTJvrss88qPPf331FYWJg2b95cYVtfX1+tX7++zLEzP0OPHj3KnZfO/dkvdr1Ce6nUXKovdn9Ro1XXnRycNKHjBPVqZr9t+1Azzo7OauzZWBkFGSotLpW5xCyvRtZHQHYv3V21Ptyd1bRDU+1cvFNdx3eVZJ2yHuwdrDFjxuhf//qXPvjgAzk5OSkjI0NpaWmKjORxBQDAuTFlHQCqYXDEYLUJrN5ImLODs27udLNCfULP3RiGcDA5qF/zfrqn5z3n/e8p2CtYd/e8W5eEXSInB77vri9MMqld43aSJBcPF/W4qYcWP7RYix5cJEcnx3Nc/ZchDw7RyYMnFTMtRgvvX6jfv/9dge6Bev311+Xu7q7o6Gh17txZw4YNK/clGgAAlWEfcgCoptScVP1vz/+0J/XcC4G5Obnp5s43q3tIdzmY+A70QpCWl6YtSVu0Jn6N0vLTztne391fA8MGqnez3gr0CKyDClFdhzMO69/r/22XRxL+1CW4i+7odkelq+gDABo29iEHgFrSxKuJJnaZqN9P/q7V8asVnxkvi8p+t+nt4q1ezXqpR9MeahnAs8QXkkCPQF0eebl6hfZSfGa8DqUf0qH0Q8oszFSpuVSOJkf5uvkqMiBSLf1bKsIvgiBezzX3aa7o4GhtTdpql/4cTA4aEDaAMA4AqDECOQCcBz83P/Vt3lfRwdE6mnlUSTlJyivKk7Ojs/zc/BTuF65gr2Cjy0QNBLgHKMA9QN2adlNJaYlOF51WqcUayL1dvOXkeJH+L9RikbKyrK+CAuvWnO7ukr+/5HWOrf/qKWdHZ10eebn2ndqnnKKcGvfXP6y/ohpF2aEyAEBDd5H+bQIA6oa7s7uiGkcpqjF/Ob+YOTk6yd/d/9wNL2QFBdKRI9KWLdK+fVJGhmT+Y4VxZ2cpIEDq1k3q3FkKD5ccq/78dX3Q3Le5JnScoE9iP6nR1PVQ71Bd2vJSRscBAHZBIAcAoKFLTJR++EHautU6Qv53xcVSSoq1zYoV0vDh0sCBUuCFNVW/e9PuKiot0v92/U/F5uqvpt/Mp5lu7XqrgryCaqE6AEBDRCAHAKAhi4uT/vMf6Yxt786qpERatkz6/Xdp8mQpJKQ2q7MrRwdH9WveT4Hugfpq71c6nn28Stc5mBw0OGKwhrYYqsaejWu5SgBAQ8Iq6wAANFRHjkjvviudPn1+14eFSVOnSo0vvJCanp+u30/+rlXxq3Q8+7jMFnO5Nu5O7ooOjlbvZr0VGRDJNHUAQJWxyjoAAKhcdra0aNH5h3FJSkiQVq6Uxo2zPmd+AQlwD1D/sP6KDo5Wam6qMgoylFlgXUnf3cldAe4B8nf3V5BXEFsWAgBqDYEcAICGaNcuaf/+mvezerUUHS1FXZgLG3q6eKqFSwu1UAujSwEANEB85QsAQAMRERGh2NhYKTdXWrWqStc8tHGjntpq3b979t69euW338o2MJulzZsrXgwOAACcFSPkAAA0NCdOSMeOVfuyu9q3r/jEzp3SqVMX5LPkAAAYiUAOAEADM/i669SjtFSbUlOVlJurS5s10+wBAyRJJ/LyNHnVKh3LyVGIp6cauboqys9PkvTU1q3KLCrSG/36aVd6uu5eu1Z5JSUqKC3VjaWleuz11w38VAAAXHgI5AAANDTFxTqUk6NfRo9Wsdms9jEx2pCSor5BQbrv11/Vq3Fj/ThqlBJzcxW9cKEtkJ8pwstLK0ePlqujo/JLStTvhx80fMIE9enTp+4/DwAAFygCOWpdSYmUlmZd0Dc93froYnGx9bijo+TiIrm7SwEBko+P9Z+urkZXDQAXtwktW8rJwUFODg6KDgzUoexs9Q0K0sqkJL36R6gO9fTUVeHhFV6fX1qqe9atU2xamhxMJh0rKVFsbCyBHACAaiCQo1YkJ1sfTzxyRDp0yPpoYU7Oua/z8JACA6WWLaUWLaTmzaXQUMlkqv2aAaDBcHSUm9NffwVwNJlUYi6/D7ckVfbH76ObN6uRm5t2jBsnJwcHjT10SAUFBbVQLAAAFy8COeymsNC6JW1srLRp0/ltbZuXZ30dO2bdScfdXerWTerVSwoPt74HANTQWfYMHx4aqv/ExenpHj10Ii9P3x49qnsqWMwto7BQ7fz95eTgoLjTp7Vi40YNHD26NqsGAOCiQyBHjeXnS7//bg3Q+/dbd8CxZ9+//iqtXy9FREiDB0sdOkje3va7BwA0OM7O1ueFKvBmv36avGqV2n/5pUI9PTU0JKTCdo9166ZbfvlFn+zfr1ZBQRo6eHAtFgwAwMXJZLFc3BuHZmdny9fXV1lZWfLx8TG6nIvOsWPS999L27fX3T3btJHGjJFataq7ewLARcVikebPl9assU9/N98s/bFKOwAAqHoOdajDmnARyc+3jlq/+WbdhnHJOgr/1lvSTz+d37R4AGjwTCapb1/Jza3mfQUFSe3a1bwfAAAaIAI5qi0pSfrvf6VPPjEuEBcUSDEx0ocfSvHxxtQAABe0li2lq6+uWR9OTtL48VKjRvapCQCABoZAjmo5elSaPbvuR8Urs3+/9O670r59RlcCABegPn2kYcPO71pHR2sYr2DBNwAAUDUEclTZ4cPWMJ6SYnQlZWVnW0fKd+82uhIAuMB4eEijR0vXXFPpIm8V8vaWJk2SLrnEGswBAMB5YZV1VMnRo9JHH0np6UZXUrHcXOk//5GmTpWiooyuBgAuIB4e0ogR1insP/9s/XazuLjytj17SgMHSs2a1W2dAABchAjkOKcTJ6xht76G8T/l5kpz5kj33CO1aGF0NQBwATGZrFtYtGwpHT9unQqVkGD9g99kkoKDpdBQqWlT68tkMrpiAAAuCgRynFVBgXVbs+Rkoyupmuxs6auvpDvvlNjlDgCqyclJioiwvnr3NroaAAAuejxDjrP67Tdpyxajq6iegweljRut2+wCAAAAQH1FIEelEhOto80XYrBdulQ6dMjoKgAAAACgcgRyVKigQFq2zDoF/EJUWCh9/fWFWz8AAACAix+BHBXav//Cm6r+dwcPSjt3Gl0FAAAAAFSMQI5yiouldesuzKnqf7d6tXX1dQAAAACobwjkKOf4cWnvXqOrsI9jx6T4eKOrAAAAAIDyCOQoZ9cu6yj5xcBisa64bjYbXQkAAABgTymSDks6IOmopHxjy8F5YR9ylHHqlPTrr0ZXYV+//WYd9Q8LM7oSAAAAoCaKZA3f2yVtlpTzx3EHSS0kDZQUKamRIdWh+gjkKOPYMSkz0+gq7KuwUDpyhEAOAACAC1mOpJ8k/Sjp79M/zZIO/fEKkjRJUqs6rQ7nhynrKCMpyegKagd7kgMAAODCVSDphz9e53oWM0XSbElHarso2AGBHDYWi3TggNFV1I6EBCkvz+gqAAAA0FCdPn1aXl5emjJlynlcvVfSSknSqlVJWrbs2DnaZ0v6UhU9Vz558mS98cYbkqTZs2frlVdeOY96YC9MWYdNZqaUkmJ0FbUjLU3KyJA8POrohiUl0okTf/1SExOl/D/+QPTwkJo3l5o0kfz8pKAgyYn/FAEAAC5mCxYsUPfu3bVo0SK9+eab8vLyquKVRZLWSrLuSbxqVZIyM4t0+eXNK2xdUmKWk5ODrCPkRyVFVdrzXXfdVY1PgNpACmhATCaTMjIy5OfnZzsWERGhxYsXKzo6WpmZlT8/vnr17Wrd+iaFhAxRfPxiubsHKyioT7VrOHp0qXbufFVXXrmq3Ln09F1av/5+FRSkyWIplZOTuwYNmquAgI7VuuepU7HKzNynyMjrbceKiqyfLTS02iVXT2am9YH1deukuLhzL1fv6ip16CD16ydFREje3rVcIAAAAIwwZ84cPf744/rggw+0YMECTZkyRfPmzdPixYu1ePFiSdLSpUv16quvatWqVTpw4IAmT56snJx0mc2puvrqcF17bQvNnv27SkstWrXqhMaOjdDEiW0UHb1Qd97ZTitWHNfEiW3UqVOAHntsiwoKflBRkZdmzJhR4cj8U089pczMTL3xxhvatWuX7r77buXl5amgoEA33nijHnvssTr+LTU8BHLYZGZWvj3YoEEf236Oj1+swMDo8wrkZ7Ny5Q3q0eNZtWhxjSQpJ+eYHB1dq33PtLRYxccvLhPIrcftWm5ZxcXSnj3SokXVm2ZQWCht3259NWsmjR0rRUVJjo61V2styinKUXJOstLy0nQq75RKzaVyd3ZXY4/GCvAIUIhXiJwc+WMHAAA0LHv37tWxY8c0YsQIlZSU6KWXXjrn1PV33nlHo0eP1qxZQyTNVXp6gQIC3HTXXe2UmVmkN97oJ0mKjz+trKwidejgr3/9q7ckKSOjUOvWXSVHx6ZKT79DXbteohEjRqhZs2aV3i8iIkIrV66Uq6ur8vPz1a9fPw0fPlx9+tj37/woi78Zw2bUqAiFhEzU8eMrlJ+frLZtp6hbN+u3YkuWDFanTg/IwcFFR49+q+PHV2j//nnq0OFeRUXdrv37P9WePe/IbC6Ws7OX+vd/W4GBXWQ2F2v9+vt1/PgKubr6Kzh4QKX3z809Lk/Pv4awvbys03ASEr4vd8+wsNFaufIGFRdnq7S0QE2bDlH//m+poOCUtm59QkVFWVq4MFpNmvTRgAGzlZq6RdOnPyxn52yVlpbq0Ucf1fjx43Xy5EnddNNNOnHihEwmk7p37665c+dW7xeXmir99JO0dm3NNjw/flx67z1p2DBp0CApMPD8+6pjGfkZ2pW6S6uOrFLi6cQK2zg5OKl94/YaED5AbQPbytXJtY6rBAAAMMacOXM0ceJEOTo6atSoUbrzzjv1+++/n/WagQMH6h//+Idycn7XoEFpGj688qmezs4Ouvnm1rb3aWkFmjJltfbvz5GT09dKS0vT7t27zxrI8/Pzdc899yg2NlYODg46duyYYmNjCeS1jECOMgoLMzVmzAYVFJzSF1+0Utu2t5YJyWFhoxQefpUCA6PVqdMDkqTk5F916NAXuuqqNXJ0dNWJE2v18883avz4Pfr99w+VmRmn8eP3SJK+/35Epffu1u1xLV06RE2a9FGTJn3UsuW1atSoa4X3LCkp0OWXL5Gzs5fM5lItX361Dh36UpGR16tHj2cUH79YI0Ystn2mtWun6uWXv9dttzXVqVOn1K1bN/Xr109ffvmlWrRooeXLl0uS0tPTq/cLO3ZMmjvX+oy4PZSUSD/+aF0WfuJE6/Pl9ZjFYlHcqTh9tfcrHcs+++IiJeYS7UzZqV0pu9S3eV+NaDVCwd7BdVQpAACAMYqLi/Xpp5/K2dlZ8+fPlyTl5eVpzpw5io6OVmlpqa1tQUGB7edx48apX79+WrFitt55Z7XeeGOXvv9+ZIX38PBwkoODyfb+rrvWadSo5lq4cLhMpkfUrduAMn1X5NFHH1WjRo20Y8cOOTk5aezYsee8BjXHKuuQyWT9j9dikSIjb5Qkubk1ko9PS50+fe7tEuLjv1Fa2m9avLi3Fi6M1vr101VQkK6SknwlJq5UmzYT5ejoIkdHF7Vte1ul/XTuPFPXX39YUVG3q7AwXd9+O0CHDi2opLVZmzY9rK++6qJFi7rq5MmtSkuLrbBlSsp6ZWcf1jPPjFR0dLSGDx8uSYqLi1OfPn30ww8/aObMmfrmm2/k6el5zs9rk5goffSR/cL4mQ4etAb91FT7920nFotFW5K26L0t750zjJe5ThatP7Ze7299X8eyqn4dAADAhejbb79Vy5YtlZiYqPj4eMXHx2vjxo369NNPFR4erp07dyo/P18lJSW2wC5JBw4cUFBQkCZOnKiXX+6vjRutfy/08XFRVlbRWe+ZkVGo8HAvmUxttGbNVv3222/nrDMjI0PNmjWTk5OT4uLitGLFipp9cFQJI+QNSOPGjZWWllZmUbdTp06pSZMmkiSTSXJ0dLOdM5kcZTaXVKFni9q0maRevV44Z8s/w39lPDyCFBl5gyIjb5C3d7gOHPhcrVpNKNdu587XlJ+fqjFjNsnJyU0bNsxQaWll3+BZFBDQQW++uV5XX13+bGxsrH766SctWrRIjz/+uHbs2CHHcz3DnZkpffpp7S5Lf+SIFBMjTZ4sVeeLgjqy5+QeffrbpyoqPfv/ECqTnJOsOTvm6J4e96iJVxM7VwcAAFA/zJkzRzfddFOZY+3atVNoaKhOnjypUaNGqWPHjmratKn69++vTZs2SZK++uorffbZZ3JxcZbZfFKzZ18iSbrmmgh9+ukBRUcvtC3q9ncvvdRL99yzTs8+e1zR0b3Vu3fvc9b52GOP6ZZbbtEnn3yiVq1aaejQoXb49DgXAnkDMmLECH3wwQd6+eWXJUn//e9/1bJlSzVt2rRa/Tg7+6ioKMv2Pjz8Kv38801q3/4ueXmFyWIx69Sp7WrcuIdCQ4frwIHPFBl5o3V6c1zlz2cfOfK1wsNHy8HBWWZzidLSdsrHp1WF9ywszJCHR7CcnNyUl5esw4dj1KLFOEmSi0vZtkFB/ZSdfUS7d/+kq6+2jo7Hxsaqffv2SkxMVGhoqK677jpdfvnlatKkiXJycuTr61v5L8BikX791RqYa9vOndLWrdZnyuuRk7kntWD3gvMO4386cfqEfjr8k8Z3GC9nR2c7VQcAAFB/fP/99xUe3759uyRp7NixFZ6fNWuWZs2a9ce7WEmzJVnUooWPduwYV6ZtZubkMu8vvbSZDhx4TNK9ktzLnJs3b57t56eeesr2c9euXbV79+6zfhbYH4G8AXnjjTf0wAMPqHPnznJwcFBwcLBiYmJs588xeG3TuvUtWr16suLjF6tDh2mKirpdvXu/rOXLr5HZXCKzuUhhYVeoceMeatfuDmVk7NaXX7a3Lep26tS2Cvs9cmSRNm9+RI6OrrJYStW4cS/16PF0hffs1Ol+rVhxrWJiOsjDI0ShocNt/YSGDtPOna/qq686KyionwYMmK2RI7/TwoUP6csvZ6q4uFhhYWFavHixVq1apddee02Ojo4qKSnRK6+8cvYwLkkHDkjLllXtl2UPixdL4eHWbdHqifXH1is11z7T6dcmrFXXpl3VrnE7u/QHAABw8Wkn6VJJy6vY3lfSeP09jKP+MVksFovRRdSm7Oxs+fr6KisrSz4+PkaXU6/Fx0v/+lfNFgqvz+6/X2rfvoadlJRIH38s7dhhl5qqbPBg6YYbJJ17P/mzuf3223XTTTdpyJAhWrx4sYKDg6u9cmZqbqru/vfd2hCzQVe+cGW586veWKXAFoHqdHUnSdKOmB06uOqgRj0zSkc3H1VxfrG6jO1S5prezXprcvRkOZiqv6xFTk6OvL29dZH/UQYAABq8XEkrJS2TVHqWdsGSJklqWRdFoRJVzaGMkMPGz8/6qu5C4xcCV1fpXAPfVXLsmGTEVJ4tW6yhvJqPF/zdxx//tZ/8nwG+uoH8eNZx5ZbkVqntxrkbdWLPCV354pVy83FT+5EVfyOyM3mnUnJS1NS7Zp8PAADg4uUpaaSk9rJOYd8o6fQf5xwkRUoaKGsQv3C2z23oWGUdNr6+Nc579VZAgPVVY3v3SsXFduiomnJzrVPlqyAiIkJPPPGE+vbtqxYtWui5556znRs8eLAWL16s77//Xt9++61eeeUVRUdH24L6p59+qt69e6tbt24aOHCgbUXO4uJi3XPPPWrdurWuv/x6Je1MOmsNFrNFq99erbTDaRr97Gi5+VgXC9w6f6vWf7RekhS3Mk7fPf6dVr6yUv+9+7+6dMClOnz4sK2PJ598UpGRkerZs6cee+wxRZwxZf+DDz5Q69at1bVrV73++utl7v3jjz+qW7du6ty5swYNGqS9e/dKklatWqWOHTvq7rvvVufOndWpUyft3LlTkydPVqdOndS7d28l1saK+QAAAHbjLGvwvlbSPyXNOuOf90rqKcL4hYVADhuTSYqMNLqK2hERIbnX9BGaoiIpNtba3/z5ij11qqZlVc/OnVVumpmZqQ0bNmjLli165ZVXygXNUaNG6aqrrtI//vEPxcbG6vbbb9evv/6qL774QmvWrNH27dv1/PPP68Ybrdvgffjhh4qLi9OePXt017t36dThs3/2HV/tUPaJbF3+xOVydq98sbbUA6nqeUtPjX97vLr266p//etfkqTvvvtOCxcu1I4dO7R58+Yy9e/evVtPPvmk1qxZox07dig/P/+v/lJTdeONN+qTTz7Rzp07NXXqVF177bW26ez79u3T7bffrp07d2rMmDEaOnSoHnnkEe3atUs9evTQG2+8UeXfMQAAgLGaSIqQ1EpSmCRXQ6vB+SGQo4zQUKMrqB0t7fEITXq6lJZmh47OU1KSdbu1Spy5pdyfQbpRo0Zq2bKljlRhRfhvvvlGv/32m3r37q3o6GhNnz5d6enpys/P18qVKzVx4kS5uLioyFSktsPbnrWvkE4hyjiWoeS9yWdtF9Q2SD7B1mdq2nVtp0OHDkmSVq5cqfHjx8vb21smk0lTpkyxXfPzzz9r5MiRtt0B7r77btu5TZs2qVOnTurUyfr8+k033aSkpCRboI+MjFT37t0lST169FBkZKSioqIkSb169dKBKs5CAAAAAOyBZ8hRRrNmkr+/lJFhdCX24+YmtWhhh46ysqxTx8/w2s6d+uLQIRWbzXJ2cNBb/fqpb1CQJOso+viWLfVzUpKyiop0Z7t2+kcX62JmD23cqNUnTqjYbJaPs7M+GjhQbf9YpM304Yd6vmdPLY6P18mCAj3RrZtubdvW+i8lK+uc+8lbP/Nf+8n/uYL8uVgsFk2aNEkvvHD2/eTdnNxk0tmX5A9uF6yOoztqxb9WaOiMoWrWtVmF7Rxd/trv3cXJpdI6z7Z//bn2tj/T338v5/N7AgAAAOzF0BHyNWvW6Morr1RISIhMJpMWL15c5rzFYtETTzyhpk2byt3dXcOHD2cEq5YFBkqXXGJ0FfbVtaudRv7z8soduqV1a2255hrFjhunt/v1062rVpU5n5Kfr63XXKONY8bo7d27tT7ZOmL8cJcutuvuad9e969fX+Y6V0dHbb7mGv0wcqTuW79eJWazdfn7vDzbfvJ/Ot/95H18fJSV9dd+7VdddZU+++wzJSQkSJLMZrO2bt0qSRo+fLg+++wzFRcXK8Q9RHEr487Zf9OOTXXZrMv082s/69j2Y+ds7+781zMFQ4cO1cKFC5WTkyOLxaL//Oc/Zc4tW7ZMyX/8LmfPnm0716dPH+3atcu2h+b//vc/hYaGKvRinfoBAACAC5qhI+S5ubnq0qWLbrvtNo0dO7bc+ZdffllvvfWWPvnkE7Vo0UKPP/64RowYob1795YZ2YJ9dehg3WbbiLXL7M1kknr1khzs8dVTafntJXakpen5HTuUVlAgJwcHxWVlKb+kRO5O1v+0prRtK5PJpEZubhrbooV+SkxUv+BgrUhM1Nu7d+t0cbHMFovSCwvL9HvTHw/zR/n5yclkUnJenpp5eUlm8zn3k6+qW265RZMnT9bixYs1bdo03X777Xr55Zd1zTXXqKSkREVFRbriiivUo0cP3XHHHdq9e7fat28vF08XBbYI1KlD536GPrh9sC6bdZmWv7hcgx8YXGk7V0dXebl42d6PHj1amzZtUnR0tPz8/DRo0CDbjICOHTvqqaee0oABA+Tl5VXmz47GjRvr888/18SJE1VSUiJ/f3/FxMRUaxQdAAAAqCv1Zh9yk8mkr7/+WmPGjJFkHR0PCQnRzJkz9dBDD0mSsrKyFBQUpHnz5un666+vUr/sQ159Rm21XRvCw637j3t62qGz7dulP0amI+bP15fDh2vo0qX6ZfRo9WzSRNlFRfKdN08ZkybJz9VVEfPn65PBgzUoJESS9MD69Qp0c9OkNm0UvXChtlxzjVr5+GhnWpoGLlmizMmTJVmnrP/ZhyQ1+uQTbR07VhHe3tIDD0jt2tnhw5y/E6dP6JX1ryi3qGpbn1VF16ZddXu32+Xk8Nd3hKdPn7btLz5z5kzl5+fr/ffft9s9AQAAgNpS1Rxabxd1O3LkiJKTkzV8+HDbMV9fX/Xu3VsbNmyo9LrCwkJlZ2eXeaF6nJyk/v2to8sXusGD7RTGJevD6GcoKC1VkdmsMC/ryO7bFexPPm//fklSekGBvo6P17CQEGUVFcnZwUFNPTxksVj0zp49Vbu/yWTdUN1gTb2bqndob7v1Z5JJ/Zr3KxPGJWnixInq2rWr2rdvr4SEBD377LN2uycAAABQH9TbRd3+fD406I8Fsv4UFBRkO1eRF198UU8//XSt1tYQtGkj9e4tbdxodCXnr21b6Y/Ftu3D19caiAsLVWKxqIm7u57r0UO9Fi9WIzc3Xd+qVblLGru5qfuiRcoqKtK9HTqoX3CwJOn6Vq3UISZGga6uGnPG/tpn5eNjraEeGBA2QNuStimrMOvcjc+hR0gPtQlsU+74119/XeO+AQAAgPqs3gby8zVr1izNmDHD9j47O1vNmzc3sKILk6urNGKEtG/fWXfaqrfc3KSrr5a8ve3YaUCAFBCgE4cOKbuoSGFeXvpndLT+GR1ta/LnKup/ujEyUi/36VOuqzf79dOb/frZ3j/WrZvtZ8vUqWXanpo0yfpDUJB1Cfx6IMQnRNd1vE7/2f4flVrKP1tfVf7u/hrZeqTcnFgTAgAAAA1PvZ2yHvzHSGJKSkqZ4ykpKbZzFXF1dZWPj0+ZF85PSIg0fvyFOXX9yiulCgasa8bdXa8dPKjBS5bo1T595OFUx99ntW9vp9Xp7CM6OFrXdbyu3FTzqvJz89Pt3W5XqA8roAMAAKBhqrcj5C1atFBwcLBWrlyp6D9GILOzs7Vp0ybdfffdxhbXgHTqJPXpI53lsf16p21b63T72jDj8cc1w9vbugXZOcTfeKP9buzsLEVF2a8/O3BycNKAsAHycfVRzJ4YpeenV/naDo07aEy7MQrzDavFCgEAAID6zdBAnpOTo4MHD9reHzlyRLGxsQoICFBYWJgeeOABPffcc2rdurVt27OQkBDbSuyofa6u0uWXSwkJUmKi0dWcm5+fNG6cnaeqnyksTGrRQjp0qJZuUImOHaV6+OiFo4OjujXtphDvEG1J3KJ1CeuUWZBZYVuTTAr3C9fgiMHqHNRZni72Wm0PAAAAuDAZuu3ZqlWrNGTIkHLHJ02apHnz5slisejJJ5/Uhx9+qMzMTF1yySV677331KZN+QWgKsO2Z/Zx7Jh1x6+TJ42upHJeXtKdd1oXpKtV27dLH34o1dV/Ok5O0r33Gr7dWVWcyjulE6dPKDU3VUmnk1RUWiRPF0+F+YQp0CNQzX2ay8PFw+gyAQAAgFpV1Rxab/Yhry0EcvuJj7fuT14fQ7m3tzRlSh1l1sJC6X//k9avr4Obybq63tVXS46OdXM/AAAAADVywe9DjvonIsI6Ah1az9bg8ve31lVnA8iurtJll1nnx9e2kBBp0CDCOAAAAHARIpCjWpo3l6ZOlXr1qh+rr3foIN1zj9S6dR3fuGlTadIkyaMWp1/7+Eg33ywFBtbePQAAAAAYhkCOagsOtubE226zZkYjeHhIN9xgrSHMqIW627e3FuBZC4uT+ftbv/mw+95tAAAAAOoLniFHjSQmSsuWSVu21N0aZx06WPcZb9Gibu53TgcPSjEx1ofs7SEqSho7VgoPt09/AAAAAOoUi7r9gUBe+woLpX37pLVrpd9/l0pK7H8PBwfrYPGgQdZnxb287H+PGsnMtC7y9sMPUlHR+fXh7i5ddZXUs2ct7tsGAAAAoLYRyP9AIK87JSXS0aPSrl3WbJqVVfM+PT2t+bR7d+vUdDe3mvdZaywW6yj57t3Sr79KGRlVu65RI2ngQOsU+Hq41zgAAACA6iGQ/4FAboyTJ6WEBOv+5QcOWN9nZ597Wru3t3UNs8hI64ztZs2s66fVhwXkquXUKSkpSUpJsU5pT07+a+qAs7N19fRWraSgIOuHrIsV2wEAAADUCQL5HwjkxisttQ4WZ2VZ/5mfLxUXW/Opo6M1n7q7WzOpr68UECA5ORldtZ3l5ZUN5O7uxtYDAAAAoNZUNYdebLEH9ZCjo3VWdqNGRldioNrcHg0AAADABYltzwAAAAAAMACBHAAAAAAAAxDIAQAAAAAwAIEcAAAAAAADEMgBAAAAADAAgRwAAAAAAAMQyAEAAAAAMACBHAAAAAAAAxDIAQAAAAAwAIEcAAAAAAADEMgBAAAAADAAgRwAAAAAAAMQyAEAAAAAMACBHAAAAAAAAxDIAQAAAAAwAIEcAAAAQL0XERGh2NhYo8sA7IpADgAAAOCCVFJSYnQJQI0QyAEAAABcMAYPHqz77rtPffv21WWXXaaSkhKNGDFCPXr0UIcOHXTjjTcqNzdXkrRq1Sp17NhR99xzj7p06aIOHTpo69atBn8C4C8EcgAAAAAXlP3792vNmjX6+ef/b+/eo6oqEz6O/84BuQY46AhioqS+UshNDcdLdwybLE2xyyQRzYzW8oZa6dSYTmOal9HKMc1ZmeM4TFppkzppaIxDqKggqXnLJDMMMPMFL3GRs98/fD0TeUkRePDw/ax11oJ9eDa/47MOnt959t7nY7m5uSktLU3btm3Trl27FBAQoDlz5jh/du/evUpOTtann36qESNG6PnnnzeYHKiOQg4AAADgmjJ48GA1adJEkmRZlmbPnq3Y2FhFRUVp9erV1c41b9++vbp16yZJ6t69u7744gsTkYELopADAAAAuKZcd911zq/T0tL08ccfa8OGDdq5c6eefvpplZWVOe/38vJyfu3m5sZ552hQKOQAAAAArlnHjx9X8+bN5e/vrxMnTmjRokWmIwGXjUIOAAAA4Jr12GOP6fTp0+rYsaPuuece3XLLLaYjAZfNZlmWZTpEXSotLVVAQIBKSkrk7+9vOg4AAAAAwMVdbg9lhRwAAAAAAAMo5AAAAAAAGEAhBwAAAADAAAo5AAAAAAAGUMgBAAAAADCAQg4AAAAAgAEUcgAAAAAADKCQAwAAAABgAIUcAAAAAAADKOQAAAAAABhAIQcAAAAAwAAKOQAAAAAABlDIAQAAAAAwgEIOAAAAAIABFHIAAAAAAAygkAMAADRGDof0/fdSZaXpJADQaLmbDgAAAIB64nBIX38t7d0r5eRI5eWSm5vUtq10881SmzaSt7fplADQaFDIAQAAGoPvvpPWrJGys6Wysur3ff21lJUlhYVJAwZIHTqYyQgAjQyHrAMAALi6776TliyRNmw4v4yfY1nSwYPSvHlnV9ABAHWOQg4AAGDI8uXL1aVLF8XExCg8PFx33nmnHA7HVe1z0qRJKvtB6X48OVmvjBwpffbZT45tm5amvEOHpEWLVJafr379+mnQoEGqqKi4qkwAgAujkAMAABjwzTffaMiQIVq+fLny8vK0d+9ezZw5Uzab7ar2+4c//KFaIdepU9KhQ1e0jxNFRbpnwAAFBQVp6dKl8vDwuKxxDofjqt9QAIDGhEIOAABgQFFRkdzc3BQYGOjc1rlzZ2ch37Ztm3r06KGoqCjFxcUpKytLkvTll1+qadOmzjEnT550jnnyySclSbfccotiYmJUXFwslZRoz7ff6q5Vq/Q/S5dqwEcfqaKq6qK5jpWX687Vq9XN11cLZs6U3X725eKMGTMUERGhyMhIPfrooyopKZF0dkV+4MCBSkhIUKdOnfTNN99o7dq16tWrl7p06aK4uDhlZGRIkgoLC3XHHXeoS5cuioiI0PDhwynwABo1CjkAAIABUVFR6tWrl9q0aaMHHnhAM2bMUEFBgSSpoqJCAwYM0MSJE7Vjxw7NmjVLAwcO1MmTJy+5z/nz50uSMjMzlZeXpxZNm0rffqu8Y8e0sk8f7Rk0SEXff6/38vMvuo+H1q1TfKtWejkiQiouliR9+OGHWrhwobKysrRz5075+vpq/PjxzjGbNm3S4sWLtXv3bpWXl2vSpEn617/+pZycHKWlpelXv/qVysvL1bRpU61cuVI5OTnasWOHvvzySy1btuwq/yUB4NpFIQcAADDAbrfrvffe08aNG9WnTx9lZWUpIiJCBw4c0L59+2S325WQkCBJ6tWrl4KCgpSXl3dlv6S8XHI49EBYmHzc3eVmtyvu5z/XF6WlFx1yb2io3j14UIdPnjw7XtK6dev00EMPOVfmn3rqKaWnpzvH/PKXv1RQUJAkac2aNTpw4IBuvfVWxcTEKDExUXa7XV999ZUcDofGjRun6OhoxcbGatu2bVf+mADAhfCxZwAAAAaFh4crPDxcQ4cOVZ8+ffTBBx+od+/e5/3cucPS3d3dVfWDQ87LLnbVdOnsZ4zbbPJyc/vvJrtdZy5xmPjoyEhFN2um21euVMavf63QiIiLZjnnuuuuc35tWZZ69+6ttLS088ZNnjxZxcXFys7OlpeXl8aMGXPp/ADg4lghBwAAMKCgoMB5XrgkHT9+XPn5+WrXrp06duwoh8PhXIXeuHGjCgsLFRMTo+DgYFmWpd27d0uSFi9eXG2/fn5+zvO75eUleXtfcbYxUVEaERur21NSdOjQIcXHx2vZsmUq/f+V9TfeeEN33333BccmJCRo3bp12rFjh3Pbli1bnI8xODhYXl5eKiws1DvvvHPF2QDAlbBCDgAAYMCZM2f04osvKj8/Xz4+Pjpz5oySk5PVr18/SWc/Em3kyJEaO3asvLy89O677zpXoufMmaO+ffuqWbNmSkxMrLbfsWPHqnfv3vLx8dFHH30ktWghHT16xflSn3hC9v/9X912223KyMhQSkqKunfvLrvdrqioKL3++usXHNe+fXulpaVp6NChOn36tCoqKhQbG6u0tDSNGjVKiYmJioiIUEhIiOLj4684FwC4EptlWZbpEHWptLRUAQEBKikpkb+/v+k4AAAA9evECWnWLOnIkcsfY7NJo0ZJN95Yd7kAwIVdbg/lkHUAAABX5ucnJSaePXz9cvXpI7VrV3eZAACSKOQAAACuLyJCeuIJydf30j9ns50t4/HxkodH/WQDgEaMc8gBAAAag+hoKTVV+uwzKTNTOnbsv/d5ekoxMdIvfnF2ZdzT01RKAGhUKOQAAACNRWjo2Vu3blJRkVRZefaj0fz9pVatJDsHTwJAfaKQAwAANDaBgWdvAACjeBsUAAAAAAADKOQAAAAAABhAIQcAAAAAwAAKOQAAAAAABlDIAQAAAAAwgEIOAAAAAIAB10Qhnzt3rtq2bSsvLy9169ZNW7ZsMR0JAAAAAICr0uAL+dKlSzVmzBhNnDhRubm5io6OVkJCgoqLi01HAwAAAACgxhp8IZ81a5Z++9vfKiUlRTfddJPmz58vHx8fLVy40HQ0AAAAAABqrEEX8oqKCuXk5Cg+Pt65zW63Kz4+Xps2bbrgmPLycpWWlla7AQAAAADQ0DToQv7tt9+qqqpKQUFB1bYHBQWpsLDwgmOmTp2qgIAA561169b1ERUAAAAAgCvSoAt5Tfzud79TSUmJ83b48GHTkQAAAAAAOI+76QCX0rx5c7m5uamoqKja9qKiIgUHB19wjKenpzw9PesjHgAAAAAANdagV8g9PDzUpUsXrV+/3rnN4XBo/fr16t69u8FkAAAAAABcnQa9Qi5JY8aMUXJysrp27aq4uDi98sorOnXqlFJSUkxHAwAAAACgxhp8IX/ooYd09OhRvfDCCyosLFRMTIzWrFlz3oXeAAAAAAC4ltgsy7JMh6hLpaWlCggIUElJifz9/U3HAQAAAAC4uMvtoQ36HHIAAAAAAFxVgz9k/WqdOwCgtLTUcBIAAAAAQGNwrn/+1AHpLl/IT5w4IUlq3bq14SQAAAAAgMbkxIkTCggIuOj9Ln8OucPh0JEjR+Tn5yebzWY6Dn6gtLRUrVu31uHDhzm/3wUxv66POXZ9zLHrY45dG/Pr+pjjhsuyLJ04cUIhISGy2y9+prjLr5Db7XZdf/31pmPgEvz9/fkD4sKYX9fHHLs+5tj1Mceujfl1fcxxw3SplfFzuKgbAAAAAAAGUMgBAAAAADCAQg5jPD09NXHiRHl6epqOgjrA/Lo+5tj1Mceujzl2bcyv62OOr30uf1E3AAAAAAAaIlbIAQAAAAAwgEIOAAAAAIABFHIAAAAAAAygkAMAAAAAYACFHPVq6tSpuvnmm+Xn56cWLVqof//+2rdvn+lYqEMvv/yybDabUlNTTUdBLSooKNDgwYPVrFkzeXt7KzIyUtu2bTMdC7WgqqpKEyZMUFhYmLy9vdWuXTv98Y9/FNeAvXb95z//0X333aeQkBDZbDa9//771e63LEsvvPCCWrZsKW9vb8XHx+vzzz83ExY1cqk5rqys1Lhx4xQZGSlfX1+FhIToscce05EjR8wFxhX7qefxDz355JOy2Wx65ZVX6i0fao5Cjnq1YcMGDRs2TJs3b1Z6eroqKyt1991369SpU6ajoQ5s3bpVb7zxhqKiokxHQS06fvy4evbsqSZNmujDDz/U7t279ac//Uk/+9nPTEdDLZg2bZrmzZunP//5z9qzZ4+mTZum6dOna86cOaajoYZOnTql6OhozZ0794L3T58+Xa+99prmz5+v7Oxs+fr6KiEhQWVlZfWcFDV1qTk+ffq0cnNzNWHCBOXm5mr58uXat2+f7r//fgNJUVM/9Tw+Z8WKFdq8ebNCQkLqKRmuFh97BqOOHj2qFi1aaMOGDbr11ltNx0EtOnnypDp37qzXX39dkydPVkxMDO/Uuojx48crKytLmZmZpqOgDvTt21dBQUF68803ndsGDhwob29vLVmyxGAy1AabzaYVK1aof//+ks6ujoeEhGjs2LF6+umnJUklJSUKCgrSokWL9PDDDxtMi5r48RxfyNatWxUXF6dDhw4pNDS0/sKhVlxsjgsKCtStWzetXbtW9957r1JTUzlC8RrACjmMKikpkSQFBgYaToLaNmzYMN17772Kj483HQW17IMPPlDXrl01aNAgtWjRQrGxsfrLX/5iOhZqSY8ePbR+/Xrt379fkvTpp5/qk08+0T333GM4GepCfn6+CgsLq/2tDggIULdu3bRp0yaDyVCXSkpKZLPZ1LRpU9NRUEscDoeSkpL0zDPPKCIiwnQcXAF30wHQeDkcDqWmpqpnz57q1KmT6TioRW+//bZyc3O1detW01FQBw4ePKh58+ZpzJgxeu6557R161aNHDlSHh4eSk5ONh0PV2n8+PEqLS1VeHi43NzcVFVVpZdeekmPPvqo6WioA4WFhZKkoKCgatuDgoKc98G1lJWVady4cXrkkUfk7+9vOg5qybRp0+Tu7q6RI0eajoIrRCGHMcOGDdOuXbv0ySefmI6CWnT48GGNGjVK6enp8vLyMh0HdcDhcKhr166aMmWKJCk2Nla7du3S/PnzKeQuYNmyZfr73/+utLQ0RUREKC8vT6mpqQoJCWF+gWtcZWWlHnzwQVmWpXnz5pmOg1qSk5OjV199Vbm5ubLZbKbj4ApxyDqMGD58uFatWqWMjAxdf/31puOgFuXk5Ki4uFidO3eWu7u73N3dtWHDBr322mtyd3dXVVWV6Yi4Si1bttRNN91UbduNN96or776ylAi1KZnnnlG48eP18MPP6zIyEglJSVp9OjRmjp1quloqAPBwcGSpKKiomrbi4qKnPfBNZwr44cOHVJ6ejqr4y4kMzNTxcXFCg0Ndb72OnTokMaOHau2bduajoefwAo56pVlWRoxYoRWrFihf//73woLCzMdCbXsrrvu0s6dO6ttS0lJUXh4uMaNGyc3NzdDyVBbevbsed7HFe7fv19t2rQxlAi16fTp07Lbq79f7+bmJofDYSgR6lJYWJiCg4O1fv16xcTESJJKS0uVnZ2tp556ymw41JpzZfzzzz9XRkaGmjVrZjoSalFSUtJ51+xJSEhQUlKSUlJSDKXC5aKQo14NGzZMaWlp+uc//yk/Pz/n+WkBAQHy9vY2nA61wc/P77xrAvj6+qpZs2ZcK8BFjB49Wj169NCUKVP04IMPasuWLVqwYIEWLFhgOhpqwX333aeXXnpJoaGhioiI0Pbt2zVr1iw98cQTpqOhhk6ePKkDBw44v8/Pz1deXp4CAwMVGhqq1NRUTZ48WR06dFBYWJgmTJigkJCQS16lGw3Lpea4ZcuWSkxMVG5urlatWqWqqirn66/AwEB5eHiYio0r8FPP4x+/ydKkSRMFBwerY8eO9R0VV8oC6pGkC97eeust09FQh2677TZr1KhRpmOgFq1cudLq1KmT5enpaYWHh1sLFiwwHQm1pLS01Bo1apQVGhpqeXl5WTfccIP1/PPPW+Xl5aajoYYyMjIu+H9vcnKyZVmW5XA4rAkTJlhBQUGWp6enddddd1n79u0zGxpX5FJznJ+ff9HXXxkZGaaj4zL91PP4x9q0aWPNnj27XjOiZvgccgAAAAAADOCibgAAAAAAGEAhBwAAAADAAAo5AAAAAAAGUMgBAAAAADCAQg4AAAAAgAEUcgAAAAAADKCQAwAAAABgAIUcAAAAAAADKOQAAOCq2Ww2vf/++6ZjAABwTaGQAwDgwh5//HHZbDbZbDY1adJEYWFhevbZZ1VWVmY6GgAAjZ676QAAAKBu9enTR2+99ZYqKyuVk5Oj5ORk2Ww2TZs2zXQ0AAAaNVbIAQBwcZ6engoODlbr1q3Vv39/xcfHKz09XZJ07NgxPfLII2rVqpV8fHwUGRmpf/zjH9XG33777Ro5cqSeffZZBQYGKjg4WJMmTbrk75w4caJatmypHTt21NXDAgDgmkchBwCgEdm1a5c2btwoDw8PSVJZWZm6dOmi1atXa9euXRoyZIiSkpK0ZcuWauP++te/ytfXV9nZ2Zo+fbpefPFFZ6n/IcuyNGLECC1evFiZmZmKioqql8cFAMC1yGZZlmU6BAAAqBuPP/64lixZIi8vL505c0bl5eWy2+1atmyZBg4ceMExffv2VXh4uGbOnCnp7Ap5VVWVMjMznT8TFxenO++8Uy+//LKksxd1e+edd7RixQpt375d6enpatWqVd0/QAAArmGcQw4AgIu74447NG/ePJ06dUqzZ8+Wu7u7s4xXVVVpypQpWrZsmQoKClRRUaHy8nL5+PhU28ePV7pbtmyp4uLiattGjx4tT09Pbd68Wc2bN6/bBwUAgAvgkHUAAFycr6+v2rdvr+joaC1cuFDZ2dl68803JUkzZszQq6++qnHjxikjI0N5eXlKSEhQRUVFtX00adKk2vc2m00Oh6Patt69e6ugoEBr166t2wcEAICLoJADANCI2O12Pffcc/r973+v77//XllZWerXr58GDx6s6Oho3XDDDdq/f3+N9n3//fcrLS1Nv/nNb/T222/XcnIAAFwPhRwAgEZm0KBBcnNz09y5c9WhQwelp6dr48aN2rNnj4YOHaqioqIa7/uBBx7Q3/72N6WkpOjdd9+txdQAALgeziEHAKCRcXd31/DhwzV9+nRt375dBw8eVEJCgnx8fDRkyBD1799fJSUlNd5/YmKiHA6HkpKSZLfbNWDAgFpMDwCA6+Aq6wAAAAAAGMAh6wAAAAAAGEAhBwAAAADAAAo5AAAAAAAGUMgBAAAAADCAQg4AAAAAgAEUcgAAAAAADKCQAwAAAABgAIUcAAAAAAADKOQAAAAAABhAIQcAAAAAwAAKOQAAAAAABvwf9SrECvcXFgsAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 1200x800 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"\n",
"def task_fifteen(data):\n",
" continent_colors = {\n",
" 'Asia': 'red', 'Australia': 'yellow', 'Europe': 'green', \n",
" 'North America': 'blue', 'South America': 'orange'\n",
" }\n",
" \n",
" data['Color'] = data['Continent'].map(continent_colors)\n",
" \n",
" # Побудова бульбашкової діаграми\n",
" plt.figure(figsize=(12, 8))\n",
" plt.scatter(\n",
" data['Rank'], data['% Renewable'], \n",
" s=data['2015'] / 1e10, # Масштабування розміру бульбашок\n",
" c=data['Color'], alpha=0.6, edgecolors=\"w\", linewidth=0.5\n",
" )\n",
" \n",
" for i, country in enumerate(data.index):\n",
" plt.text(data['Rank'][i], data['% Renewable'][i], country, ha='center', va='center', fontsize=8)\n",
"\n",
" # Підпис осей та заголовок\n",
" plt.xlabel('Rank')\n",
" plt.ylabel('% Renewable')\n",
" plt.title('Bubble chart')\n",
" plt.show()\n",
"\n",
"\n",
"task_fifteen(final_data)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "bcca3423-4203-453a-afe1-bd0df4be4ff6",
"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.8.19"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
%% Cell type:code id:37adaf49-0222-4be7-8977-5957e21e6792 tags:
```
python
!
pip
install
xlrd
```
%% Output
Collecting xlrd
Downloading xlrd-2.0.1-py2.py3-none-any.whl.metadata (3.4 kB)
Downloading xlrd-2.0.1-py2.py3-none-any.whl (96 kB)
Installing collected packages: xlrd
Successfully installed xlrd-2.0.1
%% Cell type:code id:687a9237-70e6-4c71-9f07-b2312dd79040 tags:
```
python
!
pip
install
openpyxl
```
%% Output
Collecting openpyxl
Downloading openpyxl-3.1.5-py2.py3-none-any.whl.metadata (2.5 kB)
Collecting et-xmlfile (from openpyxl)
Downloading et_xmlfile-2.0.0-py3-none-any.whl.metadata (2.7 kB)
Downloading openpyxl-3.1.5-py2.py3-none-any.whl (250 kB)
Downloading et_xmlfile-2.0.0-py3-none-any.whl (18 kB)
Installing collected packages: et-xmlfile, openpyxl
Successfully installed et-xmlfile-2.0.0 openpyxl-3.1.5
%% Cell type:code id:af57f689-9056-483e-b262-81a4561030c9 tags:
```
python
# Імпорт необхідних бібліотек
import
pandas
as
pd
import
numpy
as
np
# Завантаження файлу Excel
file_path
=
'
C:/Users/skiba/python_khpi/En_In.xls
'
energy_data
=
pd
.
read_excel
(
file_path
,
skiprows
=
17
,
usecols
=
"
C:F
"
)
# Перейменування стовпців
energy_data
.
columns
=
[
'
Country
'
,
'
Energy Supply
'
,
'
Energy Supply per Capita
'
,
'
% Renewable
'
]
# Перетворення 'Energy Supply' у ГДж, заміна '...' на NaN
energy_data
[
'
Energy Supply
'
]
=
pd
.
to_numeric
(
energy_data
[
'
Energy Supply
'
],
errors
=
'
coerce
'
)
*
1_000_000
# Очищення назв країн від цифр та тексту в дужках
energy_data
[
'
Country
'
]
=
energy_data
[
'
Country
'
].
str
.
replace
(
r
'
\d+|\(.*\)
'
,
''
,
regex
=
True
).
str
.
strip
()
# Перейменування вказаних країн
country_renames
=
{
"
Republic of Korea
"
:
"
South Korea
"
,
"
United States of America
"
:
"
United States
"
,
"
United Kingdom of Great Britain and Northern Ireland
"
:
"
United Kingdom
"
,
"
China, Hong Kong Special Administrative Region
"
:
"
Hong Kong
"
}
energy_data
[
'
Country
'
]
=
energy_data
[
'
Country
'
].
replace
(
country_renames
)
# Фільтрація для перевірки результату (American Samoa, South Korea, Bolivia)
filtered_countries
=
energy_data
.
loc
[
energy_data
[
'
Country
'
].
isin
([
'
American Samoa
'
,
'
South Korea
'
,
'
Bolivia
'
])]
filtered_countries
```
%% Output
Country Energy Supply Energy Supply per Capita % Renewable
3 American Samoa NaN ... 0.641026
24 Bolivia 3.360000e+08 32 31.477120
164 South Korea 1.100700e+10 221 2.279353
%% Cell type:code id:c4b4031d-5205-44e0-b0fa-e3585b18ec53 tags:
```
python
import
pandas
as
pd
gdp_data
=
pd
.
read_csv
(
'
C:/Users/skiba/python_khpi/gpd.csv
'
,
skiprows
=
4
)
country_renames
=
{
"
Korea, Rep.
"
:
"
South Korea
"
,
"
Iran, Islamic Rep.
"
:
"
Iran
"
,
"
Hong Kong SAR, China
"
:
"
Hong Kong
"
}
gdp_data
[
'
Country Name
'
]
=
gdp_data
[
'
Country Name
'
].
replace
(
country_renames
)
gdp_data
.
head
(
1
)
```
%% Output
Country Name Country Code Indicator Name \
0 Aruba ABW GDP at market prices (constant 2010 US$)
Indicator Code 1960 1961 1962 1963 1964 1965 ... 2006 2007 2008 \
0 NY.GDP.MKTP.KD NaN NaN NaN NaN NaN NaN ... NaN NaN NaN
2009 2010 2011 2012 2013 2014 2015
0 NaN 2.467704e+09 NaN NaN NaN NaN NaN
[1 rows x 60 columns]
%% Cell type:code id:22abd678-8561-410c-ab1d-58ee49394567 tags:
```
python
import
pandas
as
pd
scimago_data
=
pd
.
read_excel
(
'
C:/Users/skiba/python_khpi/scimagojr.xlsx
'
)
scimago_top15
=
scimago_data
[
scimago_data
[
'
Rank
'
]
<=
15
]
energy_data
=
pd
.
read_excel
(
'
C:/Users/skiba/python_khpi/En_In.xls
'
,
skiprows
=
17
,
usecols
=
"
C:F
"
)
energy_data
.
columns
=
[
'
Country
'
,
'
Energy Supply
'
,
'
Energy Supply per Capita
'
,
'
% Renewable
'
]
energy_data
[
'
Energy Supply
'
]
=
pd
.
to_numeric
(
energy_data
[
'
Energy Supply
'
],
errors
=
'
coerce
'
)
*
1_000_000
energy_data
[
'
Country
'
]
=
energy_data
[
'
Country
'
].
str
.
replace
(
r
'
\d+|\(.*\)
'
,
''
,
regex
=
True
).
str
.
strip
()
country_renames
=
{
"
Republic of Korea
"
:
"
South Korea
"
,
"
United States of America
"
:
"
United States
"
,
"
United Kingdom of Great Britain and Northern Ireland
"
:
"
United Kingdom
"
,
"
China, Hong Kong Special Administrative Region
"
:
"
Hong Kong
"
}
energy_data
[
'
Country
'
]
=
energy_data
[
'
Country
'
].
replace
(
country_renames
)
gdp_data
=
pd
.
read_csv
(
'
C:/Users/skiba/python_khpi/gpd.csv
'
,
skiprows
=
4
)
gdp_data
.
rename
(
columns
=
{
'
Country Name
'
:
'
Country
'
},
inplace
=
True
)
gdp_filtered
=
gdp_data
[[
'
Country
'
,
'
2006
'
,
'
2007
'
,
'
2008
'
,
'
2009
'
,
'
2010
'
,
'
2011
'
,
'
2012
'
,
'
2013
'
,
'
2014
'
,
'
2015
'
]]
gdp_country_renames
=
{
"
Korea, Rep.
"
:
"
South Korea
"
,
"
Iran, Islamic Rep.
"
:
"
Iran
"
,
"
Hong Kong SAR, China
"
:
"
Hong Kong
"
}
# Заміна назв країн у GDP із використанням .loc
gdp_filtered
.
loc
[:,
'
Country
'
]
=
gdp_filtered
[
'
Country
'
].
replace
(
gdp_country_renames
)
# Об'єднання даних
merged_data
=
scimago_top15
.
merge
(
energy_data
,
how
=
'
inner
'
,
on
=
'
Country
'
)
merged_data
=
merged_data
.
merge
(
gdp_filtered
,
how
=
'
inner
'
,
on
=
'
Country
'
)
final_columns
=
[
'
Rank
'
,
'
Documents
'
,
'
Citable documents
'
,
'
Citations
'
,
'
Self-citations
'
,
'
Citations per document
'
,
'
H index
'
,
'
Energy Supply
'
,
'
Energy Supply per Capita
'
,
'
% Renewable
'
,
'
2006
'
,
'
2007
'
,
'
2008
'
,
'
2009
'
,
'
2010
'
,
'
2011
'
,
'
2012
'
,
'
2013
'
,
'
2014
'
,
'
2015
'
]
final_data
=
merged_data
.
set_index
(
'
Country
'
)[
final_columns
]
print
(
final_data
.
shape
)
final_data
.
head
(
3
)
```
%% Output
(15, 20)
Rank Documents Citable documents Citations Self-citations \
Country
China 1 127050 126767 597237 411683
United States 2 96661 94747 792274 265436
Japan 3 30504 30287 223024 61554
Citations per document H index Energy Supply \
Country
China 4.70 138 1.271910e+11
United States 8.20 230 9.083800e+10
Japan 7.31 134 1.898400e+10
Energy Supply per Capita % Renewable 2006 \
Country
China 93 19.75491 3.992331e+12
United States 286 11.57098 1.479230e+13
Japan 149 10.23282 5.496542e+12
2007 2008 2009 2010 \
Country
China 4.559041e+12 4.997775e+12 5.459247e+12 6.039659e+12
United States 1.505540e+13 1.501149e+13 1.459484e+13 1.496437e+13
Japan 5.617036e+12 5.558527e+12 5.251308e+12 5.498718e+12
2011 2012 2013 2014 \
Country
China 6.612490e+12 7.124978e+12 7.672448e+12 8.230121e+12
United States 1.520402e+13 1.554216e+13 1.577367e+13 1.615662e+13
Japan 5.473738e+12 5.569102e+12 5.644659e+12 5.642884e+12
2015
Country
China 8.797999e+12
United States 1.654857e+13
Japan 5.669563e+12
%% Cell type:code id:e1294e32-5a5b-4632-aaed-f247d7c944cb tags:
```
python
def
task_eight
(
data
):
# Обчислення середнього значення ВВП за період з 2006 по 2015 рік
avg_gdp
=
data
.
loc
[:,
'
2006
'
:
'
2015
'
].
mean
(
axis
=
1
)
# Сортування за спаданням
avg_gdp_sorted
=
avg_gdp
.
sort_values
(
ascending
=
False
)
avg_gdp_sorted
.
name
=
'
avgGDP
'
return
avg_gdp_sorted
task_eight_result
=
task_eight
(
final_data
)
task_eight_result
```
%% Output
Country
United States 1.536434e+13
China 6.348609e+12
Japan 5.542208e+12
Germany 3.493025e+12
France 2.681725e+12
United Kingdom 2.487907e+12
Brazil 2.189794e+12
Italy 2.120175e+12
India 1.769297e+12
Canada 1.660647e+12
Russian Federation 1.565459e+12
Spain 1.418078e+12
Australia 1.164043e+12
South Korea 1.106715e+12
Iran 4.441558e+11
Name: avgGDP, dtype: float64
%% Cell type:code id:c303dc26-4820-49af-bf8e-b504883c9c39 tags:
```
python
# Функція для обчислення зміни ВВП для країни з 5-м найвищим середнім ВВП
def
task_nine
(
data
):
# Обчислення середнього ВВП кожної країни за останні 10 років та сортування за спаданням
avg_gdp
=
data
.
loc
[:,
'
2006
'
:
'
2015
'
].
mean
(
axis
=
1
).
sort_values
(
ascending
=
False
)
# Отримання країни з 5-м найвищим середнім ВВП
fifth_country
=
avg_gdp
.
index
[
4
]
# Обчислення зміни ВВП за останні 10 років для цієї країни
gdp_change
=
data
.
loc
[
fifth_country
,
'
2015
'
]
-
data
.
loc
[
fifth_country
,
'
2006
'
]
return
(
fifth_country
,
gdp_change
)
task_nine_result
=
task_nine
(
final_data
)
task_nine_result
```
%% Output
('France', 153345695364.24023)
%% Cell type:code id:0f5c8f0e-f124-43bb-8181-9a77c0e959ff tags:
```
python
# Функція для визначення країни з максимальним відсотком поновлюваних джерел енергії
def
task_ten
(
data
):
# Знаходимо країну з найбільшим % Renewable
max_renewable_country
=
data
[
'
% Renewable
'
].
idxmax
()
# Отримуємо значення максимального % Renewable
max_renewable_value
=
data
.
loc
[
max_renewable_country
,
'
% Renewable
'
]
return
(
max_renewable_country
,
max_renewable_value
)
task_ten_result
=
task_ten
(
final_data
)
task_ten_result
```
%% Output
('Brazil', 69.64803)
%% Cell type:code id:3d83b785-0fad-4101-99af-88bda4360a73 tags:
```
python
# Функція для оцінки чисельності населення та визначення шостої країни за населенням
def
task_eleven
(
data
):
# Оцінка чисельності населення
data
[
'
Estimated Population
'
]
=
data
[
'
Energy Supply
'
]
/
data
[
'
Energy Supply per Capita
'
]
# Сортування за населенням за спаданням
sorted_population
=
data
[
'
Estimated Population
'
].
sort_values
(
ascending
=
False
)
# Отримання 6-ї країни за населенням
sixth_country
=
sorted_population
.
index
[
5
]
sixth_population
=
sorted_population
.
iloc
[
5
]
return
(
sixth_country
,
sixth_population
)
task_eleven_result
=
task_eleven
(
final_data
)
task_eleven_result
```
%% Output
('Japan', 127409395.97315437)
%% Cell type:code id:4b01c65d-49cd-4a01-a7d1-e7c024543761 tags:
```
python
# Функція для обчислення кореляції між цитованими документами на душу населення та енергопостачанням на душу населення
def
task_twelve
(
data
):
# Оцінка чисельності населення
data
[
'
Estimated Population
'
]
=
data
[
'
Energy Supply
'
]
/
data
[
'
Energy Supply per Capita
'
]
# Обчислення цитованих документів на душу населення
data
[
'
Cited Documents per Capita
'
]
=
data
[
'
Citable documents
'
]
/
data
[
'
Estimated Population
'
]
# Переконуємося, що дані числові, і видаляємо пропущені значення
data_cleaned
=
data
[[
'
Cited Documents per Capita
'
,
'
Energy Supply per Capita
'
]].
dropna
()
data_cleaned
=
data_cleaned
.
apply
(
pd
.
to_numeric
,
errors
=
'
coerce
'
).
dropna
()
# Забезпечуємо числовий тип даних
# Обчислення кореляції
correlation
=
data_cleaned
[
'
Cited Documents per Capita
'
].
corr
(
data_cleaned
[
'
Energy Supply per Capita
'
])
return
correlation
task_twelve_result
=
task_twelve
(
final_data
)
task_twelve_result
```
%% Output
0.7940010435442946
%% Cell type:code id:cfb7eaa8-6bc1-4df5-99ad-bf373fd8124d tags:
```
python
# Функція для створення нового стовпця на основі медіани % Renewable
def
task_thirteen
(
data
):
# Обчислення медіани для % Renewable
renewable_median
=
data
[
'
% Renewable
'
].
median
()
# Створення нового стовпця: 1, якщо % Renewable >= медіани, інакше 0
data
[
'
High Renewable
'
]
=
(
data
[
'
% Renewable
'
]
>=
renewable_median
).
astype
(
int
)
# Повертаємо Series, відсортований за Rank у порядку зростання, індексований за назвою країни
sorted_series
=
data
[
'
High Renewable
'
].
sort_index
(
ascending
=
True
)
return
sorted_series
task_thirteen_result
=
task_thirteen
(
final_data
)
task_thirteen_result
```
%% Output
Country
Australia 0
Brazil 1
Canada 1
China 1
France 1
Germany 1
India 0
Iran 0
Italy 1
Japan 0
Russian Federation 1
South Korea 0
Spain 1
United Kingdom 0
United States 0
Name: High Renewable, dtype: int32
%% Cell type:code id:d2402833-9146-4a85-9efa-a63f81268620 tags:
```
python
def
task_forteen
(
data
):
# Словник континентів
ContinentDict
=
{
'
China
'
:
'
Asia
'
,
'
United States
'
:
'
North America
'
,
'
Japan
'
:
'
Asia
'
,
'
United Kingdom
'
:
'
Europe
'
,
'
Russian Federation
'
:
'
Europe
'
,
'
Canada
'
:
'
North America
'
,
'
Germany
'
:
'
Europe
'
,
'
India
'
:
'
Asia
'
,
'
France
'
:
'
Europe
'
,
'
South Korea
'
:
'
Asia
'
,
'
Italy
'
:
'
Europe
'
,
'
Spain
'
:
'
Europe
'
,
'
Iran
'
:
'
Asia
'
,
'
Australia
'
:
'
Australia
'
,
'
Brazil
'
:
'
South America
'
}
data
[
'
Estimated Population
'
]
=
data
[
'
Energy Supply
'
]
/
data
[
'
Energy Supply per Capita
'
]
data
[
'
Continent
'
]
=
data
.
index
.
to_series
().
map
(
ContinentDict
)
continent_stats
=
data
.
groupby
(
'
Continent
'
)[
'
Estimated Population
'
].
agg
([
'
size
'
,
'
sum
'
,
'
mean
'
,
'
std
'
])
return
continent_stats
task_forteen_result
=
task_forteen
(
final_data
)
task_forteen_result
```
%% Output
size sum mean std
Continent
Asia 5 2898666386.6106 579733277.32212 6.790979e+08
Australia 1 23316017.316017 23316017.316017 NaN
Europe 6 457929667.216372 76321611.202729 3.464767e+07
North America 2 352855249.48025 176427624.740125 1.996696e+08
South America 1 205915254.237288 205915254.237288 NaN
%% Cell type:code id:791927f6-9b3d-47b8-b852-405420083db6 tags:
```
python
import
matplotlib.pyplot
as
plt
def
task_fifteen
(
data
):
continent_colors
=
{
'
Asia
'
:
'
red
'
,
'
Australia
'
:
'
yellow
'
,
'
Europe
'
:
'
green
'
,
'
North America
'
:
'
blue
'
,
'
South America
'
:
'
orange
'
}
data
[
'
Color
'
]
=
data
[
'
Continent
'
].
map
(
continent_colors
)
# Побудова бульбашкової діаграми
plt
.
figure
(
figsize
=
(
12
,
8
))
plt
.
scatter
(
data
[
'
Rank
'
],
data
[
'
% Renewable
'
],
s
=
data
[
'
2015
'
]
/
1e10
,
# Масштабування розміру бульбашок
c
=
data
[
'
Color
'
],
alpha
=
0.6
,
edgecolors
=
"
w
"
,
linewidth
=
0.5
)
for
i
,
country
in
enumerate
(
data
.
index
):
plt
.
text
(
data
[
'
Rank
'
][
i
],
data
[
'
% Renewable
'
][
i
],
country
,
ha
=
'
center
'
,
va
=
'
center
'
,
fontsize
=
8
)
# Підпис осей та заголовок
plt
.
xlabel
(
'
Rank
'
)
plt
.
ylabel
(
'
% Renewable
'
)
plt
.
title
(
'
Bubble chart
'
)
plt
.
show
()
task_fifteen
(
final_data
)
```
%% Output
%% Cell type:code id:bcca3423-4203-453a-afe1-bd0df4be4ff6 tags:
```
python
```
This diff is collapsed.
Click to expand it.
Lab5.ipynb
0 → 100644
+
187
−
0
View file @
e69af998
This diff is collapsed.
Click to expand it.
Lab6.ipynb
0 → 100644
+
262
−
0
View file @
e69af998
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment