{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Работа с NumPy"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"matrix = np.array([[4, 5, 0], [9, 9, 9]])\n",
"print(\"matrix = \\n\", matrix, \"\\n\")\n",
"\n",
"tmatrix = matrix.T\n",
"print(\"tmatrix = \\n\", tmatrix, \"\\n\")\n",
"\n",
"vector = np.ravel(matrix)\n",
"print(\"vector = \\n\", vector, \"\\n\")\n",
"\n",
"tvector = np.reshape(vector, (6, 1))\n",
"print(\"tvector = \\n\", tvector, \"\\n\")\n",
"\n",
"list_matrix = list(matrix)\n",
"print(\"list_matrix = \\n\", list_matrix, \"\\n\")\n",
"\n",
"str_matrix = str(matrix)\n",
"print(\"matrix as str = \\n\", str_matrix, \"\\n\")\n",
"\n",
"print(\"matrix type is\", type(matrix), \"\\n\")\n",
"\n",
"print(\"vector type is\", type(vector), \"\\n\")\n",
"\n",
"print(\"list_matrix type is\", type(list_matrix), \"\\n\")\n",
"\n",
"print(\"str_matrix type is\", type(str_matrix), \"\\n\")\n",
"\n",
"formatted_vector = \"; \".join(map(str, vector))\n",
"print(\"formatted_vector = \\n\", formatted_vector, \"\\n\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Работа с Pandas DataFrame\n",
"\n",
"https://pandas.pydata.org/docs/user_guide/10min.html"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Работа с данными - чтение и запись CSV"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"\n",
"df = pd.read_csv(\"data/titanic.csv\", index_col=\"PassengerId\")\n",
"\n",
"df.to_csv(\"test.csv\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Работа с данными - основные команды"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df.info()\n",
"\n",
"print(df.describe().transpose())\n",
"\n",
"cleared_df = df.drop([\"Name\", \"Ticket\", \"Embarked\"], axis=1)\n",
"print(cleared_df.head())\n",
"print(cleared_df.tail())\n",
"\n",
"sorted_df = cleared_df.sort_values(by=\"Age\")\n",
"print(sorted_df.head())\n",
"print(sorted_df.tail())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Работа с данными - работа с элементами"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(df[\"Age\"])\n",
"\n",
"print(df.loc[100])\n",
"\n",
"print(df.loc[100, \"Name\"])\n",
"\n",
"print(df.loc[100:200, [\"Age\", \"Name\"]])\n",
"\n",
"print(df[0:3])\n",
"\n",
"print(df.iloc[0])\n",
"\n",
"print(df.iloc[3:5, 0:2])\n",
"\n",
"print(df.iloc[[3, 4], [0, 1]])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Работа с данными - отбор и группировка"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"s_values = df[\"Sex\"].unique()\n",
"print(s_values)\n",
"\n",
"s_total = 0\n",
"for s_value in s_values:\n",
" count = df[df[\"Sex\"] == s_value].shape[0]\n",
" s_total += count\n",
" print(s_value, \"count =\", count)\n",
"print(\"Total count = \", s_total)\n",
"\n",
"print(df.groupby([\"Pclass\", \"Survived\"]).size().reset_index(name=\"Count\")) # type: ignore"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Визуализация - Исходные данные"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Pclass Survived Age\n",
"PassengerId \n",
"1 3 0 22.0\n",
"2 1 1 38.0\n",
"3 3 1 26.0\n",
"4 1 1 35.0\n",
"5 3 0 35.0\n",
"... ... ... ...\n",
"886 3 0 39.0\n",
"887 2 0 27.0\n",
"888 1 1 19.0\n",
"890 1 1 26.0\n",
"891 3 0 32.0\n",
"\n",
"[714 rows x 3 columns]\n"
]
}
],
"source": [
"data = df[[\"Pclass\", \"Survived\", \"Age\"]].copy()\n",
"data.dropna(subset=[\"Age\"], inplace=True)\n",
"print(data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Визуализация - Сводка пяти чисел\n",
"\n",
""
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"ename": "KeyError",
"evalue": "'Pclass'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[1;32mIn[9], line 26\u001b[0m\n\u001b[0;32m 22\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mhigh_iqr\u001b[39m(x):\n\u001b[0;32m 23\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m q3(x) \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1.5\u001b[39m \u001b[38;5;241m*\u001b[39m iqr(x)\n\u001b[1;32m---> 26\u001b[0m quantiles \u001b[38;5;241m=\u001b[39m \u001b[43mdata\u001b[49m\u001b[43m[\u001b[49m\u001b[43m[\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mAge\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgroupby\u001b[49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mPclass\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39maggregate([\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmin\u001b[39m\u001b[38;5;124m\"\u001b[39m, q1, q2, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmedian\u001b[39m\u001b[38;5;124m\"\u001b[39m, q3, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmax\u001b[39m\u001b[38;5;124m\"\u001b[39m])\n\u001b[0;32m 27\u001b[0m \u001b[38;5;28mprint\u001b[39m(quantiles)\n\u001b[0;32m 29\u001b[0m iqrs \u001b[38;5;241m=\u001b[39m data[[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPclass\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAge\u001b[39m\u001b[38;5;124m\"\u001b[39m]]\u001b[38;5;241m.\u001b[39mgroupby([\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPclass\u001b[39m\u001b[38;5;124m\"\u001b[39m])\u001b[38;5;241m.\u001b[39maggregate([low_iqr, iqr, high_iqr])\n",
"File \u001b[1;32mc:\\Users\\1\\Desktop\\улгту\\3 курс\\МИИ\\mai\\.venv\\Lib\\site-packages\\pandas\\core\\frame.py:9183\u001b[0m, in \u001b[0;36mDataFrame.groupby\u001b[1;34m(self, by, axis, level, as_index, sort, group_keys, observed, dropna)\u001b[0m\n\u001b[0;32m 9180\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m level \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m by \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 9181\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou have to supply one of \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mby\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m and \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m-> 9183\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mDataFrameGroupBy\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 9184\u001b[0m \u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 9185\u001b[0m \u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mby\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 9186\u001b[0m \u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 9187\u001b[0m \u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 9188\u001b[0m \u001b[43m \u001b[49m\u001b[43mas_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mas_index\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 9189\u001b[0m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 9190\u001b[0m \u001b[43m \u001b[49m\u001b[43mgroup_keys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup_keys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 9191\u001b[0m \u001b[43m \u001b[49m\u001b[43mobserved\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mobserved\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 9192\u001b[0m \u001b[43m \u001b[49m\u001b[43mdropna\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdropna\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 9193\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[1;32mc:\\Users\\1\\Desktop\\улгту\\3 курс\\МИИ\\mai\\.venv\\Lib\\site-packages\\pandas\\core\\groupby\\groupby.py:1329\u001b[0m, in \u001b[0;36mGroupBy.__init__\u001b[1;34m(self, obj, keys, axis, level, grouper, exclusions, selection, as_index, sort, group_keys, observed, dropna)\u001b[0m\n\u001b[0;32m 1326\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdropna \u001b[38;5;241m=\u001b[39m dropna\n\u001b[0;32m 1328\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m grouper \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m-> 1329\u001b[0m grouper, exclusions, obj \u001b[38;5;241m=\u001b[39m \u001b[43mget_grouper\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1330\u001b[0m \u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1331\u001b[0m \u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1332\u001b[0m \u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1333\u001b[0m \u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1334\u001b[0m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1335\u001b[0m \u001b[43m \u001b[49m\u001b[43mobserved\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mobserved\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mlib\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mno_default\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mobserved\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1336\u001b[0m \u001b[43m \u001b[49m\u001b[43mdropna\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdropna\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1337\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1339\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m observed \u001b[38;5;129;01mis\u001b[39;00m lib\u001b[38;5;241m.\u001b[39mno_default:\n\u001b[0;32m 1340\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28many\u001b[39m(ping\u001b[38;5;241m.\u001b[39m_passed_categorical \u001b[38;5;28;01mfor\u001b[39;00m ping \u001b[38;5;129;01min\u001b[39;00m grouper\u001b[38;5;241m.\u001b[39mgroupings):\n",
"File \u001b[1;32mc:\\Users\\1\\Desktop\\улгту\\3 курс\\МИИ\\mai\\.venv\\Lib\\site-packages\\pandas\\core\\groupby\\grouper.py:1043\u001b[0m, in \u001b[0;36mget_grouper\u001b[1;34m(obj, key, axis, level, sort, observed, validate, dropna)\u001b[0m\n\u001b[0;32m 1041\u001b[0m in_axis, level, gpr \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m, gpr, \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 1042\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1043\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(gpr)\n\u001b[0;32m 1044\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(gpr, Grouper) \u001b[38;5;129;01mand\u001b[39;00m gpr\u001b[38;5;241m.\u001b[39mkey \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 1045\u001b[0m \u001b[38;5;66;03m# Add key to exclusions\u001b[39;00m\n\u001b[0;32m 1046\u001b[0m exclusions\u001b[38;5;241m.\u001b[39madd(gpr\u001b[38;5;241m.\u001b[39mkey)\n",
"\u001b[1;31mKeyError\u001b[0m: 'Pclass'"
]
}
],
"source": [
"def q1(x):\n",
" return x.quantile(0.25)\n",
"\n",
"\n",
"# median = quantile(0.5)\n",
"def q2(x):\n",
" return x.quantile(0.5)\n",
"\n",
"\n",
"def q3(x):\n",
" return x.quantile(0.75)\n",
"\n",
"\n",
"def iqr(x):\n",
" return q3(x) - q1(x)\n",
"\n",
"\n",
"def low_iqr(x):\n",
" return max(0, q1(x) - 1.5 * iqr(x))\n",
"\n",
"\n",
"def high_iqr(x):\n",
" return q3(x) + 1.5 * iqr(x)\n",
"\n",
"\n",
"quantiles = data[[\"Pclass\", \"Age\"]].groupby([\"Pclass\"]).aggregate([\"min\", q1, q2, \"median\", q3, \"max\"])\n",
"print(quantiles)\n",
"\n",
"iqrs = data[[\"Pclass\", \"Age\"]].groupby([\"Pclass\"]).aggregate([low_iqr, iqr, high_iqr])\n",
"print(iqrs)\n",
"\n",
"data.boxplot(column=\"Age\", by=\"Pclass\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Визуализация - Гистограмма"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data.plot.hist(column=[\"Age\"], bins=80)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Визуализация - Точечная диаграмма"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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AgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsECIAgAAsGAVolatWuX1vjfeeMO6GAAAgIrCKkTddNNNGjlypH766Sdn27Fjx3Trrbdq9OjRpVYcAABAeWX9SdSSJUvUvn17bd++XcuXL1fr1q2Vl5en9PT0Ui4RAACg/LEKUZ06dVJ6erpat26tdu3a6fbbb9eIESO0evVqNWrUqLRrBAAAKHesTyzfuXOn0tLS1LBhQwUFBWnHjh0qKCgozdoAAADKLasQ9fLLLyslJUU33HCDtm7dqvXr12vTpk1KTEzUunXrSrtGAACAcscqRE2dOlVLly7V9OnTVaVKFbVu3Vrr16/XHXfcoeuuu66USwQAACh/gmwe9O233yomJsalLTg4WJMmTdItt9xSKoUBAACUZ1afRMXExCgnJ0dvv/22xowZoxMnTkiSNm7cqISEhFItEAAAoDyy+iRqy5Yt6tGjhyIjI7V3714NHjxYNWvW1IcffqisrCzNmzevtOsEAAAoV6w+iRoxYoQGDRqkjIwMValSxdl+880364svvii14gAAAMorq0+i0tLS9Oabb7q1N2jQQIcOHbrsogAAAMo7q0+iQkNDlZeX59a+c+dO1apV67KLAgAAKO+sQtRtt92m559/3vm38xwOh7KysjRq1CjdeeedpVogAABAeWQVoiZPnqxTp06pdu3aOn36tLp166amTZsqPDxcEyZMKO0aAQAAyh2rc6IiIyO1YsUKrVmzRlu2bNGpU6d09dVXq3v37qVdHwAAQLnk0ydR69at00cffeS83aVLF1WrVk2vvfaa+vXrp4ceekhnzpwp9SIBAADKG59C1PPPP69t27Y5b3/77bcaPHiwbrjhBo0ePVp///vfNXHixFIvEgAAoLzxKUSlp6e7/Mpu/vz56tChg9566y09/vjjmjZtmhYuXFjqRQIAAJQ3PoWo7Oxs1alTx3k7NTVVvXr1ct5u37699u/fX3rVAQAAlFM+hag6deooMzNTknT27Flt3LhRHTt2dN5/8uRJBQcHl26FAAAA5ZBPIermm2/W6NGj9eWXX2rMmDEKCwtT165dnfdv2bJFTZs2LfUiAQAAyhufLnHwwgsv6I477lC3bt0UHh6uuXPnKiQkxHn/7Nmz1bNnz1IvEgAAoLxxGGOMrw/Kzc1VeHi4AgMDXdpPnDih8PBwl2D1W5WXl6fIyEjl5uYqIiLC3+UAAIAS8OX92/pim57UrFnTZjgAAIAKx+rPvgAAAPzWEaIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIAAAAsEKIkDRo0SH369PF3GQAAoAIJ8ncB8N2eo6f0deZx7Tx8Ul98d0y5P57V9S3raNLdbZx9ZqzM0Nrdx9S1WS09en2C1zZJen7ZNn2155i6JNTS2Fta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xDRo0MD07dvX5fpJFX1+F/z97383rVu3NqGhoaZly5bmzTffdLm/oq83//znP40kjzVXhm2Yl5dnhg0bZuLi4kyVKlVMkyZNzNNPP23OnDnj7OPPbegwpshlPwEAAFAinBMFAABggRAFAABggRAFAABggRAFAABggRAFAABggRAFAABggRAFAABggRAFAABggRAFAABggRAFAEWsW7dOgYGBLn/MFQA84c++AEARDz74oMLDwzVr1izt2LFD9evX93dJAMopPokCgP84deqUFixYoEceeUS9e/fWnDlzXO5ftmyZmjVrpipVquj666/X3Llz5XA4lJOT4+yzZs0ade3aVVWrVlVsbKwee+wx5efn/7oTAfCrIEQBwH8sXLhQLVu2VIsWLXTvvfdq9uzZuvBhfWZmpu666y716dNHmzdv1h//+Ec9/fTTLo/fvXu3brrpJt15553asmWLFixYoDVr1mjo0KH+mA6AMsav8wDgPzp37qx77rlHw4YN07lz51SvXj0tWrRI1113nUaPHq3ly5fr22+/dfYfO3asJkyYoOzsbEVFRenBBx9UYGCg3njjDWefNWvWqFu3bsrPz1eVKlX8MS0AZYRPogBA0o4dO7R+/Xr169dPkhQUFKS+fftq1qxZzvvbt2/v8pgOHTq43N68ebPmzJmj8PBw58+NN96owsJCZWZm/joTAfCrCfJ3AQBQHsyaNUvnzp1zOZHcGKPQ0FDNmDGjRGOcOnVKf/zjH/XYY4+53RcXF1dqtQIoHwhRAH7zzp07p3nz5mny5Mnq2bOny319+vTRBx98oBYtWugf//iHy30bNmxwud2uXTtt375dCQkJZV4zAP/jnCgAv3lLly5V3759deTIEUVGRrrcN2rUKH3++edauHChWrRooREjRuiBBx5Qenq6nnjiCX3//ffKyclRZGSktmzZoo4dO+r+++/Xgw8+qGrVqmn79u1asWJFiT/NAlBxcE4UgN+8WbNmqUePHm4BSpLuvPNOpaWl6eTJk1q8eLE+/PBDJSYm6vXXX3d+Oy80NFSSlJiYqNTUVO3cuVNdu3ZVUlKSxo0bx7WmgEqKT6IAwNKECRM0c+ZM7d+/39+lAPADzokCgBJ67bXX1L59e0VHR2vt2rWaNGkS14ACfsMIUQBQQhkZGXrxxRd14sQJxcXF6YknntCYMWP8XRYAP+HXeQAAABY4sRwAAMACIQoAAMACIQoAAMACIQoAAMACIQoAAMACIQoAAMACIQoAAMACIQoAAMDC/wfGGnH4UTTIJwAAAABJRU5ErkJggg==",
"text/plain": [
"