Skip to content

Instantly share code, notes, and snippets.

@dcolinmorgan
Created July 7, 2022 09:52
Show Gist options
  • Save dcolinmorgan/5b8fcbbeb0405d4cf501610d19dc6395 to your computer and use it in GitHub Desktop.
Save dcolinmorgan/5b8fcbbeb0405d4cf501610d19dc6395 to your computer and use it in GitHub Desktop.
wrangle_classifier_demo.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "wrangle_classifier_demo.ipynb",
"provenance": [],
"authorship_tag": "ABX9TyNB4Susi1JVmSLW4VVZ+dwQ",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/dcolinmorgan/5b8fcbbeb0405d4cf501610d19dc6395/wrangle_classifier_demo.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"id": "y4RYn54E-pbG"
},
"outputs": [],
"source": [
"from sklearn.metrics import mean_absolute_error,r2_score,accuracy_score\n",
"\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"from sklearn.linear_model import SGDClassifier\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from lightgbm import LGBMClassifier\n",
"from xgboost.sklearn import XGBClassifier\n",
"\n",
"import seaborn as sns,numpy as np, pandas as pd,glob,os\n",
"from geopy.geocoders import Nominatim\n",
"import geopy.distance"
]
},
{
"cell_type": "markdown",
"source": [
"## preprocessing\n",
"\n",
"---\n",
"\n",
"1. df--> health data\n",
"2. data(2) --> pollution data\n",
"\n"
],
"metadata": {
"id": "fE4zBvDq__SS"
}
},
{
"cell_type": "code",
"source": [
"!wget https://github.com/dcolinmorgan/AXA_AE_app/raw/main/axa_p.zip\n",
"!7z x /content/axa_p.zip\n",
"!git clone https://github.com/dcolinmorgan/aqi-stations-scraper.git\n",
"\n",
"df2=pd.read_parquet('/content/AE_AXA_dat_full.parquet')\n",
"\n",
"df2.columns=['pat_id','cd9_loc','sess','sex','age','cd9_code','mini_loc','loc1','date','tmp','diag1','diag2','tmp']\n",
"\n",
"\n",
"df2.replace({'RH':'Ruttonjee Hospital'},inplace=True)\n",
"df2.replace({'PYN':'Pamela Youde Nethersole Eastern Hospital'},inplace=True)\n",
"df2.replace({'QEH':'Queen Elizabeth Hospital'},inplace=True)\n",
"df2.replace({'CMC':'Caritas Medical Centre'},inplace=True)\n",
"df2.replace({'KWH':'Kwong Wah Hospital'},inplace=True)\n",
"df2.replace({'TMH':'Tuen Mun Hospital'},inplace=True)\n",
"df2.replace({'PWH':'Prince of Wales Hospital'},inplace=True)\n",
"df2.replace({'NDH':'North District Hospital'},inplace=True)\n",
"df2.replace({'YCH':'Yan Chai Hospital'},inplace=True)\n",
"df2.replace({'UCH':'United Christian Hospital'},inplace=True)\n",
"df2.replace({'QMH':'Queen Mary Hospital'},inplace=True)\n",
"df2.replace({'PWH':'Princess Margaret Hospital'},inplace=True)\n",
"df2.replace({'POH':'Pok Oi Hospital'},inplace=True)\n",
"df2.replace({'TKO':'Tseung Kwan O Hospital'},inplace=True)\n",
"df2.replace({'AHN':'Alice Ho Miu Ling Nethersole Hospital'},inplace=True)\n",
"df2.replace({'SJH':'St. John Hospital'},inplace=True)\n",
"df2.replace({'NLT':'North Lantau Hospital'},inplace=True)\n",
"df2.replace({'TSH':'Tang Shiu Kin Hospital'},inplace=True)\n",
"df2.replace({'PMH':'Princess Margaret Hospital'},inplace=True)\n",
"\n",
"\n",
"#organize\n",
"cc=pd.DataFrame()\n",
"files=glob.glob('/content/aqi-stations-scraper/data/japan-aqi/*')\n",
"for file in files:\n",
" data=pd.read_csv(file,sep=' |,')\n",
" data['loc1']=os.path.basename(file).split(',')[0]\n",
" cc=cc.append(data)\n",
"\n",
"data2=cc[['date','pm25','pm10','o3','no2','so2','co','loc1']]\n",
"data2['loc1']=data2['loc1'].str.upper().replace({'-':' '},regex=True)\n",
"data2['date']=pd.to_datetime(data2['date'])\n",
"\n",
"geolocator = Nominatim(user_agent=\"example app\")\n",
"df_loc=pd.DataFrame(columns=['lat','long','name'])\n",
"for ii,i in enumerate(pd.unique(df2['cd9_loc'])):\n",
" a,b,c=geolocator.geocode(str(i)+\", Hong Kong\").point\n",
" df_loc[ii]=[a,b,i]\n",
"df_loc=df_loc.transpose()\n",
"df_loc.columns=['lat','long','name']\n",
"df_loc=df_loc[3:]\n",
" "
],
"metadata": {
"id": "qlvaQ8g5_-gk"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"data2.replace('CENTRALNAYA STR','central',inplace=True)\n",
"data2.replace('SOUTHERN','southern island',inplace=True)\n",
"data2.replace('SOUTHERN PART OF CHENGYANG DISTRICT','chengyang district',inplace=True)\n",
"\n",
"data_loc=pd.DataFrame(columns=['lat','long','name'])\n",
"for ii,i in enumerate(pd.unique(data2['loc1'])):\n",
" try:\n",
" a,b,c=geolocator.geocode(str(i)+\", Hong Kong\").point\n",
" except AttributeError:\n",
" print('no location data for: '+str(i))\n",
" data_loc[ii]=[a,b,i]\n",
"data_loc=data_loc.transpose()\n",
"data_loc.columns=['lat','long','name']\n",
"data_loc=data_loc[3:]\n",
"\n",
"data_loc=data_loc[~data_loc.duplicated(['lat','long'],keep='first')]\n",
"data_loc.reset_index(inplace=True)\n",
"\n",
"data_loc=df_loc.append(data_loc)[['lat','long','name']]\n",
"2\n",
"data_loc.reset_index(inplace=True)\n",
"\n",
"\n",
"# geopy DOES use latlon configuration\n",
"data_loc['latlon'] = list(zip(data_loc['lat'], data_loc['long']))\n",
"square = pd.DataFrame(\n",
" np.zeros((data_loc.shape[0], data_loc.shape[0])),\n",
" index=data_loc.index, columns=data_loc.index\n",
")\n",
"\n",
"# replacing distance.vicenty with distance.distance\n",
"def get_distance(col):\n",
" end = data_loc.loc[col.name, 'latlon']\n",
" return data_loc['latlon'].apply(geopy.distance.distance,\n",
" args=(end,),\n",
" ellipsoid='WGS-84'\n",
" )\n",
"\n",
"distances = square.apply(get_distance, axis=1).T\n",
"\n",
"data_loc['src']=data_loc['name']\n",
"data_loc['dst']=data_loc['name']\n",
"\n",
"# np.sum((distances<5)*1)\n",
"D_D=pd.DataFrame((distances<5)*1)\n",
"D_D.index=data_loc['src']\n",
"D_D.columns=data_loc['dst']\n",
"\n",
"E_E=pd.DataFrame(D_D.stack())#.reset_index(inplace=True)\n",
"E_E.reset_index(inplace=True)#\n",
"distance_mat=E_E[E_E[0]>0]\n",
"\n",
"distance=distances\n",
"distance.index=data_loc['src']\n",
"distance.columns=data_loc['dst']\n",
"distance=pd.DataFrame(distance.stack())\n",
"distance.reset_index(inplace=True)\n",
"\n",
"#prepare for TF\n",
"\n",
"distances=distances.astype(str)\n",
"distances=distances.replace('km', '', regex=True)\n",
"distances=distances.astype(np.float64)\n",
"\n",
"distances.to_numpy()"
],
"metadata": {
"id": "N8poYsIf_-jH"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"## post-process"
],
"metadata": {
"id": "oL_WaMT3BL1q"
}
},
{
"cell_type": "code",
"source": [
"!wget https://github.com/dcolinmorgan/AXA_AE_app/raw/main/coord_fulldiag_UVI_min.npy.gz\n",
"!7z x /content/coord_fulldiag_UVI_min.npy.gz\n",
"\n",
"data5=np.load('/content/coord_fulldiag_UVI_min.npy',allow_pickle=True)\n",
"data5=pd.DataFrame(data5,columns=['pm25', 'pm10', 'o3', 'no2', 'so2', 'co', 'lat',\n",
" 'long', 'name', 'year', 'week', 'diag1', 'UVI'])\n",
"\n",
"data5['weekA']=data5['week']+(52*(data5['year']-np.nanmin(data5['year'])))"
],
"metadata": {
"id": "lnmxHgVx-1B7"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"MATCHED_DATA=data5.groupby(['pm25','pm10','o3','no2','so2','co','lat','long','UVI','weekA']).agg('count')\n",
"MATCHED_DATA.reset_index(inplace=True)\n",
"y = MATCHED_DATA.diag1\n",
"MATCHED_DATA.drop(['diag1'], axis=1, inplace=True)\n",
"X = MATCHED_DATA[['pm25','pm10','o3','no2','so2','co','UVI','weekA']]\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=2)"
],
"metadata": {
"id": "buSXrQ2E-1EC"
},
"execution_count": 3,
"outputs": []
},
{
"cell_type": "code",
"source": [
"SGD= SGDClassifier()\n",
"SGD.fit(X_train,y_train)\n",
"\n",
"KNN= KNeighborsClassifier()\n",
"KNN.fit(X_train,y_train)\n",
"\n",
"DTC= DecisionTreeClassifier()\n",
"DTC.fit(X_train,y_train)\n",
"\n",
"RFC= RandomForestClassifier()\n",
"RFC.fit(X_train,y_train)\n",
"\n",
"LGBM= LGBMClassifier()\n",
"LGBM.fit(X_train,y_train)\n",
" \n",
"XGB= XGBClassifier()\n",
"XGB.fit(X_train,y_train)\n"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "knfC6CPw-4Td",
"outputId": "a56dd489-c7c0-4ce5-ea3f-e2440bc8392c"
},
"execution_count": 4,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"XGBClassifier(objective='multi:softprob')"
]
},
"metadata": {},
"execution_count": 4
}
]
},
{
"cell_type": "code",
"source": [
"results=pd.DataFrame(index=['ACC','MAE','R2'])\n",
"\n",
"predA=SGD.predict(X_test)\n",
"results['SGC']=[accuracy_score(y_test,predA),mean_absolute_error(y_test,predA),r2_score(y_test,predA)]\n",
"predB=KNN.predict(X_test)\n",
"results['KNN']=[accuracy_score(y_test,predB),mean_absolute_error(y_test,predB),r2_score(y_test,predB)]\n",
"predC=DTC.predict(X_test)\n",
"results['DTC']=[accuracy_score(y_test,predC),mean_absolute_error(y_test,predC),r2_score(y_test,predC)]\n",
"predD=RFC.predict(X_test)\n",
"results['RFC']=[accuracy_score(y_test,predD),mean_absolute_error(y_test,predD),r2_score(y_test,predD)]\n",
"predE=LGBM.predict(X_test)\n",
"results['LGBM']=[accuracy_score(y_test,predE),mean_absolute_error(y_test,predE),r2_score(y_test,predE)]\n",
"predF=XGB.predict(X_test)\n",
"results['XGB']=[accuracy_score(y_test,predF),mean_absolute_error(y_test,predF),r2_score(y_test,predF)]\n",
"results"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 143
},
"id": "5a1hzBti-4V9",
"outputId": "69487cb1-7601-406e-d120-ca81d6d8883a"
},
"execution_count": 5,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" SGC KNN DTC RFC LGBM XGB\n",
"ACC 0.034091 0.151515 0.189394 0.250000 0.238636 0.219697\n",
"MAE 7.905303 3.073864 2.744318 2.446970 2.325758 2.585227\n",
"R2 -5.371673 -0.383712 -0.076455 0.044189 0.115882 -0.023739"
],
"text/html": [
"\n",
" <div id=\"df-36961955-48ae-47cc-b86a-d821c4fdd341\">\n",
" <div class=\"colab-df-container\">\n",
" <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>SGC</th>\n",
" <th>KNN</th>\n",
" <th>DTC</th>\n",
" <th>RFC</th>\n",
" <th>LGBM</th>\n",
" <th>XGB</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>ACC</th>\n",
" <td>0.034091</td>\n",
" <td>0.151515</td>\n",
" <td>0.189394</td>\n",
" <td>0.250000</td>\n",
" <td>0.238636</td>\n",
" <td>0.219697</td>\n",
" </tr>\n",
" <tr>\n",
" <th>MAE</th>\n",
" <td>7.905303</td>\n",
" <td>3.073864</td>\n",
" <td>2.744318</td>\n",
" <td>2.446970</td>\n",
" <td>2.325758</td>\n",
" <td>2.585227</td>\n",
" </tr>\n",
" <tr>\n",
" <th>R2</th>\n",
" <td>-5.371673</td>\n",
" <td>-0.383712</td>\n",
" <td>-0.076455</td>\n",
" <td>0.044189</td>\n",
" <td>0.115882</td>\n",
" <td>-0.023739</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-36961955-48ae-47cc-b86a-d821c4fdd341')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
" \n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
" </svg>\n",
" </button>\n",
" \n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" flex-wrap:wrap;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-36961955-48ae-47cc-b86a-d821c4fdd341 button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-36961955-48ae-47cc-b86a-d821c4fdd341');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
" </div>\n",
" "
]
},
"metadata": {},
"execution_count": 5
}
]
},
{
"cell_type": "code",
"source": [
"sns.set_theme(style=\"whitegrid\")\n",
"g = sns.catplot(\n",
" data=results.melt(ignore_index=False).reset_index(), kind=\"bar\",\n",
" y=\"value\", x=\"index\", hue=\"variable\",\n",
" palette=\"dark\", alpha=.6, height=6,aspect=1.7\n",
")"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 437
},
"id": "9ruYuUaL-9AD",
"outputId": "7cefdd47-65a0-4048-bb65-60d9577df904"
},
"execution_count": 6,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 805.625x432 with 1 Axes>"
],
"image/png": "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yszMlJ+fn0pKSjRy5Eg1b95ckydP1pw5c/Tggw/K29tbQUFBqlmzpuLi4iRduP5j7ty5mj59ul588UVVqVJFISEhSkxMdOrnuKrb4jZv3lzjx4936gAAAABARRYaHFCm78swoW7dulqwYMElX7PZbBo5cuSfnpHUunVrvfPOO6bGk3QVwZGcnHzZ10aMGOGUYQAAAABULmUOjiNHjpR6fOzYMW3dulVdu3Z1+lAAAAAAKocyB8fkyZMvem7jxo1atWqVUwcCAAAAUHmU+S5Vl9KpUyetW7fOWbMAAAAAqGTKfITj4MGDpR7n5eVp5cqVql27ttOHAgAAAFA5lDk4unXrJg8PD9ntdklSlSpV1KxZM02ZMsXYcAAAAAAqtjIHx08//WRyDgAAAKBCOn8mW4V556684VXyqeIvv6CQK24XFRWluXPnKjw8XHl5eRo+fLhq1qypoqIirV69WmvWrFGdOnUkSWPGjFFERIQeffRRLV++XElJSZo+fbqio6MlScuXL9cXX3yhGTNmOO1zXNX3cAAAAAAorTDvnHYuneP0/bbsn1Cm4PjdmTNnFBcXpxYtWuj5559XUlKSatSooZkzZ17yBlDShe/xSE5OVvfu3eXtbSYN/nSvnTt3loeHxxV38sUXXzhrHgAAAABX6cSJExo9erSioqJKfVP4gAED9N577+mXX35RkyZNLnpfRESECgoK9OGHH2rAgAFGZvvT4HjttdeMLAoAAADAeUaOHKmBAweWig1J8vf315NPPqnp06dr9uzZl3zv008/rbi4OPXp08fIbH8aHB06dDCyKAAAAADn6dy5sz755BMNGDBAtWrVKvXaQw89pIULF2rHjh2XfO8tt9yi9u3b691331X16tWdPttVnaj1448/atu2bcrOznbcrUqSRowY4fTBAAAAAJTN0KFDtWHDBg0ePFiLFy8uFR0+Pj7629/+pjfeeOOyX2kxYsQIDRgwQHFxcU6frcxf/Ld06VI9/PDD2rx5s/75z39qz549WrhwoQ4cOOD0oQAAAABcnSeffFJ9+/bV4MGDlZWVVeq1+++/XydPntQ333xzyffWr19f9957r9555x2nz1Xm4Hjrrbf01ltvafbs2fLz89Ps2bOVnJxs7Gp2AAAAAFcnPj5effr00eDBg3X06FHH856ennrmmWeUmZl52fcmJCQoOzvb6TOVuRZOnDihdu3aSbowcElJiTp37qxRo0Y5fSgAAACgovCp4q+W/ROM7Lcs1q9fX+rxU089paeeeuqi7bp06aKff/7Z8Tg2NlaxsbGOx2FhYfruu++ucdrLK3Nw3HDDDTp48KDq16+vRo0a6fPPP1dISIh8fHycPhQAAABQUfgFhVzV92Vcb8ocHEOHDtWvv/6q+vXrKyEhQSNGjFBhYaHGjh1rcj4AAAAAFViZg+PHH3/U/fffL+nCbbe++eYbFRYWKiAgwNhwAAAAACq2q7riOyEhQf7+/urVq5fuv/9+3XjjjabmAgAAAFAJlPkuVWPHjtXGjRv10ksv6fDhw3rooYcUGxurhQsXmpwPAAAAQAVW5uCQLtydqmPHjpo8ebJWrlyp4OBgvfrqq6ZmAwAAAFDBXdUpVefOndPatWu1atUqffPNN2rfvr2mTJliajYAAAAAFVyZgyMxMVH/+c9/1Lx5c913332aMmWKQkNDTc4GAAAAuL3s3FPKPZ/r9P0G+AUoJCD4ittFRUXJZrPJZrMpLy9PTZo00RNPPKF9+/Zp8eLFkqTDhw/Lz89PISEXbt87YcIEBQUFadq0afrpp59UrVo12Ww2DR06VF27dnXq5yhzcLRo0UJjxoxRnTp1nDoAAAAAUJHlns/V7E/mOn2/w6LjyxQckjRjxgyFh4dLkj777DPFxcXp7bffVlpamiRpzJgxioiI0KOPPipJOnr0qPr27atRo0Zp9uzZkqRjx47pq6++cvrnKPM1HE888QSxAQAAALi57t27a8CAAXr77bcvu82SJUt02223qU+fPo7natSoUeqxs1zVReMAAAAA3F+rVq30yy+/XPb13bt3q2XLlpbMQnAAAAAAlYzdbnf1CA4EBwAAAFDJ7Nq1SzfffPNlX2/evLl27dplySwEBwAAAFCJrFu3Tv/+9781ZMiQy24zcOBAbdq0SStWrHA8d+LECX300UdOn+eqvocDAAAAQGkBfgEaFh1vZL9llZiY6LgtbuPGjTV//ny1atXqstvXqlVL7777rqZNm6Y333xT/v7+8vf31xNPPOGM0UshOAAAAIByCAkILvPta01Yv379Fbe51Jd1N27cWP/4xz9MjFQKp1QBAAAAMIYjHHC5c9knlZ/j/G/n/DO+gQHyDwm1dE0AAIDrEcEBl8vPyVX6jDcsXbPTiDHKPXfC0jUlydOnWMVF+ZavWyUgUFWrhVi+LgAAAMEBh+zcU8o9b+2RBknyLS60fM2C/CKtXLzO8nWj/+8vWrFkjuXrPjBkBMEBAABcwq2CY9++fRozZoxOnTql4OBgTZ06VY0aNXL1WC5x/ky2CvPOWbrmWRXqH5+9bemakpTYcbDlawIAAMAabhUcL730kgYOHKiYmBilpaXpxRdf1OLFi109lksU5p3TzqXW/kt4vQcvf69mAABQ8Zw9lavzuectXdMvwE9Vg8t+O1dUfm4THCdOnNDu3bu1cOFCSVKvXr00ceJEnTx5UqGhXNwLAAAqLlfcIEWS8kt89PGCzy1ds29cj+suOEz951vWm9xERUXJZrPJZrOpsLBQQ4YMUb9+/bRlyxbFxcWVOmMoKSlJt99+uwoLCzVnzhx98sknstls8vLy0u23365nn31WPj4+Tv0cbhMchw8fVq1ateTl5SVJ8vLyUs2aNXX48GGXBsfJU7nKybX+It9AFVm+JgAAMMMVN0iRpA7xf7d8zeuRqf98Oyc+U+a7as6YMUPh4eHas2ePYmNjddddd0m68F0by5cvv2j7pKQk5efnKyUlRYGBgSoqKlJKSooKCgoqb3A4Q0ZGhtP3WTUoTAVFJU7f75X4BnqrUc9HLF3T7uGtQR0HWrqmJMnbR23+73FLl/Twlu4ZcIela0qSh5eXuj34mOXr5pzL08Ht2y1f91pVDQrT0IEdLF2zxNP63zmJ3ztL1nXB711F+52TXPP/dzUCvVV0/qyla0qSPTBAZyy+TjLEu4rlv3OSa37vij2KdOzYMUvXlKTTp0/r9OnTTt9vZGSk0/dpUnh4uIKCgpSVlXXZbfbv369169YpPT1dgYGBkiRvb2/179/fyExuExy1a9dWVlaWiouL5eXlpeLiYh09elS1a9cu8z4iIiLk6+trcEoAACqnA5knNWfuWkvXHDu0g/Z/usTSNaUL1yy++9W/LF1zWHS8GjaIsHTN602NGjVcPYJb2L59u0JCQtS0aVN999132rt3r2JiYiRJNptNy5Yt0+7du9WwYUNVq1bNkpncJjiqV6+uZs2aaeXKlYqJidHKlSvVrFkzrt8AAABOVcXHT8Oi4y1dM8Dv+rqmAdZLTEyU3W7XgQMHlJycLJvNJunyp1RZyW2CQ5LGjx+vMWPGaM6cOQoKCtLUqVNdPRIAAKhkqpRINWvUdfUYgFP9fg3Hp59+qqSkJLVt2/ay2zZv3ly//fabTp8+bclRDk/jK1yFxo0ba9myZVqzZo2WLVumm266ydUjAQAAABVGz5491bFjR82bN++y2zRq1EhRUVF68cUXlZOTI0kqLi7WsmXLlJvr/LttudURDgAAAADl8+yzzyo2NlatWrW67DZTpkzR7Nmz9cADD8jHx0clJSXq3Lmz41QsZ/Kw2+12p+/VYvn5+crIyOCicQAArtGBzJN6wwUXje9Je8vSNSWpZf8EVa3FKVVwHld/D4e74wgHAAAAUA7+IaGVIgxMcatrOAAAAABULhzhAAAALuFhq6KW/RMsX9enir/lawLXM4IDAAC4xLkSm8JqcxoKUNlxShUAAAAAYwgOAAAAAMYQHAAAAACM4RoOAAAAoBzOnsrV+dzzTt+vX4CfqgYHXHG7qKgozZ07V+Hh4Y7n7Ha73nvvPS1dulRFRUXy8/NT9erVNWzYMLVt21ZbtmxRXFycGjVqJEkqKSnRU089pejoaEnSoEGD9N133+nLL79UcHCwJGnLli0aPHiwhgwZoueee67Mn4PgAAAAAMrhfO55pc5f7fT99o3rUabguJQ333xTW7du1dtvv61atWpJkr799lv9+uuvatu2rSSpcePGWr58uSTpl19+Ub9+/dSjRw95el44CSo8PFyrVq3SI488Iklavny5br311quehVOqAAAAgEokNzdXCxYs0KRJkxyxIUlt27bVgw8+eMn3nD17VoGBgY7YkKQ+ffooLS3Nsc/t27frzjvvvOp5OMIBAAAAVCJ79+6Vr6+vbrrppituFxMTo4KCAmVmZurVV18t9Xr9+vXl6+urvXv36vvvv1fXrl3l7e2tgoKCq5qH4AAAAAAqsTNnzmjQoEEqKChQ48aNNWvWLEmlT6nau3evBg0apDZt2pQ6KtKnTx+lpqZqx44dGjdunD777LOrXp9TqgAAAIBKpHHjxsrPz9f+/fslSUFBQUpLS9Po0aN1+vTpy76nbt26+vbbb0s936NHD61atUrnzp3TLbfcck3zEBwAAABAJRIQEKDHHntM48aNU1ZWluP5vLy8y74nKytL+/fvd9y16o/7GjVq1FXdlep/cUoVAAAAUA5+AX7qG9fDyH7L6rHHHpOXl5fj8YoVKxQaGqohQ4aouLhYISEhCgoK0rBhwxzb/H4Nh91uV1FRkUaMGKFmzZpdtO/fb5V7rTzsdru9XHtwA/n5+crIyFBERIR8fX1dPQ4AABXOgcyTemPuWkvXfCa+mxrUDbV0TQDW45QqAAAAAMYQHAAAAACMITgAAAAAGENwAAAAADCG4AAAAABgDMEBAAAAwBi+hwMAAAAoh7Ons5WXm+P0/VYJCFTVaiF/us2pU6fUu3dvzZo1Sy1btpQkzZ07Vz/88INmzpypXbt26c0339S+ffsUHBwsu92uXr166fHHH5ckRUVFyWazydfXV/n5+WrXrp1eeukl+fj4OO1zEBwAAABAOeTl5ihlQdADxukAABCFSURBVLLT9/vAkBFXDI7g4GC9+OKLSkpKUmpqqvbt26clS5boo48+0s8//6wnnnhCU6dOVefOnSVJJ06c0KJFi0rtY8aMGQoPD1dxcbEeeeQRrV27ttxf9vdHBAcAAABQgXXt2lWrV6/WtGnTtHXrViUlJal69eqaPHmy+vXr54gNSapevbqeffbZS+4nPz9f+fn5CgoKcup8BAcAAABQwb3wwgvq0qWL7rjjDsfRid27d6tHjx5XfG9iYqJ8fX114MABderUSZ06dXLqbFw0DgAAAFRwmzZtUmBgoH799VcVFBRccptJkyYpJiZGnTp10uHDhx3Pz5gxQ2lpadq8ebPy8/MvOuWqvAgOAAAAoAI7efKkXnnlFc2fP18RERGaMWOGJKlZs2batWuXY7tx48YpLS1NhYWFKi4uvmg/vr6+uvvuu/X11187dT6CAwAAAKjAXn75ZT300ENq2rSpxo4dq5UrV2rXrl164okntHTpUm3cuNGxbUFBgUpKSi65n5KSEm3dulWNGjVy6nxcwwEAAABUUJ988on279+vadOmSZKqVaumF198Uc8//7xSUlI0b948JScna/z48QoNDZWPj4/i4+NVs2ZNxz5+v4ajsLBQN998s4YNG+bUGT3sdrvdqXt0gfz8fGVkZCgiIkK+vr6uHgcAgArnQOZJvTF3raVrPhPfTQ3qhlq6JmCCK7+HoyLgCAcAAABQDlWrhVSKMDCFazgAAAAAGENwAAAAADCG4AAAAABgDMEBAAAAwBiCAwAAAIAxBAcAAAAAYwgOAAAAAMYQHAAAAACMcYsv/nv55Ze1adMm2Ww2+fv7a+zYsWrRooWrxwIAAABQTm5xhOOuu+7SihUr9PHHH+vJJ5/U008/7eqRAAAAADiBWxzh6NKli+PPrVu31pEjR1RSUiJPT7foIQAAAADXyC2C44+WLFmiu++++5piIyMjw8BEAABUfr7+oTp+/Lila545c1rbj+yzdE3gakVGRrp6hArPkuDo27evDh06dMnXvv76a3l5eUmSVq1apRUrVmjJkiXXtE5ERIR8fX2veU4AAK5XBzJPKiwszNI1g4KqqUGzGy1dE4D1LAmO1NTUK26zdu1aTZ8+XYsWLbL8f/AAAAAAmOEWp1Rt2LBBkydP1sKFC1WvXj1XjwMAAADASdwiOJKSkuTj46PExETHc4sWLVJISIgLpwIAAABQXm4RHJs3b3b1CAAAAAAM4L6zAAAAAIwhOAAAAAAYQ3AAAAAAMIbgAAAAAGAMwQEAAADAGIIDAAAAgDEEBwAAAABjCA4AAAAAxhAcAAAAAIwhOAAAAAAYQ3AAAAAAMIbgAAAAAGAMwQEAAADAGIIDAAAAgDEEBwAAAABjCA4AAAAAxhAcAAAAAIwhOAAAAAAYQ3AAAAAAMIbgAAAAAGAMwQEAAADAGIIDAAAAgDEEBwAAAABjCA4AAAAAxhAcAAAAAIwhOAAAAAAYQ3AAAAAAMIbgAAAAAGAMwQEAAADAGIIDAAAAgDEEBwAAAABjCA4AAAAAxhAcAAAAAIwhOAAAAAAYQ3AAAAAAMIbgAAAAAGAMwQEAAADAGIIDAAAAgDEEBwAAAABjCA4AAAAAxhAcAAAAAIxxq+DYsmWLmjVrpvfee8/VowAAAABwArcJjpycHE2bNk133XWXq0cBAAAA4CRuExxTpkzR448/rpCQEFePAgAAAMBJ3CI40tPTdfbsWfXo0cPVowAAAABwIm8rFunbt68OHTp0yddWr16t119/XQsXLiz3OhkZGeXeBwAA1yNf/1AdP37c0jXPnDmt7Uf2WbomcLUiIyNdPUKFZ0lwpKamXva1bdu26dixY+rXr58kKTs7Wxs2bNCpU6c0fPjwq1onIiJCvr6+5ZoVAIDr0YHMkwoLC7N0zaCgamrQ7EZL1wRgPUuC48+0a9dOmzZtcjweM2aMIiIi9Oijj7pwKgAAAADO4BbXcAAAAAConFx+hON/TZkyxdUjAAAAAHASjnAAAAAAMIbgAAAAAGAMwQEAAADAGIIDAAAAgDEEBwAAAABjCA4AAAAAxhAcAAAAAIwhOAAAAAAYQ3AAAAAAMIbgAAAAAGAMwQEAAADAGIIDAAAAgDEEBwAAAABjCA4AAAAAxhAcAAAAAIwhOAAAAAAYQ3AAAAAAMIbgAAAAAGAMwQEAAADAGIIDAAAAgDEEBwAAAABjCA4AAAAAxhAcAAAAAIwhOAAAAAAYQ3AAAAAAMIbgAAAAAGAMwQEAAADAGIIDAAAAgDEEBwAAAABjCA4AAAAAxni7egAAAOB6gQG+eia+m+VrAqj8CA4AAKDQ4ACFBge4egwAlRCnVAEAAAAwhuAAAAAAYAzBAQAAAMAYggMAAACAMQQHAAAAAGMIDgAAAADGEBwAAAAAjCE4AAAAABhDcAAAAAAwhuAAAAAAYIy3qwf43bvvvqslS5bIx8dHnp6eSktLc/VIAAAAAMrJLYLjs88+0+rVq/Xhhx8qMDBQx48fd/VIAAAAAJzALU6pWrBggYYPH67AwEBJUlhYmIsnAgAAAOAMbnGEY+/evdqxY4eSk5NVUFCgAQMG6KGHHirz++12uyQpIyPD1IgAAAC4DkVERMhms8nDw8PVo1RYlgRH3759dejQoUu+9vXXX6u4uFiHDx/Wv/71L2VnZ+vhhx/WjTfeqPbt25dp/4WFhc4cFwAAAJB04R+0IyIi5Ovr6+pRKixLgiM1NfVPX69Tp4569eolT09PVa9eXXfccYd27txZ5uAICAhQeHi4fHx8qE8AAAA4lc1mc/UIFZpbnFLVq1cv/ec//1H79u117tw5bd++Xd26dSvz+z09PVW1alWDEwIAAAC4Fh723y+AcKHz58/rhRde0O7duyVJMTExiouLc/FUAAAAAMrLLYIDAAAAQOXkFrfFBQAAAFA5ERwAAAAAjCE4AAAAABhDcAAAAAAwhuAAAAAAYIxbfA8HKq/Tp0/rzjvv1EMPPaRx48Y5nv/444+1YMECnT9/Xv7+/mrYsKFGjRqlOnXqKCcnR9OnT9fGjRvl7+8vLy8vde/eXfHx8S78JID7i4qKUkFBgdLT0+Xl5SVJWr58uZKSkvTCCy/o0UcflSS99tpreuedd5Senq7q1auXer/NZiv1bbqzZ89WvXr1rP0gQAX2+++RzWZTYWGhhgwZon79+mndunWaM2eOCgoKZLfb9cADD2jIkCGuHhewBMEBo1auXKlWrVpp1apVGj16tGw2m5YtW6aFCxdqzpw5atSokSRpy5YtOn78uGrXrq24uDg1bdpUq1atks1mU35+vj744APXfhCggqhZs6a+/PJLde7cWZKUmpqqW2+91fF6cXGx0tLS1LZtW6WlpV30F54ZM2YoPDzc0pmByub336M9e/YoNjZWd911l2rUqKF//OMfqlWrls6ePavY2Fi1bNlS7dq1c/W4gHGcUgWjUlJSlJCQoFtuuUWff/65JGnWrFlKSkpyxIYk3XbbbWrZsqU2bdqkQ4cOKSkpSTabTZLk6+urQYMGuWJ8oMLp27evli9fLkk6ePCgzp07Vyog0tPT1aBBAyUmJjq2A2BGeHi4goKClJWVpVatWqlWrVqSpKpVq6px48bKzMx08YSANQgOGPPTTz/p1KlTuv322xUbG6uUlBSdOHFCR44cUatWrS75nh9++EHNmzeXj4+PxdMClUOHDh20Z88enT59WqmpqerTp0+p11NSUhQbG6t27dqpsLBQO3bsKPV6YmKiYmJiFBMTo9jYWCtHByqd7du3KyQkRE2bNi31/N69e/X999/r9ttvd9FkgLU4pQrGfPjhh4qJiZGHh4e6d++uSZMm6fz5864eC6jUPDw81LNnT61atUqrVq3S+++/rx9++EGSdOLECX3zzTeaOnWqJKlPnz5KSUkp9Q8AnFIFlF9iYqLsdrsOHDig5ORkxxF7STp69KgSEhL00ksvOY54AJUdwQEjCgoKtHLlStlsNqWlpUmSCgsL9fHHH6tWrVrauXOnOnXqdNH7br31Vv3rX/9SUVGRvL35rydwLfr27at+/fqpffv2CgkJcTyflpamoqIi9e7dW5JUVFSkvLw8Pf/88/Lz83PVuECl83u4f/rpp0pKSlLbtm0VFhamEydO6LHHHtPQoUPVs2dPV48JWIZTqmDE559/rhtvvFEbN27U+vXrtX79ei1YsECpqalKSEjQlClTdODAAcf2W7du1c6dO/WXv/xFtWrV0pQpU1RQUCDpQry89957rvooQIVTv359Pf3000pISCj1/PLlyzV79mzH7+TGjRvVsmVLrV692kWTApVbz5491bFjR82bN0/Z2dl67LHH9Mgjj6hfv36uHg2wFP+EDCNSUlJ0//33l3quTZs2Kikp0U033aShQ4cqMTFR58+fl6enp5o2bapRo0bJw8NDb731ll5//XVFR0erSpUqknTRvgD8uf79+5d6fOrUKcc1VX90//33KyUlxXGtR2JiYqnb4k6aNEktWrQwPzBQST377LOKjY1VXl6e9u/fr6VLl2rp0qWSpMGDB+uBBx5w8YSAeR52u93u6iEAAAAAVE6cUgUAAADAGIIDAAAAgDEEBwAAAABjCA4AAAAAxhAcAAAAAIwhOACgArrvvvu0ZcuWq37fmDFjNH36dAMTAQBwaXwPBwBUQKtWrXL1CAAAlAlHOAAAAAAYQ3AAQAUUFRWlr7/+WjNnztSIESM0evRotWnTRvfdd5927drl2G737t3q27ev2rRpo5EjRyo/P7/UfjZs2KCYmBi1a9dOAwYM0E8//SRJ+uSTTxQVFaWcnBxJUnp6ujp27KiTJ09a9yEBAJUCwQEAFdz69et13333adu2bYqKitLEiRMlSQUFBRo2bJhiYmL0zTffqEePHvrss88c79u9e7eef/55TZgwQVu2bFH//v2VkJCggoICRUdHq02bNpo0aZKys7M1duxYTZo0SaGhoa76mACACorgAIAKLjIyUp07d5aXl5diYmIcRyl27NihwsJC/fWvf5WPj4969OihFi1aON63dOlS9e/fX61atZKXl5f69u0rHx8fff/995Kkl156SZs3b9bgwYMVFRWlLl26uOTzAQAqNi4aB4AKLiwszPFnPz8/5efnq6ioSEePHlWtWrXk4eHheL1OnTqOPx86dEgfffSR3nvvPcdzhYWFOnr0qCQpKChIPXr00MKFCzVjxgwLPgkAoDIiOACgkqpRo4aysrJkt9sd0XHo0CHVr19fklS7dm3Fx8frqaeeuuT7f/zxR6WkpKhXr16aNGmS3n77bctmBwBUHpxSBQCVVOvWreXt7a3FixersLBQn332WakLyvv166f3339fO3bskN1u17lz5/TFF18oJydH+fn5GjVqlJ5++mlNnjxZR48e1ZIlS1z4aQAAFRXBAQCVlM1m08yZM5WamqoOHTrok08+Ubdu3Ryvt2jRQhMnTtSECRPUvn17de/eXcuXL5ckvf7667rhhhs0cOBA2Ww2vfbaa0pOTtb+/ftd9GkAABWVh91ut7t6CAAAAACVE0c4AAAAABhDcAAAAAAwhuAAAAAAYAzBAQAAAMAYggMAAACAMQQHAAAAAGMIDgAAAADGEBwAAAAAjCE4AAAAABjz/wFbhWxDexUR1gAAAABJRU5ErkJggg==\n"
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
""
],
"metadata": {
"id": "iYsSBrnB_EPc"
},
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment