Skip to content

Instantly share code, notes, and snippets.

@Shivani29sheth
Created June 20, 2020 23:43
Show Gist options
  • Save Shivani29sheth/5da2318be442e5d7ff7ff6ecddf31f52 to your computer and use it in GitHub Desktop.
Save Shivani29sheth/5da2318be442e5d7ff7ff6ecddf31f52 to your computer and use it in GitHub Desktop.
Created on Skills Network Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h1>Final Capstone Project - Analyze and Cluster Neighborhoods in British Columbia </h1>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Table of contents\n",
"* [Introduction and Project Proposal](#introduction)\n",
"* [Obtaining and cleaning data](#data)\n",
"* [Methodology](#methodology)\n",
"* [Analyze each neighborhood](#analysis)\n",
"* [Cluster Neighborhoods](#cluster)\n",
"* [Results and Conclusion](#results)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"## Introduction and Project Proposal <a name=\"introduction\"></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this project, we take leverage of the Foursquare API to find the most popular places in each of the neighborhoods consisting of British Columbia. A place is marked as “happening” by the Foursquare API according to the number of people present at a given place and hence the place is updated in real-time; it might change every few minutes. We then cluster the neighborhoods based upon their preferred places in the surrounding area. This will give a clear picture of the aura or the vibe of the place, which can help an individual know what to expect in the neighborhood, and hence decide upon a suitable location according to their preference."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"## Obtaining and cleaning data <a name=\"data\"></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### In this module, we can obtain data from various sources and clean them to match our required data frame needed for further processing. Two such methods of obtaining our required data has been explained below."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"### First method to acquire the dataset needed:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### In this method, we scrape the data frame needed from the wikipedia page from the given url and clean the table for better readability. Once we obtain the location data, we pass the address through the geocoder package of the geopy library to extract the latitude and longitude values for each address. Hence, this will give us the complete data set needed for the methodology."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### We start with importing and downloading the necessary libraries.\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting package metadata (current_repodata.json): done\n",
"Solving environment: done\n",
"\n",
"## Package Plan ##\n",
"\n",
" environment location: /home/jupyterlab/conda/envs/python\n",
"\n",
" added / updated specs:\n",
" - lxml\n",
"\n",
"\n",
"The following packages will be downloaded:\n",
"\n",
" package | build\n",
" ---------------------------|-----------------\n",
" libxslt-1.1.33 | h7d1a2b0_0 426 KB\n",
" lxml-3.8.0 | py36_0 3.8 MB conda-forge\n",
" ------------------------------------------------------------\n",
" Total: 4.2 MB\n",
"\n",
"The following NEW packages will be INSTALLED:\n",
"\n",
" libxslt pkgs/main/linux-64::libxslt-1.1.33-h7d1a2b0_0\n",
" lxml conda-forge/linux-64::lxml-3.8.0-py36_0\n",
"\n",
"\n",
"\n",
"Downloading and Extracting Packages\n",
"lxml-3.8.0 | 3.8 MB | ##################################### | 100% \n",
"libxslt-1.1.33 | 426 KB | ##################################### | 100% \n",
"Preparing transaction: done\n",
"Verifying transaction: done\n",
"Executing transaction: done\n"
]
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import requests\n",
"!conda install -c conda-forge lxml --yes "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting package metadata (current_repodata.json): done\n",
"Solving environment: done\n",
"\n",
"# All requested packages already installed.\n",
"\n",
"Collecting package metadata (current_repodata.json): done\n",
"Solving environment: done\n",
"\n",
"## Package Plan ##\n",
"\n",
" environment location: /home/jupyterlab/conda/envs/python\n",
"\n",
" added / updated specs:\n",
" - geocoder\n",
"\n",
"\n",
"The following packages will be downloaded:\n",
"\n",
" package | build\n",
" ---------------------------|-----------------\n",
" brotlipy-0.7.0 |py36h8c4c3a4_1000 346 KB conda-forge\n",
" chardet-3.0.4 |py36h9f0ad1d_1006 188 KB conda-forge\n",
" click-7.1.2 | pyh9f0ad1d_0 64 KB conda-forge\n",
" cryptography-2.9.2 | py36h45558ae_0 613 KB conda-forge\n",
" future-0.18.2 | py36h9f0ad1d_1 714 KB conda-forge\n",
" geocoder-1.38.1 | py_1 53 KB conda-forge\n",
" pysocks-1.7.1 | py36h9f0ad1d_1 27 KB conda-forge\n",
" ratelim-0.1.6 | py_2 6 KB conda-forge\n",
" requests-2.24.0 | pyh9f0ad1d_0 47 KB conda-forge\n",
" ------------------------------------------------------------\n",
" Total: 2.0 MB\n",
"\n",
"The following NEW packages will be INSTALLED:\n",
"\n",
" brotlipy conda-forge/linux-64::brotlipy-0.7.0-py36h8c4c3a4_1000\n",
" chardet conda-forge/linux-64::chardet-3.0.4-py36h9f0ad1d_1006\n",
" click conda-forge/noarch::click-7.1.2-pyh9f0ad1d_0\n",
" cryptography conda-forge/linux-64::cryptography-2.9.2-py36h45558ae_0\n",
" decorator conda-forge/noarch::decorator-4.4.2-py_0\n",
" future conda-forge/linux-64::future-0.18.2-py36h9f0ad1d_1\n",
" geocoder conda-forge/noarch::geocoder-1.38.1-py_1\n",
" idna conda-forge/noarch::idna-2.9-py_1\n",
" pyopenssl conda-forge/noarch::pyopenssl-19.1.0-py_1\n",
" pysocks conda-forge/linux-64::pysocks-1.7.1-py36h9f0ad1d_1\n",
" ratelim conda-forge/noarch::ratelim-0.1.6-py_2\n",
" requests conda-forge/noarch::requests-2.24.0-pyh9f0ad1d_0\n",
" urllib3 conda-forge/noarch::urllib3-1.25.9-py_0\n",
"\n",
"\n",
"\n",
"Downloading and Extracting Packages\n",
"future-0.18.2 | 714 KB | ##################################### | 100% \n",
"chardet-3.0.4 | 188 KB | ##################################### | 100% \n",
"cryptography-2.9.2 | 613 KB | ##################################### | 100% \n",
"brotlipy-0.7.0 | 346 KB | ##################################### | 100% \n",
"pysocks-1.7.1 | 27 KB | ##################################### | 100% \n",
"geocoder-1.38.1 | 53 KB | ##################################### | 100% \n",
"requests-2.24.0 | 47 KB | ##################################### | 100% \n",
"ratelim-0.1.6 | 6 KB | ##################################### | 100% \n",
"click-7.1.2 | 64 KB | ##################################### | 100% \n",
"Preparing transaction: done\n",
"Verifying transaction: done\n",
"Executing transaction: done\n"
]
}
],
"source": [
"!conda install -c conda-forge html5lib --yes \n",
"!conda install -c conda-forge geocoder --yes "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Next, we scrape the table given on this wikipedia page using the read_html method of the pandas library. This table consists of the postal code along with the neighborhood for each location.\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"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>V1AKimberley</th>\n",
" <th>V2APenticton</th>\n",
" <th>V3ALangley Township(Langley City)</th>\n",
" <th>V4ASurreySouthwest</th>\n",
" <th>V5ABurnaby(Government Road / Lake City / SFU / Burnaby Mountain)</th>\n",
" <th>V6AVancouver(Strathcona / Chinatown / Downtown Eastside)</th>\n",
" <th>V7ARichmondSouth</th>\n",
" <th>V8APowell River</th>\n",
" <th>V9AVictoria(Vic West / Esquimalt)Canadian Forces(MARPAC)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>V1BVernonEast</td>\n",
" <td>V2BKamloopsNorthwest</td>\n",
" <td>V3BPort CoquitlamCentral</td>\n",
" <td>V4BWhite Rock</td>\n",
" <td>V5BBurnaby(Parkcrest-Aubrey / Ardingley-Sprott)</td>\n",
" <td>V6BVancouver(NE Downtown / Gastown / Harbour C...</td>\n",
" <td>V7BRichmond(Sea Island / YVR)</td>\n",
" <td>V8BSquamish</td>\n",
" <td>V9BVictoria(West Highlands / North Langford / ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>V1CCranbrook</td>\n",
" <td>V2CKamloopsCentral and Southeast</td>\n",
" <td>V3CPort CoquitlamSouth</td>\n",
" <td>V4CDeltaNortheast</td>\n",
" <td>V5CBurnaby(Burnaby Heights / Willingdon Height...</td>\n",
" <td>V6CVancouver(Waterfront / Coal Harbour / Canad...</td>\n",
" <td>V7CRichmondNorthwest</td>\n",
" <td>V8CKitimat</td>\n",
" <td>V9CVictoria(Colwood / South Langford / Metchosin)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>V1ESalmon Arm</td>\n",
" <td>V2EKamloopsSouth and West</td>\n",
" <td>V3ECoquitlamNorth</td>\n",
" <td>V4EDeltaEast</td>\n",
" <td>V5EBurnaby(Lakeview-Mayfield / Richmond Park /...</td>\n",
" <td>V6EVancouver(SE West End / Davie Village)</td>\n",
" <td>V7ERichmondSouthwest</td>\n",
" <td>V8EWhistler</td>\n",
" <td>V9EVictoria(East Highlands / NW Saanich)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>V1GDawson Creek</td>\n",
" <td>V2GWilliams Lake</td>\n",
" <td>V3GAbbotsfordEast</td>\n",
" <td>V4GDeltaEast Central</td>\n",
" <td>V5GBurnaby(Cascade-Schou / Douglas-Gilpin)</td>\n",
" <td>V6GVancouver(NW West End / Stanley Park)</td>\n",
" <td>V7GNorth Vancouver (district municipality)Oute...</td>\n",
" <td>V8GTerrace</td>\n",
" <td>V9GLadysmith</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>V1HVernonWest</td>\n",
" <td>V2HKamloopsNorth</td>\n",
" <td>V3HPort Moody</td>\n",
" <td>V4HNot assigned</td>\n",
" <td>V5HBurnaby(Maywood / Marlborough / Oakalla / W...</td>\n",
" <td>V6HVancouver(West Fairview / Granville Island ...</td>\n",
" <td>V7HNorth Vancouver (district municipality)Inne...</td>\n",
" <td>V8HNot assigned</td>\n",
" <td>V9HCampbell RiverOutskirts</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" V1AKimberley V2APenticton \\\n",
"0 V1BVernonEast V2BKamloopsNorthwest \n",
"1 V1CCranbrook V2CKamloopsCentral and Southeast \n",
"2 V1ESalmon Arm V2EKamloopsSouth and West \n",
"3 V1GDawson Creek V2GWilliams Lake \n",
"4 V1HVernonWest V2HKamloopsNorth \n",
"\n",
" V3ALangley Township(Langley City) V4ASurreySouthwest \\\n",
"0 V3BPort CoquitlamCentral V4BWhite Rock \n",
"1 V3CPort CoquitlamSouth V4CDeltaNortheast \n",
"2 V3ECoquitlamNorth V4EDeltaEast \n",
"3 V3GAbbotsfordEast V4GDeltaEast Central \n",
"4 V3HPort Moody V4HNot assigned \n",
"\n",
" V5ABurnaby(Government Road / Lake City / SFU / Burnaby Mountain) \\\n",
"0 V5BBurnaby(Parkcrest-Aubrey / Ardingley-Sprott) \n",
"1 V5CBurnaby(Burnaby Heights / Willingdon Height... \n",
"2 V5EBurnaby(Lakeview-Mayfield / Richmond Park /... \n",
"3 V5GBurnaby(Cascade-Schou / Douglas-Gilpin) \n",
"4 V5HBurnaby(Maywood / Marlborough / Oakalla / W... \n",
"\n",
" V6AVancouver(Strathcona / Chinatown / Downtown Eastside) \\\n",
"0 V6BVancouver(NE Downtown / Gastown / Harbour C... \n",
"1 V6CVancouver(Waterfront / Coal Harbour / Canad... \n",
"2 V6EVancouver(SE West End / Davie Village) \n",
"3 V6GVancouver(NW West End / Stanley Park) \n",
"4 V6HVancouver(West Fairview / Granville Island ... \n",
"\n",
" V7ARichmondSouth V8APowell River \\\n",
"0 V7BRichmond(Sea Island / YVR) V8BSquamish \n",
"1 V7CRichmondNorthwest V8CKitimat \n",
"2 V7ERichmondSouthwest V8EWhistler \n",
"3 V7GNorth Vancouver (district municipality)Oute... V8GTerrace \n",
"4 V7HNorth Vancouver (district municipality)Inne... V8HNot assigned \n",
"\n",
" V9AVictoria(Vic West / Esquimalt)Canadian Forces(MARPAC) \n",
"0 V9BVictoria(West Highlands / North Langford / ... \n",
"1 V9CVictoria(Colwood / South Langford / Metchosin) \n",
"2 V9EVictoria(East Highlands / NW Saanich) \n",
"3 V9GLadysmith \n",
"4 V9HCampbell RiverOutskirts "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"url = \"https://en.wikipedia.org/wiki/List_of_postal_codes_of_Canada:_V\"\n",
"df = pd.read_html(url, header=0)\n",
"df= df[0]\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### As we see, the table scraped isn't very readable. Hence, we convert the table to a list and iterate through each value to separate the postal codes and neighborhood values, and store them in a data frame.\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"list_var = df.values.tolist()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"postal_code = []\n",
"neighborhood = []\n",
"for i in list_var:\n",
" for j in i:\n",
" postal_code.append(j[0:3])\n",
" j = j[3:]\n",
" neigh = j.split(\"(\")[0]\n",
" neighborhood.append(neigh)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"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>Postal Codes</th>\n",
" <th>Neighborhood</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>V1B</td>\n",
" <td>VernonEast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>V2B</td>\n",
" <td>KamloopsNorthwest</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>V3B</td>\n",
" <td>Port CoquitlamCentral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>V4B</td>\n",
" <td>White Rock</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>V5B</td>\n",
" <td>Burnaby</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Postal Codes Neighborhood\n",
"0 V1B VernonEast\n",
"1 V2B KamloopsNorthwest\n",
"2 V3B Port CoquitlamCentral\n",
"3 V4B White Rock\n",
"4 V5B Burnaby"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.DataFrame({'Postal Codes':postal_code,'Neighborhood':neighborhood})\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Int64Index([39, 43, 48, 92, 156, 168], dtype='int64')\n",
"(165, 3)\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>index</th>\n",
" <th>Postal Codes</th>\n",
" <th>Neighborhood</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>V1B</td>\n",
" <td>VernonEast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>V2B</td>\n",
" <td>KamloopsNorthwest</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>V3B</td>\n",
" <td>Port CoquitlamCentral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>V4B</td>\n",
" <td>White Rock</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>V5B</td>\n",
" <td>Burnaby</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" index Postal Codes Neighborhood\n",
"0 0 V1B VernonEast\n",
"1 1 V2B KamloopsNorthwest\n",
"2 2 V3B Port CoquitlamCentral\n",
"3 3 V4B White Rock\n",
"4 4 V5B Burnaby"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"remove = df[df['Neighborhood']=='Not assigned'].index\n",
"print(remove)\n",
"df.drop(remove,axis=0, inplace=True)\n",
"df.reset_index(inplace=True)\n",
"print(df.shape)\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(165, 2)\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>Postal Codes</th>\n",
" <th>Neighborhood</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>V1B</td>\n",
" <td>VernonEast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>V2B</td>\n",
" <td>KamloopsNorthwest</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>V3B</td>\n",
" <td>Port CoquitlamCentral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>V4B</td>\n",
" <td>White Rock</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>V5B</td>\n",
" <td>Burnaby</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Postal Codes Neighborhood\n",
"0 V1B VernonEast\n",
"1 V2B KamloopsNorthwest\n",
"2 V3B Port CoquitlamCentral\n",
"3 V4B White Rock\n",
"4 V5B Burnaby"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.drop(['index'], axis=1, inplace=True)\n",
"print(df.shape)\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Now that we have the address for each location, we install and import the libraries necessary for leveraging the geocoder package.\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting package metadata (current_repodata.json): done\n",
"Solving environment: done\n",
"\n",
"## Package Plan ##\n",
"\n",
" environment location: /home/jupyterlab/conda/envs/python\n",
"\n",
" added / updated specs:\n",
" - geopy\n",
"\n",
"\n",
"The following packages will be downloaded:\n",
"\n",
" package | build\n",
" ---------------------------|-----------------\n",
" geographiclib-1.50 | py_0 34 KB conda-forge\n",
" geopy-1.22.0 | pyh9f0ad1d_0 63 KB conda-forge\n",
" ------------------------------------------------------------\n",
" Total: 97 KB\n",
"\n",
"The following NEW packages will be INSTALLED:\n",
"\n",
" geographiclib conda-forge/noarch::geographiclib-1.50-py_0\n",
" geopy conda-forge/noarch::geopy-1.22.0-pyh9f0ad1d_0\n",
"\n",
"\n",
"\n",
"Downloading and Extracting Packages\n",
"geopy-1.22.0 | 63 KB | ##################################### | 100% \n",
"geographiclib-1.50 | 34 KB | ##################################### | 100% \n",
"Preparing transaction: done\n",
"Verifying transaction: done\n",
"Executing transaction: done\n"
]
}
],
"source": [
"!conda install -c conda-forge geopy --yes "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Using geocoder, we pass the location for each neighborhood and obtain its latitude and longitude values.\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"from geopy.geocoders import Nominatim\n",
"geolocator = Nominatim(user_agent=\"My_App\")\n",
"from geopy.extra.rate_limiter import RateLimiter\n",
"obj = RateLimiter(geolocator.geocode, min_delay_seconds=1)\n",
"lat=[]\n",
"long=[]\n",
"for i in neighborhood:\n",
" location = obj(\"'\"+i+\"'', Canada\")\n",
" if location == None:\n",
" lat.append(\"None\")\n",
" long.append(\"None\")\n",
" else:\n",
" lat.append(str(location.latitude))\n",
" long.append(str(location.longitude))"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"79\n",
"79\n"
]
}
],
"source": [
"print(lat.count('None'))\n",
"print(long.count('None'))"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"dict_keys(['None', '49.0235357', '49.2433804', '49.2608724', '49.163168', '49.6980743', '48.4283182', '49.5107477', '54.0535577', '50.7005059', '50.1171903', '55.7605306', '52.129081', '49.3207133', '54.5172715', '48.9936579', '49.2822243', '56.2524039', '52.9794279', '54.3126572', '50.111704', '48.8296672', '49.3479861', '49.494891', '48.6505788', '48.7786872', '48.5946782', '49.6727575', '49.316171', '49.3179514', '49.099049', '49.857464', '49.1637594', '52.966077', '49.2207623', '49.2343668', '48.3825724'])"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from collections import Counter\n",
"Counter(lat).keys()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"dict_keys(['None', '-122.7979246', '-122.9725459', '-123.1139529', '-123.137414', '-123.1558612', '-123.3649533', '-115.7672772', '-128.6540519', '-119.2790529', '-122.9543022', '-120.2364453', '-122.1397346', '-123.0737831', '-128.5995482', '-123.8157964', '-122.8293424', '-120.846943', '-122.4936273', '-130.32549', '-120.7884227', '-123.51516139891447', '-124.4439409', '-117.290039', '-123.3983246', '-123.7080446', '-123.4207265', '-124.9276204', '-117.663574', '-124.3117397', '-117.713013', '-119.580688', '-123.9379719', '-114.4216167', '-122.6901534', '-124.8056517', '-123.7315177'])"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Counter(long).keys()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Hence, we extract the coordinate values and can now store it in the data frame to obtain the required dataset. This completes our first method of obtaining the required dataset.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Second method to acquire the dataset needed:\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### In this method, we scrape the table consisting of the postal code, the neighborhood name, and the coordinate values from a website url given below. Next, we separately extract the coordinate values and the address values via a temporary table, clean them individually and merge them in a single data frame again to obtain our required dataset.\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"url = \"https://www.geonames.org/postal-codes/CA/BC/british-columbia.html\"\n",
"df = pd.read_html(url, header=0)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(385, 7)\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>Unnamed: 0</th>\n",
" <th>Place</th>\n",
" <th>Code</th>\n",
" <th>Country</th>\n",
" <th>Admin1</th>\n",
" <th>Admin2</th>\n",
" <th>Admin3</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.0</td>\n",
" <td>Port Moody</td>\n",
" <td>V3H</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>NaN</td>\n",
" <td>49.323/-122.863</td>\n",
" <td>49.323/-122.863</td>\n",
" <td>49.323/-122.863</td>\n",
" <td>49.323/-122.863</td>\n",
" <td>49.323/-122.863</td>\n",
" <td>49.323/-122.863</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2.0</td>\n",
" <td>Pitt Meadows</td>\n",
" <td>V3Y</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>NaN</td>\n",
" <td>49.221/-122.69</td>\n",
" <td>49.221/-122.69</td>\n",
" <td>49.221/-122.69</td>\n",
" <td>49.221/-122.69</td>\n",
" <td>49.221/-122.69</td>\n",
" <td>49.221/-122.69</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>3.0</td>\n",
" <td>White Rock</td>\n",
" <td>V4B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Unnamed: 0 Place Code Country \\\n",
"0 1.0 Port Moody V3H Canada \n",
"1 NaN 49.323/-122.863 49.323/-122.863 49.323/-122.863 \n",
"2 2.0 Pitt Meadows V3Y Canada \n",
"3 NaN 49.221/-122.69 49.221/-122.69 49.221/-122.69 \n",
"4 3.0 White Rock V4B Canada \n",
"\n",
" Admin1 Admin2 Admin3 \n",
"0 British Columbia NaN NaN \n",
"1 49.323/-122.863 49.323/-122.863 49.323/-122.863 \n",
"2 British Columbia NaN NaN \n",
"3 49.221/-122.69 49.221/-122.69 49.221/-122.69 \n",
"4 British Columbia NaN NaN "
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(df[2].shape)\n",
"df[2].head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### As we see the table scraped from this website, is much more readable but also contains garbage values. Hence we initially clean the table by dropping unnecessary columns and indexes.\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"df1 = df[2]"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(385, 7)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/jupyterlab/conda/envs/python/lib/python3.6/site-packages/pandas/core/ops/array_ops.py:253: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n",
" res_values = method(rvalues)\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>Unnamed: 0</th>\n",
" <th>Place</th>\n",
" <th>Code</th>\n",
" <th>Country</th>\n",
" <th>Admin1</th>\n",
" <th>Admin2</th>\n",
" <th>Admin3</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.0</td>\n",
" <td>Port Moody</td>\n",
" <td>V3H</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>NaN</td>\n",
" <td>49.323/-122.863</td>\n",
" <td>49.323/-122.863</td>\n",
" <td>49.323/-122.863</td>\n",
" <td>49.323/-122.863</td>\n",
" <td>49.323/-122.863</td>\n",
" <td>49.323/-122.863</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2.0</td>\n",
" <td>Pitt Meadows</td>\n",
" <td>V3Y</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>NaN</td>\n",
" <td>49.221/-122.69</td>\n",
" <td>49.221/-122.69</td>\n",
" <td>49.221/-122.69</td>\n",
" <td>49.221/-122.69</td>\n",
" <td>49.221/-122.69</td>\n",
" <td>49.221/-122.69</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>3.0</td>\n",
" <td>White Rock</td>\n",
" <td>V4B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Unnamed: 0 Place Code Country \\\n",
"0 1.0 Port Moody V3H Canada \n",
"1 NaN 49.323/-122.863 49.323/-122.863 49.323/-122.863 \n",
"2 2.0 Pitt Meadows V3Y Canada \n",
"3 NaN 49.221/-122.69 49.221/-122.69 49.221/-122.69 \n",
"4 3.0 White Rock V4B Canada \n",
"\n",
" Admin1 Admin2 Admin3 \n",
"0 British Columbia NaN NaN \n",
"1 49.323/-122.863 49.323/-122.863 49.323/-122.863 \n",
"2 British Columbia NaN NaN \n",
"3 49.221/-122.69 49.221/-122.69 49.221/-122.69 \n",
"4 British Columbia NaN NaN "
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"remove = df1[df1['Unnamed: 0']=='NaN'].index\n",
"df1.drop(remove,axis=0, inplace=True)\n",
"print(df1.shape)\n",
"df1.head()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"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>index</th>\n",
" <th>Place</th>\n",
" <th>Code</th>\n",
" <th>Country</th>\n",
" <th>Admin1</th>\n",
" <th>Admin2</th>\n",
" <th>Admin3</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.0</td>\n",
" <td>Port Moody</td>\n",
" <td>V3H</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>NaN</td>\n",
" <td>49.323/-122.863</td>\n",
" <td>49.323/-122.863</td>\n",
" <td>49.323/-122.863</td>\n",
" <td>49.323/-122.863</td>\n",
" <td>49.323/-122.863</td>\n",
" <td>49.323/-122.863</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2.0</td>\n",
" <td>Pitt Meadows</td>\n",
" <td>V3Y</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>NaN</td>\n",
" <td>49.221/-122.69</td>\n",
" <td>49.221/-122.69</td>\n",
" <td>49.221/-122.69</td>\n",
" <td>49.221/-122.69</td>\n",
" <td>49.221/-122.69</td>\n",
" <td>49.221/-122.69</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>3.0</td>\n",
" <td>White Rock</td>\n",
" <td>V4B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" index Place Code Country Admin1 \\\n",
"0 1.0 Port Moody V3H Canada British Columbia \n",
"1 NaN 49.323/-122.863 49.323/-122.863 49.323/-122.863 49.323/-122.863 \n",
"2 2.0 Pitt Meadows V3Y Canada British Columbia \n",
"3 NaN 49.221/-122.69 49.221/-122.69 49.221/-122.69 49.221/-122.69 \n",
"4 3.0 White Rock V4B Canada British Columbia \n",
"\n",
" Admin2 Admin3 \n",
"0 NaN NaN \n",
"1 49.323/-122.863 49.323/-122.863 \n",
"2 NaN NaN \n",
"3 49.221/-122.69 49.221/-122.69 \n",
"4 NaN NaN "
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1.rename(columns = {'Unnamed: 0':'index'}, inplace = True)\n",
"df1.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Now, we see that each row is followed by a row consisting of its coordinates. Hence extract the alternate rows and store the address data of each neighborhood in a temporary data frame and remove the null values.\n"
]
},
{
"cell_type": "code",
"execution_count": 20,
"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>index</th>\n",
" <th>Place</th>\n",
" <th>Code</th>\n",
" <th>Country</th>\n",
" <th>Admin1</th>\n",
" <th>Admin2</th>\n",
" <th>Admin3</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.0</td>\n",
" <td>Port Moody</td>\n",
" <td>V3H</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2.0</td>\n",
" <td>Pitt Meadows</td>\n",
" <td>V3Y</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>3.0</td>\n",
" <td>White Rock</td>\n",
" <td>V4B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>4.0</td>\n",
" <td>Penticton</td>\n",
" <td>V2A</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>5.0</td>\n",
" <td>Westbank</td>\n",
" <td>V4T</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" index Place Code Country Admin1 Admin2 Admin3\n",
"0 1.0 Port Moody V3H Canada British Columbia NaN NaN\n",
"2 2.0 Pitt Meadows V3Y Canada British Columbia NaN NaN\n",
"4 3.0 White Rock V4B Canada British Columbia NaN NaN\n",
"6 4.0 Penticton V2A Canada British Columbia NaN NaN\n",
"8 5.0 Westbank V4T Canada British Columbia NaN NaN"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df2 = df1.iloc[::2]\n",
"df2.head()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(193, 5)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/jupyterlab/conda/envs/python/lib/python3.6/site-packages/pandas/core/frame.py:3997: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" errors=errors,\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>index</th>\n",
" <th>Place</th>\n",
" <th>Code</th>\n",
" <th>Country</th>\n",
" <th>Admin1</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>376</th>\n",
" <td>189.0</td>\n",
" <td>Vancouver (NE Downtown / Harbour Centre / Gast...</td>\n",
" <td>V6B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" <tr>\n",
" <th>378</th>\n",
" <td>190.0</td>\n",
" <td>Richmond South</td>\n",
" <td>V7A</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" <tr>\n",
" <th>380</th>\n",
" <td>191.0</td>\n",
" <td>Duncan</td>\n",
" <td>V9L</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" <tr>\n",
" <th>382</th>\n",
" <td>192.0</td>\n",
" <td>Parksville</td>\n",
" <td>V9P</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" <tr>\n",
" <th>384</th>\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",
"</div>"
],
"text/plain": [
" index Place Code Country \\\n",
"376 189.0 Vancouver (NE Downtown / Harbour Centre / Gast... V6B Canada \n",
"378 190.0 Richmond South V7A Canada \n",
"380 191.0 Duncan V9L Canada \n",
"382 192.0 Parksville V9P Canada \n",
"384 NaN NaN NaN NaN \n",
"\n",
" Admin1 \n",
"376 British Columbia \n",
"378 British Columbia \n",
"380 British Columbia \n",
"382 British Columbia \n",
"384 NaN "
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df2.drop(['Admin2', 'Admin3'], axis=1, inplace=True)\n",
"print(df2.shape)\n",
"df2.tail()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(192, 5)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/jupyterlab/conda/envs/python/lib/python3.6/site-packages/ipykernel_launcher.py:1: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" \"\"\"Entry point for launching an IPython kernel.\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>index</th>\n",
" <th>Place</th>\n",
" <th>Code</th>\n",
" <th>Country</th>\n",
" <th>Admin1</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>374</th>\n",
" <td>188.0</td>\n",
" <td>Vancouver (Strathcona / Chinatown / Downtown E...</td>\n",
" <td>V6A</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" <tr>\n",
" <th>376</th>\n",
" <td>189.0</td>\n",
" <td>Vancouver (NE Downtown / Harbour Centre / Gast...</td>\n",
" <td>V6B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" <tr>\n",
" <th>378</th>\n",
" <td>190.0</td>\n",
" <td>Richmond South</td>\n",
" <td>V7A</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" <tr>\n",
" <th>380</th>\n",
" <td>191.0</td>\n",
" <td>Duncan</td>\n",
" <td>V9L</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" <tr>\n",
" <th>382</th>\n",
" <td>192.0</td>\n",
" <td>Parksville</td>\n",
" <td>V9P</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" index Place Code Country \\\n",
"374 188.0 Vancouver (Strathcona / Chinatown / Downtown E... V6A Canada \n",
"376 189.0 Vancouver (NE Downtown / Harbour Centre / Gast... V6B Canada \n",
"378 190.0 Richmond South V7A Canada \n",
"380 191.0 Duncan V9L Canada \n",
"382 192.0 Parksville V9P Canada \n",
"\n",
" Admin1 \n",
"374 British Columbia \n",
"376 British Columbia \n",
"378 British Columbia \n",
"380 British Columbia \n",
"382 British Columbia "
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df2.dropna(subset = [\"index\"], inplace=True)\n",
"print(df2.shape)\n",
"df2.tail()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### In the main data frame, we are left with the coordinate values corresponding to each address in the temp data frame. All the cells of the row contain the same coordinate values given by latitude/longitude. Hence we drop all duplicate column, rename the column name as 'Coordinates', and merge the address values from the temporary data frame to the main data frame.\n"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"j=1.0\n",
"for i in range(df1.shape[0]):\n",
" remove = df1[df1[\"index\"]==j].index\n",
" df1.drop(remove, axis=0, inplace=True)\n",
" j+=1.0"
]
},
{
"cell_type": "code",
"execution_count": 24,
"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>index</th>\n",
" <th>Place</th>\n",
" <th>Code</th>\n",
" <th>Country</th>\n",
" <th>Admin1</th>\n",
" <th>Admin2</th>\n",
" <th>Admin3</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>377</th>\n",
" <td>NaN</td>\n",
" <td>49.279/-123.114</td>\n",
" <td>49.279/-123.114</td>\n",
" <td>49.279/-123.114</td>\n",
" <td>49.279/-123.114</td>\n",
" <td>49.279/-123.114</td>\n",
" <td>49.279/-123.114</td>\n",
" </tr>\n",
" <tr>\n",
" <th>379</th>\n",
" <td>NaN</td>\n",
" <td>49.12/-123.117</td>\n",
" <td>49.12/-123.117</td>\n",
" <td>49.12/-123.117</td>\n",
" <td>49.12/-123.117</td>\n",
" <td>49.12/-123.117</td>\n",
" <td>49.12/-123.117</td>\n",
" </tr>\n",
" <tr>\n",
" <th>381</th>\n",
" <td>NaN</td>\n",
" <td>48.783/-123.703</td>\n",
" <td>48.783/-123.703</td>\n",
" <td>48.783/-123.703</td>\n",
" <td>48.783/-123.703</td>\n",
" <td>48.783/-123.703</td>\n",
" <td>48.783/-123.703</td>\n",
" </tr>\n",
" <tr>\n",
" <th>383</th>\n",
" <td>NaN</td>\n",
" <td>49.316/-124.319</td>\n",
" <td>49.316/-124.319</td>\n",
" <td>49.316/-124.319</td>\n",
" <td>49.316/-124.319</td>\n",
" <td>49.316/-124.319</td>\n",
" <td>49.316/-124.319</td>\n",
" </tr>\n",
" <tr>\n",
" <th>384</th>\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>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" index Place Code Country \\\n",
"377 NaN 49.279/-123.114 49.279/-123.114 49.279/-123.114 \n",
"379 NaN 49.12/-123.117 49.12/-123.117 49.12/-123.117 \n",
"381 NaN 48.783/-123.703 48.783/-123.703 48.783/-123.703 \n",
"383 NaN 49.316/-124.319 49.316/-124.319 49.316/-124.319 \n",
"384 NaN NaN NaN NaN \n",
"\n",
" Admin1 Admin2 Admin3 \n",
"377 49.279/-123.114 49.279/-123.114 49.279/-123.114 \n",
"379 49.12/-123.117 49.12/-123.117 49.12/-123.117 \n",
"381 48.783/-123.703 48.783/-123.703 48.783/-123.703 \n",
"383 49.316/-124.319 49.316/-124.319 49.316/-124.319 \n",
"384 NaN NaN NaN "
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1.tail()"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(192, 7)\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>index</th>\n",
" <th>Place</th>\n",
" <th>Code</th>\n",
" <th>Country</th>\n",
" <th>Admin1</th>\n",
" <th>Admin2</th>\n",
" <th>Admin3</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>375</th>\n",
" <td>NaN</td>\n",
" <td>49.278/-123.091</td>\n",
" <td>49.278/-123.091</td>\n",
" <td>49.278/-123.091</td>\n",
" <td>49.278/-123.091</td>\n",
" <td>49.278/-123.091</td>\n",
" <td>49.278/-123.091</td>\n",
" </tr>\n",
" <tr>\n",
" <th>377</th>\n",
" <td>NaN</td>\n",
" <td>49.279/-123.114</td>\n",
" <td>49.279/-123.114</td>\n",
" <td>49.279/-123.114</td>\n",
" <td>49.279/-123.114</td>\n",
" <td>49.279/-123.114</td>\n",
" <td>49.279/-123.114</td>\n",
" </tr>\n",
" <tr>\n",
" <th>379</th>\n",
" <td>NaN</td>\n",
" <td>49.12/-123.117</td>\n",
" <td>49.12/-123.117</td>\n",
" <td>49.12/-123.117</td>\n",
" <td>49.12/-123.117</td>\n",
" <td>49.12/-123.117</td>\n",
" <td>49.12/-123.117</td>\n",
" </tr>\n",
" <tr>\n",
" <th>381</th>\n",
" <td>NaN</td>\n",
" <td>48.783/-123.703</td>\n",
" <td>48.783/-123.703</td>\n",
" <td>48.783/-123.703</td>\n",
" <td>48.783/-123.703</td>\n",
" <td>48.783/-123.703</td>\n",
" <td>48.783/-123.703</td>\n",
" </tr>\n",
" <tr>\n",
" <th>383</th>\n",
" <td>NaN</td>\n",
" <td>49.316/-124.319</td>\n",
" <td>49.316/-124.319</td>\n",
" <td>49.316/-124.319</td>\n",
" <td>49.316/-124.319</td>\n",
" <td>49.316/-124.319</td>\n",
" <td>49.316/-124.319</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" index Place Code Country \\\n",
"375 NaN 49.278/-123.091 49.278/-123.091 49.278/-123.091 \n",
"377 NaN 49.279/-123.114 49.279/-123.114 49.279/-123.114 \n",
"379 NaN 49.12/-123.117 49.12/-123.117 49.12/-123.117 \n",
"381 NaN 48.783/-123.703 48.783/-123.703 48.783/-123.703 \n",
"383 NaN 49.316/-124.319 49.316/-124.319 49.316/-124.319 \n",
"\n",
" Admin1 Admin2 Admin3 \n",
"375 49.278/-123.091 49.278/-123.091 49.278/-123.091 \n",
"377 49.279/-123.114 49.279/-123.114 49.279/-123.114 \n",
"379 49.12/-123.117 49.12/-123.117 49.12/-123.117 \n",
"381 48.783/-123.703 48.783/-123.703 48.783/-123.703 \n",
"383 49.316/-124.319 49.316/-124.319 49.316/-124.319 "
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1.dropna(subset = [\"Place\"], inplace=True)\n",
"print(df1.shape)\n",
"df1.tail()"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(192, 1)\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>Place</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>49.323/-122.863</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>49.221/-122.69</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>49.026/-122.806</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>49.481/-119.586</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>49.866/-119.739</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Place\n",
"1 49.323/-122.863\n",
"3 49.221/-122.69\n",
"5 49.026/-122.806\n",
"7 49.481/-119.586\n",
"9 49.866/-119.739"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1.drop(['index','Code','Country','Admin1','Admin2','Admin3'], axis=1, inplace=True)\n",
"print(df1.shape)\n",
"df1.head()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"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>Coordinates</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>49.323/-122.863</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>49.221/-122.69</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>49.026/-122.806</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>49.481/-119.586</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>49.866/-119.739</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Coordinates\n",
"1 49.323/-122.863\n",
"3 49.221/-122.69\n",
"5 49.026/-122.806\n",
"7 49.481/-119.586\n",
"9 49.866/-119.739"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1.rename(columns={'Place':'Coordinates'}, inplace=True)\n",
"df1.head()"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"df1.reset_index(inplace = True, drop = True) \n",
"df2.reset_index(inplace = True, drop = True) "
]
},
{
"cell_type": "code",
"execution_count": 29,
"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>Coordinates</th>\n",
" <th>Place</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>49.323/-122.863</td>\n",
" <td>Port Moody</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>49.221/-122.69</td>\n",
" <td>Pitt Meadows</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>49.026/-122.806</td>\n",
" <td>White Rock</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>49.481/-119.586</td>\n",
" <td>Penticton</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>49.866/-119.739</td>\n",
" <td>Westbank</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Coordinates Place\n",
"0 49.323/-122.863 Port Moody\n",
"1 49.221/-122.69 Pitt Meadows\n",
"2 49.026/-122.806 White Rock\n",
"3 49.481/-119.586 Penticton\n",
"4 49.866/-119.739 Westbank"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1[\"Place\"]=df2[[\"Place\"]]\n",
"df1.head()"
]
},
{
"cell_type": "code",
"execution_count": 30,
"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>index</th>\n",
" <th>Place</th>\n",
" <th>Code</th>\n",
" <th>Country</th>\n",
" <th>Admin1</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.0</td>\n",
" <td>Port Moody</td>\n",
" <td>V3H</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2.0</td>\n",
" <td>Pitt Meadows</td>\n",
" <td>V3Y</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3.0</td>\n",
" <td>White Rock</td>\n",
" <td>V4B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4.0</td>\n",
" <td>Penticton</td>\n",
" <td>V2A</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5.0</td>\n",
" <td>Westbank</td>\n",
" <td>V4T</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" index Place Code Country Admin1\n",
"0 1.0 Port Moody V3H Canada British Columbia\n",
"1 2.0 Pitt Meadows V3Y Canada British Columbia\n",
"2 3.0 White Rock V4B Canada British Columbia\n",
"3 4.0 Penticton V2A Canada British Columbia\n",
"4 5.0 Westbank V4T Canada British Columbia"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df2.head()"
]
},
{
"cell_type": "code",
"execution_count": 31,
"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>Coordinates</th>\n",
" <th>Place</th>\n",
" <th>Code</th>\n",
" <th>Country</th>\n",
" <th>Admin1</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>49.323/-122.863</td>\n",
" <td>Port Moody</td>\n",
" <td>V3H</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>49.221/-122.69</td>\n",
" <td>Pitt Meadows</td>\n",
" <td>V3Y</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>49.026/-122.806</td>\n",
" <td>White Rock</td>\n",
" <td>V4B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>49.481/-119.586</td>\n",
" <td>Penticton</td>\n",
" <td>V2A</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>49.866/-119.739</td>\n",
" <td>Westbank</td>\n",
" <td>V4T</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Coordinates Place Code Country Admin1\n",
"0 49.323/-122.863 Port Moody V3H Canada British Columbia\n",
"1 49.221/-122.69 Pitt Meadows V3Y Canada British Columbia\n",
"2 49.026/-122.806 White Rock V4B Canada British Columbia\n",
"3 49.481/-119.586 Penticton V2A Canada British Columbia\n",
"4 49.866/-119.739 Westbank V4T Canada British Columbia"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1[\"Code\"]=df2[[\"Code\"]]\n",
"df1[\"Country\"]=df2[[\"Country\"]]\n",
"df1[\"Admin1\"]=df2[[\"Admin1\"]]\n",
"df1.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Now, we have obtained all the required data in one data frame. Upon checking the data types of each column, we find that that the coordinate values are in the 'string' data type,. Hence to use them in further processing, we split the values into latitude and longitude values, store them separately in the data frame and convert them to the float data type.\n"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"coordinates = df1[[\"Coordinates\"]].values.tolist()"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"lat=[]\n",
"long=[]\n",
"for i in range(len(coordinates)):\n",
" coord = coordinates[i][0].split(\"/\")\n",
" lat.append(coord[0])\n",
" long.append(coord[1])"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"df1[\"Latitude\"] = lat\n",
"df1[\"Longitude\"] = long"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"df1.rename(columns={'Admin1':'Province'}, inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"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>Coordinates</th>\n",
" <th>Place</th>\n",
" <th>Code</th>\n",
" <th>Country</th>\n",
" <th>Province</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>49.323/-122.863</td>\n",
" <td>Port Moody</td>\n",
" <td>V3H</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.323</td>\n",
" <td>-122.863</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>49.221/-122.69</td>\n",
" <td>Pitt Meadows</td>\n",
" <td>V3Y</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.221</td>\n",
" <td>-122.69</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>49.026/-122.806</td>\n",
" <td>White Rock</td>\n",
" <td>V4B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.026</td>\n",
" <td>-122.806</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>49.481/-119.586</td>\n",
" <td>Penticton</td>\n",
" <td>V2A</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.481</td>\n",
" <td>-119.586</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>49.866/-119.739</td>\n",
" <td>Westbank</td>\n",
" <td>V4T</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.866</td>\n",
" <td>-119.739</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Coordinates Place Code Country Province Latitude \\\n",
"0 49.323/-122.863 Port Moody V3H Canada British Columbia 49.323 \n",
"1 49.221/-122.69 Pitt Meadows V3Y Canada British Columbia 49.221 \n",
"2 49.026/-122.806 White Rock V4B Canada British Columbia 49.026 \n",
"3 49.481/-119.586 Penticton V2A Canada British Columbia 49.481 \n",
"4 49.866/-119.739 Westbank V4T Canada British Columbia 49.866 \n",
"\n",
" Longitude \n",
"0 -122.863 \n",
"1 -122.69 \n",
"2 -122.806 \n",
"3 -119.586 \n",
"4 -119.739 "
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1.head()"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
"df1[['Latitude','Longitude']] = df1[['Latitude','Longitude']].astype(np.float16) "
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(192, 7)\n"
]
},
{
"data": {
"text/plain": [
"Coordinates object\n",
"Place object\n",
"Code object\n",
"Country object\n",
"Province object\n",
"Latitude float16\n",
"Longitude float16\n",
"dtype: object"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(df1.shape)\n",
"df1.dtypes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### We also notice that several different locations inside the same cities having different postal codes have been included in our dataset. Under the assumption that the popular places that we aim to explore in each city will be similar, we remove redundant city values from our data frame. For example, if we have Vancouver East and Vancouver West in our data frame, then we remove the 'East' and the 'West' part and combine them into one 'Vancouver.\n"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [],
"source": [
"place = df1['Place'].tolist()"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"new_place = []\n",
"for i in place:\n",
" new_place.append(i.split(\" (\")[0])"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [],
"source": [
"df1['Place'] = new_place"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {},
"outputs": [],
"source": [
"aggregation_functions = {'Code': 'first', 'Country': 'first', 'Province': 'first', 'Latitude' : 'mean', 'Longitude' : 'mean'}\n",
"df_new = df1.groupby(df1['Place']).aggregate(aggregation_functions)"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(155, 5)\n"
]
}
],
"source": [
"print(df_new.shape)\n",
"df_new.reset_index(inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 75,
"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>Place</th>\n",
" <th>Code</th>\n",
" <th>Country</th>\n",
" <th>Province</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Abbotsford East</td>\n",
" <td>V3G</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.06250</td>\n",
" <td>-122.1875</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Abbotsford Southeast</td>\n",
" <td>V2S</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.03125</td>\n",
" <td>-122.3125</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Abbotsford Southwest</td>\n",
" <td>V2T</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.03125</td>\n",
" <td>-122.3750</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Abbotsford West</td>\n",
" <td>V4X</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.09375</td>\n",
" <td>-122.3750</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Atlin Region</td>\n",
" <td>V0W</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>59.62500</td>\n",
" <td>-133.5000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>150</th>\n",
" <td>Westbank</td>\n",
" <td>V4T</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.87500</td>\n",
" <td>-119.7500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>151</th>\n",
" <td>Whistler</td>\n",
" <td>V8E</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>50.12500</td>\n",
" <td>-122.9375</td>\n",
" </tr>\n",
" <tr>\n",
" <th>152</th>\n",
" <td>White Rock</td>\n",
" <td>V4B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.03125</td>\n",
" <td>-122.8125</td>\n",
" </tr>\n",
" <tr>\n",
" <th>153</th>\n",
" <td>Williams Lake</td>\n",
" <td>V2G</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>52.15625</td>\n",
" <td>-122.1250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>154</th>\n",
" <td>Winfield</td>\n",
" <td>V4V</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>50.03125</td>\n",
" <td>-119.3750</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>155 rows × 6 columns</p>\n",
"</div>"
],
"text/plain": [
" Place Code Country Province Latitude Longitude\n",
"0 Abbotsford East V3G Canada British Columbia 49.06250 -122.1875\n",
"1 Abbotsford Southeast V2S Canada British Columbia 49.03125 -122.3125\n",
"2 Abbotsford Southwest V2T Canada British Columbia 49.03125 -122.3750\n",
"3 Abbotsford West V4X Canada British Columbia 49.09375 -122.3750\n",
"4 Atlin Region V0W Canada British Columbia 59.62500 -133.5000\n",
".. ... ... ... ... ... ...\n",
"150 Westbank V4T Canada British Columbia 49.87500 -119.7500\n",
"151 Whistler V8E Canada British Columbia 50.12500 -122.9375\n",
"152 White Rock V4B Canada British Columbia 49.03125 -122.8125\n",
"153 Williams Lake V2G Canada British Columbia 52.15625 -122.1250\n",
"154 Winfield V4V Canada British Columbia 50.03125 -119.3750\n",
"\n",
"[155 rows x 6 columns]"
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_new"
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {},
"outputs": [],
"source": [
"place1 = df_new['Place'].tolist()"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {},
"outputs": [],
"source": [
"new_place1 = []\n",
"for i in place1:\n",
" new_place1.append(i.split(\" \")[0])"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {},
"outputs": [],
"source": [
"df_new['Distinct place'] = new_place1"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [],
"source": [
"aggregation_functions = {'Place' : 'first' ,'Code': 'first', 'Country': 'first', 'Province': 'first', 'Latitude' : 'mean', 'Longitude' : 'mean'}\n",
"df_new = df_new.groupby(df_new['Distinct place']).aggregate(aggregation_functions)"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['Abbotsford',\n",
" 'Atlin Region',\n",
" 'Burnaby',\n",
" 'Campbell River Central',\n",
" 'Cariboo and West Okanagan',\n",
" 'Castlegar',\n",
" 'Cedar',\n",
" 'Central Island',\n",
" 'Chilcotin',\n",
" 'Chilliwack Central',\n",
" 'Comox',\n",
" 'Coquitlam',\n",
" 'Courtenay Central',\n",
" 'Cranbrook',\n",
" 'Dawson Creek',\n",
" 'Delta Central',\n",
" 'Duncan',\n",
" 'East Kootenays',\n",
" 'Esquimalt',\n",
" 'Fort St. John',\n",
" 'Harrison Lake Region',\n",
" 'Highlands',\n",
" 'Inside Passage and the Queen Charlottes',\n",
" 'Juan de Fuca Shore',\n",
" 'Kamloops Central and',\n",
" 'Kelowna Central',\n",
" 'Kimberley',\n",
" 'Kitimat',\n",
" 'Ladysmith',\n",
" 'Langley City',\n",
" 'Lower Skeena',\n",
" 'Maple Ridge',\n",
" 'Merritt',\n",
" 'Metchosin',\n",
" 'Mission',\n",
" 'Nanaimo Central',\n",
" 'Nelson',\n",
" 'New Westminster Northeast',\n",
" 'North Central Island and Bute Inlet Region',\n",
" 'Northern British Columbia',\n",
" 'Oak Bay',\n",
" 'Omineca and Yellowhead',\n",
" 'Parksville',\n",
" 'Penticton',\n",
" 'Pitt Meadows',\n",
" 'Port Alberni',\n",
" 'Powell River',\n",
" 'Prince George Central',\n",
" 'Qualicum Beach',\n",
" 'Quesnel',\n",
" 'Richmond',\n",
" 'Saanich Central',\n",
" 'Salmon Arm',\n",
" 'Saltspring Island',\n",
" 'Sidney',\n",
" 'Similkameen',\n",
" 'Sooke',\n",
" 'South Okanagan',\n",
" 'Squamish',\n",
" 'Surrey',\n",
" 'Terrace',\n",
" 'Trail',\n",
" 'Upper Columbia Region',\n",
" 'Vancouver',\n",
" 'Vernon Central',\n",
" 'Victoria Central British Columbia Provincial Government',\n",
" 'West Kootenays',\n",
" 'Westbank',\n",
" 'Whistler',\n",
" 'White Rock',\n",
" 'Williams Lake',\n",
" 'Winfield']"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"modified_places = df_new['Place'].tolist()\n",
"for index, word in enumerate(modified_places):\n",
" if \" North Island, Sunshine Coast\" in word:\n",
" pass\n",
" elif \" Westminster\" in word:\n",
" pass\n",
" elif \" Northern\" in word:\n",
" pass\n",
" elif \" West Okanagan\" in word:\n",
" pass\n",
" elif \" East\" in word:\n",
" modified_places[index]=modified_places[index].replace(\" East\",\"\")\n",
" elif \" West\" in word:\n",
" modified_places[index]=modified_places[index].replace(\" West\",\"\")\n",
" elif \" Southeast\" in word:\n",
" modified_places[index]=modified_places[index].replace(\" Southeast\",\"\")\n",
" elif \" Northeast\" in word:\n",
" modified_places[index]=modified_places[index].replace(\" Northeast\",\"\")\n",
" elif \" North\" in word:\n",
" modified_places[index]=modified_places[index].replace(\" North\",\"\")\n",
" elif \" South\" in word:\n",
" modified_places[index]=modified_places[index].replace(\" South\",\"\")\n",
"modified_places"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {},
"outputs": [],
"source": [
"df_new['Place'] = modified_places"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {},
"outputs": [],
"source": [
"df_new.at[38, 'Place'] = \"North Island, Sunshine Coast\""
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(73, 6)\n"
]
}
],
"source": [
"print(df_new.shape)\n",
"df_new.reset_index(inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {},
"outputs": [],
"source": [
"df_new.drop(['Distinct place'], axis=1, inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 92,
"metadata": {},
"outputs": [],
"source": [
"pd.set_option('display.max_rows', df_new.shape[0]+1)"
]
},
{
"cell_type": "code",
"execution_count": 94,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(72, 6)\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>Place</th>\n",
" <th>Code</th>\n",
" <th>Country</th>\n",
" <th>Province</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Abbotsford</td>\n",
" <td>V3G</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.06250</td>\n",
" <td>-122.3125</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Atlin Region</td>\n",
" <td>V0W</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>59.62500</td>\n",
" <td>-133.5000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Burnaby</td>\n",
" <td>V3N</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.25000</td>\n",
" <td>-123.0000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Campbell River Central</td>\n",
" <td>V9W</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>50.00000</td>\n",
" <td>-125.5625</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Cariboo and West Okanagan</td>\n",
" <td>V0K</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>51.43750</td>\n",
" <td>-121.6250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Castlegar</td>\n",
" <td>V1N</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.31250</td>\n",
" <td>-117.6875</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Cedar</td>\n",
" <td>V9X</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.03125</td>\n",
" <td>-124.0000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Central Island</td>\n",
" <td>V0R</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.68750</td>\n",
" <td>-122.5000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Chilcotin</td>\n",
" <td>V0L</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>52.09375</td>\n",
" <td>-123.6250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Chilliwack Central</td>\n",
" <td>V2P</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.12500</td>\n",
" <td>-121.8125</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>Comox</td>\n",
" <td>V9M</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.68750</td>\n",
" <td>-124.9375</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Coquitlam</td>\n",
" <td>V3J</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.25000</td>\n",
" <td>-122.8750</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>Courtenay Central</td>\n",
" <td>V9N</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.68750</td>\n",
" <td>-125.1250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Cranbrook</td>\n",
" <td>V1C</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.50000</td>\n",
" <td>-115.7500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Dawson Creek</td>\n",
" <td>V1G</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>55.78125</td>\n",
" <td>-120.2500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>Delta Central</td>\n",
" <td>V4K</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.09375</td>\n",
" <td>-123.0000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>Duncan</td>\n",
" <td>V9L</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.78125</td>\n",
" <td>-123.6875</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>East Kootenays</td>\n",
" <td>V0B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.68750</td>\n",
" <td>-115.5625</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>Esquimalt</td>\n",
" <td>V9A</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.43750</td>\n",
" <td>-123.4375</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>Fort St. John</td>\n",
" <td>V1J</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>56.25000</td>\n",
" <td>-120.8750</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>Harrison Lake Region</td>\n",
" <td>V0M</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.62500</td>\n",
" <td>-122.0625</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>Highlands</td>\n",
" <td>V9B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.46875</td>\n",
" <td>-123.5000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>Inside Passage and the Queen Charlottes</td>\n",
" <td>V0T</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>52.21875</td>\n",
" <td>-126.1875</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>Juan de Fuca Shore</td>\n",
" <td>V0S</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.53125</td>\n",
" <td>-123.6875</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>Kamloops Central and</td>\n",
" <td>V2C</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>50.68750</td>\n",
" <td>-120.4375</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>Kelowna Central</td>\n",
" <td>V1Y</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.90625</td>\n",
" <td>-119.4375</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>Kimberley</td>\n",
" <td>V1A</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.68750</td>\n",
" <td>-116.0000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>Kitimat</td>\n",
" <td>V8C</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>54.06250</td>\n",
" <td>-128.6250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>Ladysmith</td>\n",
" <td>V9G</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.96875</td>\n",
" <td>-123.8125</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>Langley City</td>\n",
" <td>V3A</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.09375</td>\n",
" <td>-122.5625</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <td>Lower Skeena</td>\n",
" <td>V0V</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>53.96875</td>\n",
" <td>-129.8750</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31</th>\n",
" <td>Maple Ridge</td>\n",
" <td>V2W</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.25000</td>\n",
" <td>-122.5625</td>\n",
" </tr>\n",
" <tr>\n",
" <th>32</th>\n",
" <td>Merritt</td>\n",
" <td>V1K</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>50.12500</td>\n",
" <td>-120.8125</td>\n",
" </tr>\n",
" <tr>\n",
" <th>33</th>\n",
" <td>Metchosin</td>\n",
" <td>V9C</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.37500</td>\n",
" <td>-123.5625</td>\n",
" </tr>\n",
" <tr>\n",
" <th>34</th>\n",
" <td>Mission</td>\n",
" <td>V2V</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.43750</td>\n",
" <td>-122.4375</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35</th>\n",
" <td>Nanaimo Central</td>\n",
" <td>V9S</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.18750</td>\n",
" <td>-124.0000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>36</th>\n",
" <td>Nelson</td>\n",
" <td>V1L</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.50000</td>\n",
" <td>-117.3125</td>\n",
" </tr>\n",
" <tr>\n",
" <th>37</th>\n",
" <td>New Westminster Northeast</td>\n",
" <td>V3L</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.18750</td>\n",
" <td>-122.8750</td>\n",
" </tr>\n",
" <tr>\n",
" <th>38</th>\n",
" <td>North Central Island and Bute Inlet Region</td>\n",
" <td>V0P</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.56250</td>\n",
" <td>-123.6250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>39</th>\n",
" <td>Northern British Columbia</td>\n",
" <td>V0C</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>58.37500</td>\n",
" <td>-125.6875</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40</th>\n",
" <td>Oak Bay</td>\n",
" <td>V8R</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.43750</td>\n",
" <td>-123.3125</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41</th>\n",
" <td>Omineca and Yellowhead</td>\n",
" <td>V0J</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>56.00000</td>\n",
" <td>-126.8750</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42</th>\n",
" <td>Parksville</td>\n",
" <td>V9P</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.31250</td>\n",
" <td>-124.3125</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43</th>\n",
" <td>Penticton</td>\n",
" <td>V2A</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.46875</td>\n",
" <td>-119.5625</td>\n",
" </tr>\n",
" <tr>\n",
" <th>44</th>\n",
" <td>Pitt Meadows</td>\n",
" <td>V3Y</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.21875</td>\n",
" <td>-122.6875</td>\n",
" </tr>\n",
" <tr>\n",
" <th>45</th>\n",
" <td>Port Alberni</td>\n",
" <td>V9Y</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.28125</td>\n",
" <td>-123.1875</td>\n",
" </tr>\n",
" <tr>\n",
" <th>46</th>\n",
" <td>Powell River</td>\n",
" <td>V8A</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>50.03125</td>\n",
" <td>-124.3125</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47</th>\n",
" <td>Prince George Central</td>\n",
" <td>V2L</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>53.96875</td>\n",
" <td>-124.3750</td>\n",
" </tr>\n",
" <tr>\n",
" <th>48</th>\n",
" <td>Qualicum Beach</td>\n",
" <td>V9K</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.34375</td>\n",
" <td>-124.4375</td>\n",
" </tr>\n",
" <tr>\n",
" <th>49</th>\n",
" <td>Quesnel</td>\n",
" <td>V2J</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>52.96875</td>\n",
" <td>-122.5000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50</th>\n",
" <td>Richmond</td>\n",
" <td>V7B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.15625</td>\n",
" <td>-123.1250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>51</th>\n",
" <td>Saanich Central</td>\n",
" <td>V8Z</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.50000</td>\n",
" <td>-123.3750</td>\n",
" </tr>\n",
" <tr>\n",
" <th>52</th>\n",
" <td>Salmon Arm</td>\n",
" <td>V1E</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>50.68750</td>\n",
" <td>-119.2500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>53</th>\n",
" <td>Saltspring Island</td>\n",
" <td>V8K</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.81250</td>\n",
" <td>-123.5000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>54</th>\n",
" <td>Sidney</td>\n",
" <td>V8L</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.65625</td>\n",
" <td>-123.3750</td>\n",
" </tr>\n",
" <tr>\n",
" <th>55</th>\n",
" <td>Similkameen</td>\n",
" <td>V0X</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.37500</td>\n",
" <td>-120.6875</td>\n",
" </tr>\n",
" <tr>\n",
" <th>56</th>\n",
" <td>Sooke</td>\n",
" <td>V9Z</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.37500</td>\n",
" <td>-123.7500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>57</th>\n",
" <td>South Okanagan</td>\n",
" <td>V0H</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.40625</td>\n",
" <td>-119.0000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>58</th>\n",
" <td>Squamish</td>\n",
" <td>V8B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.68750</td>\n",
" <td>-123.1250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>59</th>\n",
" <td>Surrey</td>\n",
" <td>V3Z</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.12500</td>\n",
" <td>-122.8125</td>\n",
" </tr>\n",
" <tr>\n",
" <th>60</th>\n",
" <td>Terrace</td>\n",
" <td>V8G</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>54.53125</td>\n",
" <td>-128.6250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>61</th>\n",
" <td>Trail</td>\n",
" <td>V1R</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.09375</td>\n",
" <td>-117.6875</td>\n",
" </tr>\n",
" <tr>\n",
" <th>62</th>\n",
" <td>Upper Columbia Region</td>\n",
" <td>V0A</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>51.31250</td>\n",
" <td>-116.9375</td>\n",
" </tr>\n",
" <tr>\n",
" <th>63</th>\n",
" <td>Vancouver</td>\n",
" <td>V5K</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.25000</td>\n",
" <td>-123.1250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>64</th>\n",
" <td>Vernon Central</td>\n",
" <td>V1T</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>50.21875</td>\n",
" <td>-119.2500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>65</th>\n",
" <td>Victoria Central British Columbia Provincial G...</td>\n",
" <td>V8W</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.43750</td>\n",
" <td>-123.3750</td>\n",
" </tr>\n",
" <tr>\n",
" <th>66</th>\n",
" <td>West Kootenays</td>\n",
" <td>V0G</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.50000</td>\n",
" <td>-122.0625</td>\n",
" </tr>\n",
" <tr>\n",
" <th>67</th>\n",
" <td>Westbank</td>\n",
" <td>V4T</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.87500</td>\n",
" <td>-119.7500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>68</th>\n",
" <td>Whistler</td>\n",
" <td>V8E</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>50.12500</td>\n",
" <td>-122.9375</td>\n",
" </tr>\n",
" <tr>\n",
" <th>69</th>\n",
" <td>White Rock</td>\n",
" <td>V4B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.03125</td>\n",
" <td>-122.8125</td>\n",
" </tr>\n",
" <tr>\n",
" <th>70</th>\n",
" <td>Williams Lake</td>\n",
" <td>V2G</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>52.15625</td>\n",
" <td>-122.1250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>71</th>\n",
" <td>Winfield</td>\n",
" <td>V4V</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>50.03125</td>\n",
" <td>-119.3750</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Place Code Country \\\n",
"0 Abbotsford V3G Canada \n",
"1 Atlin Region V0W Canada \n",
"2 Burnaby V3N Canada \n",
"3 Campbell River Central V9W Canada \n",
"4 Cariboo and West Okanagan V0K Canada \n",
"5 Castlegar V1N Canada \n",
"6 Cedar V9X Canada \n",
"7 Central Island V0R Canada \n",
"8 Chilcotin V0L Canada \n",
"9 Chilliwack Central V2P Canada \n",
"10 Comox V9M Canada \n",
"11 Coquitlam V3J Canada \n",
"12 Courtenay Central V9N Canada \n",
"13 Cranbrook V1C Canada \n",
"14 Dawson Creek V1G Canada \n",
"15 Delta Central V4K Canada \n",
"16 Duncan V9L Canada \n",
"17 East Kootenays V0B Canada \n",
"18 Esquimalt V9A Canada \n",
"19 Fort St. John V1J Canada \n",
"20 Harrison Lake Region V0M Canada \n",
"21 Highlands V9B Canada \n",
"22 Inside Passage and the Queen Charlottes V0T Canada \n",
"23 Juan de Fuca Shore V0S Canada \n",
"24 Kamloops Central and V2C Canada \n",
"25 Kelowna Central V1Y Canada \n",
"26 Kimberley V1A Canada \n",
"27 Kitimat V8C Canada \n",
"28 Ladysmith V9G Canada \n",
"29 Langley City V3A Canada \n",
"30 Lower Skeena V0V Canada \n",
"31 Maple Ridge V2W Canada \n",
"32 Merritt V1K Canada \n",
"33 Metchosin V9C Canada \n",
"34 Mission V2V Canada \n",
"35 Nanaimo Central V9S Canada \n",
"36 Nelson V1L Canada \n",
"37 New Westminster Northeast V3L Canada \n",
"38 North Central Island and Bute Inlet Region V0P Canada \n",
"39 Northern British Columbia V0C Canada \n",
"40 Oak Bay V8R Canada \n",
"41 Omineca and Yellowhead V0J Canada \n",
"42 Parksville V9P Canada \n",
"43 Penticton V2A Canada \n",
"44 Pitt Meadows V3Y Canada \n",
"45 Port Alberni V9Y Canada \n",
"46 Powell River V8A Canada \n",
"47 Prince George Central V2L Canada \n",
"48 Qualicum Beach V9K Canada \n",
"49 Quesnel V2J Canada \n",
"50 Richmond V7B Canada \n",
"51 Saanich Central V8Z Canada \n",
"52 Salmon Arm V1E Canada \n",
"53 Saltspring Island V8K Canada \n",
"54 Sidney V8L Canada \n",
"55 Similkameen V0X Canada \n",
"56 Sooke V9Z Canada \n",
"57 South Okanagan V0H Canada \n",
"58 Squamish V8B Canada \n",
"59 Surrey V3Z Canada \n",
"60 Terrace V8G Canada \n",
"61 Trail V1R Canada \n",
"62 Upper Columbia Region V0A Canada \n",
"63 Vancouver V5K Canada \n",
"64 Vernon Central V1T Canada \n",
"65 Victoria Central British Columbia Provincial G... V8W Canada \n",
"66 West Kootenays V0G Canada \n",
"67 Westbank V4T Canada \n",
"68 Whistler V8E Canada \n",
"69 White Rock V4B Canada \n",
"70 Williams Lake V2G Canada \n",
"71 Winfield V4V Canada \n",
"\n",
" Province Latitude Longitude \n",
"0 British Columbia 49.06250 -122.3125 \n",
"1 British Columbia 59.62500 -133.5000 \n",
"2 British Columbia 49.25000 -123.0000 \n",
"3 British Columbia 50.00000 -125.5625 \n",
"4 British Columbia 51.43750 -121.6250 \n",
"5 British Columbia 49.31250 -117.6875 \n",
"6 British Columbia 49.03125 -124.0000 \n",
"7 British Columbia 49.68750 -122.5000 \n",
"8 British Columbia 52.09375 -123.6250 \n",
"9 British Columbia 49.12500 -121.8125 \n",
"10 British Columbia 49.68750 -124.9375 \n",
"11 British Columbia 49.25000 -122.8750 \n",
"12 British Columbia 49.68750 -125.1250 \n",
"13 British Columbia 49.50000 -115.7500 \n",
"14 British Columbia 55.78125 -120.2500 \n",
"15 British Columbia 49.09375 -123.0000 \n",
"16 British Columbia 48.78125 -123.6875 \n",
"17 British Columbia 49.68750 -115.5625 \n",
"18 British Columbia 48.43750 -123.4375 \n",
"19 British Columbia 56.25000 -120.8750 \n",
"20 British Columbia 49.62500 -122.0625 \n",
"21 British Columbia 48.46875 -123.5000 \n",
"22 British Columbia 52.21875 -126.1875 \n",
"23 British Columbia 48.53125 -123.6875 \n",
"24 British Columbia 50.68750 -120.4375 \n",
"25 British Columbia 49.90625 -119.4375 \n",
"26 British Columbia 49.68750 -116.0000 \n",
"27 British Columbia 54.06250 -128.6250 \n",
"28 British Columbia 48.96875 -123.8125 \n",
"29 British Columbia 49.09375 -122.5625 \n",
"30 British Columbia 53.96875 -129.8750 \n",
"31 British Columbia 49.25000 -122.5625 \n",
"32 British Columbia 50.12500 -120.8125 \n",
"33 British Columbia 48.37500 -123.5625 \n",
"34 British Columbia 49.43750 -122.4375 \n",
"35 British Columbia 49.18750 -124.0000 \n",
"36 British Columbia 49.50000 -117.3125 \n",
"37 British Columbia 49.18750 -122.8750 \n",
"38 British Columbia 49.56250 -123.6250 \n",
"39 British Columbia 58.37500 -125.6875 \n",
"40 British Columbia 48.43750 -123.3125 \n",
"41 British Columbia 56.00000 -126.8750 \n",
"42 British Columbia 49.31250 -124.3125 \n",
"43 British Columbia 49.46875 -119.5625 \n",
"44 British Columbia 49.21875 -122.6875 \n",
"45 British Columbia 49.28125 -123.1875 \n",
"46 British Columbia 50.03125 -124.3125 \n",
"47 British Columbia 53.96875 -124.3750 \n",
"48 British Columbia 49.34375 -124.4375 \n",
"49 British Columbia 52.96875 -122.5000 \n",
"50 British Columbia 49.15625 -123.1250 \n",
"51 British Columbia 48.50000 -123.3750 \n",
"52 British Columbia 50.68750 -119.2500 \n",
"53 British Columbia 48.81250 -123.5000 \n",
"54 British Columbia 48.65625 -123.3750 \n",
"55 British Columbia 49.37500 -120.6875 \n",
"56 British Columbia 48.37500 -123.7500 \n",
"57 British Columbia 49.40625 -119.0000 \n",
"58 British Columbia 49.68750 -123.1250 \n",
"59 British Columbia 49.12500 -122.8125 \n",
"60 British Columbia 54.53125 -128.6250 \n",
"61 British Columbia 49.09375 -117.6875 \n",
"62 British Columbia 51.31250 -116.9375 \n",
"63 British Columbia 49.25000 -123.1250 \n",
"64 British Columbia 50.21875 -119.2500 \n",
"65 British Columbia 48.43750 -123.3750 \n",
"66 British Columbia 49.50000 -122.0625 \n",
"67 British Columbia 49.87500 -119.7500 \n",
"68 British Columbia 50.12500 -122.9375 \n",
"69 British Columbia 49.03125 -122.8125 \n",
"70 British Columbia 52.15625 -122.1250 \n",
"71 British Columbia 50.03125 -119.3750 "
]
},
"execution_count": 94,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_new.dropna(subset = [\"Code\"], inplace=True)\n",
"print(df_new.shape)\n",
"df_new"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Hence, after all the necessary cleaning and preprocessing, we obtain the final data frame with 72 addresses and their latitude and longitude values. This completes our second method of obtaining data.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"## Methodology <a name=\"methodology\"></a>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### In the methodology section, we begin with outlining a map of British Columbia and mark all the neighborhoods from our data frame onto the map. For this purpose, we utilize the visualization libraries and hence our first step would be to install and import them. We also import the KMeans package for clustering from the Sklearn library for later use.\n"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting package metadata (current_repodata.json): done\n",
"Solving environment: done\n",
"\n",
"# All requested packages already installed.\n",
"\n",
"Collecting package metadata (current_repodata.json): done\n",
"Solving environment: failed with initial frozen solve. Retrying with flexible solve.\n",
"Collecting package metadata (repodata.json): done\n",
"Solving environment: done\n",
"\n",
"## Package Plan ##\n",
"\n",
" environment location: /home/jupyterlab/conda/envs/python\n",
"\n",
" added / updated specs:\n",
" - folium=0.5.0\n",
"\n",
"\n",
"The following packages will be downloaded:\n",
"\n",
" package | build\n",
" ---------------------------|-----------------\n",
" altair-4.1.0 | py_1 614 KB conda-forge\n",
" branca-0.4.1 | py_0 26 KB conda-forge\n",
" folium-0.5.0 | py_0 45 KB conda-forge\n",
" pandas-1.0.4 | py36h830a2c2_0 10.1 MB conda-forge\n",
" toolz-0.10.0 | py_0 46 KB conda-forge\n",
" vincent-0.4.4 | py_1 28 KB conda-forge\n",
" ------------------------------------------------------------\n",
" Total: 10.9 MB\n",
"\n",
"The following NEW packages will be INSTALLED:\n",
"\n",
" altair conda-forge/noarch::altair-4.1.0-py_1\n",
" attrs conda-forge/noarch::attrs-19.3.0-py_0\n",
" branca conda-forge/noarch::branca-0.4.1-py_0\n",
" entrypoints conda-forge/linux-64::entrypoints-0.3-py36h9f0ad1d_1001\n",
" folium conda-forge/noarch::folium-0.5.0-py_0\n",
" importlib_metadata conda-forge/noarch::importlib_metadata-1.6.0-0\n",
" jinja2 conda-forge/noarch::jinja2-2.11.2-pyh9f0ad1d_0\n",
" jsonschema conda-forge/linux-64::jsonschema-3.2.0-py36h9f0ad1d_1\n",
" markupsafe conda-forge/linux-64::markupsafe-1.1.1-py36h8c4c3a4_1\n",
" pandas conda-forge/linux-64::pandas-1.0.4-py36h830a2c2_0\n",
" pyrsistent conda-forge/linux-64::pyrsistent-0.16.0-py36h8c4c3a4_0\n",
" pytz conda-forge/noarch::pytz-2020.1-pyh9f0ad1d_0\n",
" toolz conda-forge/noarch::toolz-0.10.0-py_0\n",
" vincent conda-forge/noarch::vincent-0.4.4-py_1\n",
"\n",
"\n",
"\n",
"Downloading and Extracting Packages\n",
"toolz-0.10.0 | 46 KB | ##################################### | 100% \n",
"folium-0.5.0 | 45 KB | ##################################### | 100% \n",
"altair-4.1.0 | 614 KB | ##################################### | 100% \n",
"branca-0.4.1 | 26 KB | ##################################### | 100% \n",
"pandas-1.0.4 | 10.1 MB | ##################################### | 100% \n",
"vincent-0.4.4 | 28 KB | ##################################### | 100% \n",
"Preparing transaction: done\n",
"Verifying transaction: done\n",
"Executing transaction: done\n",
"Libraries imported.\n"
]
}
],
"source": [
"!conda install -c conda-forge geopy --yes # uncomment this line if you haven't completed the Foursquare API lab\n",
"from geopy.geocoders import Nominatim # convert an address into latitude and longitude values\n",
"\n",
"import json # library to handle JSON files\n",
"\n",
"import requests # library to handle requests\n",
"from pandas import json_normalize # tranform JSON file into a pandas dataframe\n",
"\n",
"# Matplotlib and associated plotting modules\n",
"import matplotlib.cm as cm\n",
"import matplotlib.colors as colors\n",
"\n",
"# import k-means from clustering stage\n",
"from sklearn.cluster import KMeans\n",
"\n",
"!conda install -c conda-forge folium=0.5.0 --yes # uncomment this line if you haven't completed the Foursquare API lab\n",
"import folium # map rendering library\n",
"\n",
"print('Libraries imported.')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### We obtain the coordinates for the British Columbia province using the geocoder package, as we did before in the data section.\n"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The lat long values for British Columbia are: 55.001251, -125.002441\n"
]
}
],
"source": [
"address = 'British Columbia, CA'\n",
"\n",
"N_obj = Nominatim(user_agent='british_columbia_explorer')\n",
"geo_obj = N_obj.geocode(address)\n",
"lat = geo_obj.latitude\n",
"long = geo_obj.longitude\n",
"print(\"The lat long values for British Columbia are: {}, {}\".format(lat,long))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Using the Folium library, we map the neighborhood coordinates onto the main British Columbia map.\n"
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"55.001251 , -125.002441\n"
]
},
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTggewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTUuMDAxMjUxLC0xMjUuMDAyNDQxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2ZjYWUxMmFjZDM1ZDQ5YjBhMmQ2OWZlZDc1MWU3Y2NmID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83OWUzOGJiNTg3ZDY0NWMyYjM2ZjAyOTQxYjIzMTg2YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjA2MjUsLTEyMi4zMTI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmMTg3NjQ2NjcyNDQ0OGY5ODEyOWFkODkyZTBmODUxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzljMmU0MmUzYmM1NTQwNzI5OWI1Zjg5MTNiMjI4MjljID0gJCgnPGRpdiBpZD0iaHRtbF85YzJlNDJlM2JjNTU0MDcyOTliNWY4OTEzYjIyODI5YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWJib3RzZm9yZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGYxODc2NDY2NzI0NDQ4Zjk4MTI5YWQ4OTJlMGY4NTEuc2V0Q29udGVudChodG1sXzljMmU0MmUzYmM1NTQwNzI5OWI1Zjg5MTNiMjI4MjljKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc5ZTM4YmI1ODdkNjQ1YzJiMzZmMDI5NDFiMjMxODZjLmJpbmRQb3B1cChwb3B1cF84ZjE4NzY0NjY3MjQ0NDhmOTgxMjlhZDg5MmUwZjg1MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YzI2MDE4NTUyYjU0MTlhOTJhN2M1MTE3YTQxODA1ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU5LjYyNSwtMTMzLjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjc3Mjg5MzczNjZkNDZlYzllZWEyNWM4OTY3N2FmMWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODliMDc1NzkzMDBiNDU0MDk1ZTMzYjgwYmRkNTk1YmEgPSAkKCc8ZGl2IGlkPSJodG1sXzg5YjA3NTc5MzAwYjQ1NDA5NWUzM2I4MGJkZDU5NWJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BdGxpbiBSZWdpb248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y3NzI4OTM3MzY2ZDQ2ZWM5ZWVhMjVjODk2NzdhZjFkLnNldENvbnRlbnQoaHRtbF84OWIwNzU3OTMwMGI0NTQwOTVlMzNiODBiZGQ1OTViYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YzI2MDE4NTUyYjU0MTlhOTJhN2M1MTE3YTQxODA1ZS5iaW5kUG9wdXAocG9wdXBfZjc3Mjg5MzczNjZkNDZlYzllZWEyNWM4OTY3N2FmMWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjc1ODExZGIyNTI2NGZkYjlhYWU1YjA3OWIyYzM2MDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS4yNSwtMTIzLjBdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWQ4YTIzNDYwZTRiNDI0ZDg1YTBjODliMjExZGUyNzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzNkNzg3OGQ1ZjM2NGFiMjk5ZmJmNTllNThiZTMwZjIgPSAkKCc8ZGl2IGlkPSJodG1sXzMzZDc4NzhkNWYzNjRhYjI5OWZiZjU5ZTU4YmUzMGYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXJuYWJ5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZDhhMjM0NjBlNGI0MjRkODVhMGM4OWIyMTFkZTI3Ni5zZXRDb250ZW50KGh0bWxfMzNkNzg3OGQ1ZjM2NGFiMjk5ZmJmNTllNThiZTMwZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjc1ODExZGIyNTI2NGZkYjlhYWU1YjA3OWIyYzM2MDcuYmluZFBvcHVwKHBvcHVwXzlkOGEyMzQ2MGU0YjQyNGQ4NWEwYzg5YjIxMWRlMjc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YzMDAyMzlmMTA2OTRjM2NhZTU1NTlmYWJmNDJjMjAzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMCwtMTI1LjU2MjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDYwMzM4Mzc3YjU3NGE0N2I4ZjZlY2FjOGMyM2ZkNzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTVjYzRlMGRjNWNjNGNlMmE3OGFjMzk3MDUyNzdlODUgPSAkKCc8ZGl2IGlkPSJodG1sXzE1Y2M0ZTBkYzVjYzRjZTJhNzhhYzM5NzA1Mjc3ZTg1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYW1wYmVsbCBSaXZlciBDZW50cmFsPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNjAzMzgzNzdiNTc0YTQ3YjhmNmVjYWM4YzIzZmQ3Ny5zZXRDb250ZW50KGh0bWxfMTVjYzRlMGRjNWNjNGNlMmE3OGFjMzk3MDUyNzdlODUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjMwMDIzOWYxMDY5NGMzY2FlNTU1OWZhYmY0MmMyMDMuYmluZFBvcHVwKHBvcHVwXzA2MDMzODM3N2I1NzRhNDdiOGY2ZWNhYzhjMjNmZDc3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IxMzY0OWI5ZmM5MDRlNzM4ZmJhMzcwYWNjOTZkMmExID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNDM3NSwtMTIxLjYyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZGI0MjBiZTZhMjQ0YjMxYjY3ODczMzJkZjViNmI0NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MWM0Y2Q1MThlODk0YWE0YmJjZDE0YmQ1NDQyOWU2NyA9ICQoJzxkaXYgaWQ9Imh0bWxfNzFjNGNkNTE4ZTg5NGFhNGJiY2QxNGJkNTQ0MjllNjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhcmlib28gYW5kIFdlc3QgT2thbmFnYW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdkYjQyMGJlNmEyNDRiMzFiNjc4NzMzMmRmNWI2YjQ1LnNldENvbnRlbnQoaHRtbF83MWM0Y2Q1MThlODk0YWE0YmJjZDE0YmQ1NDQyOWU2Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMTM2NDliOWZjOTA0ZTczOGZiYTM3MGFjYzk2ZDJhMS5iaW5kUG9wdXAocG9wdXBfN2RiNDIwYmU2YTI0NGIzMWI2Nzg3MzMyZGY1YjZiNDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGI3ZjA3Yzc3YzM3NDg4YjkyODIxMWY0NTdhZDk4NDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS4zMTI1LC0xMTcuNjg3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMGEyMWFlOWU1MzY0NzExYTI3NzQ4YzY1OTM0NWE5OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81Y2E5ZGQ1ZGQyMDk0Y2MwOTY1ZGFhMjVhZTljYmFmZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNWNhOWRkNWRkMjA5NGNjMDk2NWRhYTI1YWU5Y2JhZmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhc3RsZWdhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjBhMjFhZTllNTM2NDcxMWEyNzc0OGM2NTkzNDVhOTkuc2V0Q29udGVudChodG1sXzVjYTlkZDVkZDIwOTRjYzA5NjVkYWEyNWFlOWNiYWZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhiN2YwN2M3N2MzNzQ4OGI5MjgyMTFmNDU3YWQ5ODQ5LmJpbmRQb3B1cChwb3B1cF9mMGEyMWFlOWU1MzY0NzExYTI3NzQ4YzY1OTM0NWE5OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYjkzNzllYTNhMjk0MzAzYjA1NWYyMjBjYjVjMGYwOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjAzMTI1LC0xMjQuMF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZDIwMTU3ZGNkOGI0ZmRlYmJmYmE3OGQzNDBiY2Q0YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lOTNmODcwYTkyZTY0Zjg2OTQ2NDVlNWQ3MzY4NTczZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTkzZjg3MGE5MmU2NGY4Njk0NjQ1ZTVkNzM2ODU3M2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlZGFyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZDIwMTU3ZGNkOGI0ZmRlYmJmYmE3OGQzNDBiY2Q0YS5zZXRDb250ZW50KGh0bWxfZTkzZjg3MGE5MmU2NGY4Njk0NjQ1ZTVkNzM2ODU3M2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWI5Mzc5ZWEzYTI5NDMwM2IwNTVmMjIwY2I1YzBmMDguYmluZFBvcHVwKHBvcHVwXzBkMjAxNTdkY2Q4YjRmZGViYmZiYTc4ZDM0MGJjZDRhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYxNGExM2JjZmMzYzQ4MjNhODRjY2U1MmIwNTIzNDhkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuNjg3NSwtMTIyLjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGE5MGUwMjMwYTM2NDY2NDljZWRmMTMxMDM4YzlkMTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTYwN2NjYWJhZDhjNGEyNThiYmJiNjJiODJjOGNjNDAgPSAkKCc8ZGl2IGlkPSJodG1sX2E2MDdjY2FiYWQ4YzRhMjU4YmJiYjYyYjgyYzhjYzQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DZW50cmFsIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGE5MGUwMjMwYTM2NDY2NDljZWRmMTMxMDM4YzlkMTQuc2V0Q29udGVudChodG1sX2E2MDdjY2FiYWQ4YzRhMjU4YmJiYjYyYjgyYzhjYzQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYxNGExM2JjZmMzYzQ4MjNhODRjY2U1MmIwNTIzNDhkLmJpbmRQb3B1cChwb3B1cF80YTkwZTAyMzBhMzY0NjY0OWNlZGYxMzEwMzhjOWQxNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZTgzMDNkODZiNmY0MWYwYTUzOGFhYTdmOTRmYjNiMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjA5Mzc1LC0xMjMuNjI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RhZTUxM2NlYjI4MTRmZjJhZWYzYmE3ODQwNTdjZjdhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBiNmU3MjJlY2RiMjRkYmM5OTdhMjQ4ZmM0MDU4ZGFiID0gJCgnPGRpdiBpZD0iaHRtbF8wYjZlNzIyZWNkYjI0ZGJjOTk3YTI0OGZjNDA1OGRhYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hpbGNvdGluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYWU1MTNjZWIyODE0ZmYyYWVmM2JhNzg0MDU3Y2Y3YS5zZXRDb250ZW50KGh0bWxfMGI2ZTcyMmVjZGIyNGRiYzk5N2EyNDhmYzQwNThkYWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmU4MzAzZDg2YjZmNDFmMGE1MzhhYWE3Zjk0ZmIzYjEuYmluZFBvcHVwKHBvcHVwX2RhZTUxM2NlYjI4MTRmZjJhZWYzYmE3ODQwNTdjZjdhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdhYjAyMWQ1MjZjZDRmMTNhMWRmYjlkMjQ1ODEyYTFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuMTI1LC0xMjEuODEyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYTU3NjA0MGIxZTc0NjY5YjkwOWVmODE1OWJkYTAwYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZTVkNmJlYzE1MTk0ZTU0YTdmMTEyZmYyMjZmMjFmYyA9ICQoJzxkaXYgaWQ9Imh0bWxfNmU1ZDZiZWMxNTE5NGU1NGE3ZjExMmZmMjI2ZjIxZmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNoaWxsaXdhY2sgQ2VudHJhbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmE1NzYwNDBiMWU3NDY2OWI5MDllZjgxNTliZGEwMGEuc2V0Q29udGVudChodG1sXzZlNWQ2YmVjMTUxOTRlNTRhN2YxMTJmZjIyNmYyMWZjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdhYjAyMWQ1MjZjZDRmMTNhMWRmYjlkMjQ1ODEyYTFlLmJpbmRQb3B1cChwb3B1cF9iYTU3NjA0MGIxZTc0NjY5YjkwOWVmODE1OWJkYTAwYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNzMxNmYwOGI5OWY0OTI5ODcwMGFmMDBmMzg0ZmIzZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjY4NzUsLTEyNC45Mzc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZjYzcyYWRjOGFlMzQ5YjBiNTRhODMxOThhYWFiYTEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FhNjNiMmY4OWNmMzRlZDY5ZmE4Njg2NGEyY2U1N2NhID0gJCgnPGRpdiBpZD0iaHRtbF9hYTYzYjJmODljZjM0ZWQ2OWZhODY4NjRhMmNlNTdjYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29tb3g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZjYzcyYWRjOGFlMzQ5YjBiNTRhODMxOThhYWFiYTEyLnNldENvbnRlbnQoaHRtbF9hYTYzYjJmODljZjM0ZWQ2OWZhODY4NjRhMmNlNTdjYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNzMxNmYwOGI5OWY0OTI5ODcwMGFmMDBmMzg0ZmIzZi5iaW5kUG9wdXAocG9wdXBfZmNjNzJhZGM4YWUzNDliMGI1NGE4MzE5OGFhYWJhMTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTE1YzJjYmY4YjEzNGE5Nzk0OTVmZWQ5NzY5ZDM2M2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS4yNSwtMTIyLjg3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZjI3YzJjYmMyYzY0YTNlYjVhZGRhNmUzNzRjNWQ2MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZmIwNGE2NDc4MjI0ZGQ1OTAwNTdlYjZjODVmM2I4NyA9ICQoJzxkaXYgaWQ9Imh0bWxfM2ZiMDRhNjQ3ODIyNGRkNTkwMDU3ZWI2Yzg1ZjNiODciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvcXVpdGxhbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2YyN2MyY2JjMmM2NGEzZWI1YWRkYTZlMzc0YzVkNjEuc2V0Q29udGVudChodG1sXzNmYjA0YTY0NzgyMjRkZDU5MDA1N2ViNmM4NWYzYjg3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUxNWMyY2JmOGIxMzRhOTc5NDk1ZmVkOTc2OWQzNjNjLmJpbmRQb3B1cChwb3B1cF8zZjI3YzJjYmMyYzY0YTNlYjVhZGRhNmUzNzRjNWQ2MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZGVmMTc0NzFiZmI0ODNjYmRmNjExMTcyZjE0MzNlNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjY4NzUsLTEyNS4xMjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTgwOWViZTU3MmNjNDRlYjkzYWRjZjRhNzRjNTQyMjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTU3NzlmOTM4MmU1NDA2Mzk2YjMzMjllZmQxMmZmMjggPSAkKCc8ZGl2IGlkPSJodG1sXzk1Nzc5ZjkzODJlNTQwNjM5NmIzMzI5ZWZkMTJmZjI4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db3VydGVuYXkgQ2VudHJhbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTgwOWViZTU3MmNjNDRlYjkzYWRjZjRhNzRjNTQyMjIuc2V0Q29udGVudChodG1sXzk1Nzc5ZjkzODJlNTQwNjM5NmIzMzI5ZWZkMTJmZjI4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNkZWYxNzQ3MWJmYjQ4M2NiZGY2MTExNzJmMTQzM2U2LmJpbmRQb3B1cChwb3B1cF9hODA5ZWJlNTcyY2M0NGViOTNhZGNmNGE3NGM1NDIyMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iOTE0NzgwYTMwOWQ0OTE5YjNjYWU1YzM0YTNjMzVmYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjUsLTExNS43NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MWMxZjM0NjlmMzc0NmFiODM3NGRjY2ZlMDcyNzBlYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNjk2NmZhMmM2MzU0MDBkOGU0YTMyYzI0ZTkyNDEzYiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjY5NjZmYTJjNjM1NDAwZDhlNGEzMmMyNGU5MjQxM2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNyYW5icm9vazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODFjMWYzNDY5ZjM3NDZhYjgzNzRkY2NmZTA3MjcwZWIuc2V0Q29udGVudChodG1sX2I2OTY2ZmEyYzYzNTQwMGQ4ZTRhMzJjMjRlOTI0MTNiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I5MTQ3ODBhMzA5ZDQ5MTliM2NhZTVjMzRhM2MzNWZiLmJpbmRQb3B1cChwb3B1cF84MWMxZjM0NjlmMzc0NmFiODM3NGRjY2ZlMDcyNzBlYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNWJkM2Q3MDFlMzQ0ZmVjYTNhZjJhOGJjYmUzZTZiMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU1Ljc4MTI1LC0xMjAuMjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWQxZDJiNGUwNTlkNGI4Yzg1NjhiMzgzMzBiYmMxNzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWNlNTgwYjgzNDgyNDRhOWJhMWI0ZThhMDYyY2U0M2YgPSAkKCc8ZGl2IGlkPSJodG1sX2VjZTU4MGI4MzQ4MjQ0YTliYTFiNGU4YTA2MmNlNDNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EYXdzb24gQ3JlZWs8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlkMWQyYjRlMDU5ZDRiOGM4NTY4YjM4MzMwYmJjMTcxLnNldENvbnRlbnQoaHRtbF9lY2U1ODBiODM0ODI0NGE5YmExYjRlOGEwNjJjZTQzZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNWJkM2Q3MDFlMzQ0ZmVjYTNhZjJhOGJjYmUzZTZiMi5iaW5kUG9wdXAocG9wdXBfOWQxZDJiNGUwNTlkNGI4Yzg1NjhiMzgzMzBiYmMxNzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2EzYWI4NThmNGFhNGVlMTgyZjJkYjk2ZTFjNjZkNmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS4wOTM3NSwtMTIzLjBdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGU1ZGY1MjU0OGEwNDlkZDhjN2FmYjJkMzEyMmU3ODEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDhmYTMxZTAzZGI0NDNjMzkzZTIwZDZlNTc2Yjg5OTQgPSAkKCc8ZGl2IGlkPSJodG1sXzA4ZmEzMWUwM2RiNDQzYzM5M2UyMGQ2ZTU3NmI4OTk0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EZWx0YSBDZW50cmFsPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZTVkZjUyNTQ4YTA0OWRkOGM3YWZiMmQzMTIyZTc4MS5zZXRDb250ZW50KGh0bWxfMDhmYTMxZTAzZGI0NDNjMzkzZTIwZDZlNTc2Yjg5OTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2EzYWI4NThmNGFhNGVlMTgyZjJkYjk2ZTFjNjZkNmIuYmluZFBvcHVwKHBvcHVwXzBlNWRmNTI1NDhhMDQ5ZGQ4YzdhZmIyZDMxMjJlNzgxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U4NWY5YTBiMzkxNzQ3YWM5YjRhNDMyOGI4OWYzZjc4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDguNzgxMjUsLTEyMy42ODc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJjNjMzOTRjNGQ1MTQ2ODM5MDFhY2MxN2YwN2VhNTg4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NmZGZkZWRkNmVhZDQwNjBhMmJhNDhlNmJkNWIzYTQ4ID0gJCgnPGRpdiBpZD0iaHRtbF9jZmRmZGVkZDZlYWQ0MDYwYTJiYTQ4ZTZiZDViM2E0OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RHVuY2FuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yYzYzMzk0YzRkNTE0NjgzOTAxYWNjMTdmMDdlYTU4OC5zZXRDb250ZW50KGh0bWxfY2ZkZmRlZGQ2ZWFkNDA2MGEyYmE0OGU2YmQ1YjNhNDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTg1ZjlhMGIzOTE3NDdhYzliNGE0MzI4Yjg5ZjNmNzguYmluZFBvcHVwKHBvcHVwXzJjNjMzOTRjNGQ1MTQ2ODM5MDFhY2MxN2YwN2VhNTg4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJmZTA3YTkzOTgzMzRlY2ZhNGRmMmFiMzgzYzAwZWQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuNjg3NSwtMTE1LjU2MjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjFjMDFmMTljNTM4NGU0N2FlOGYzZGRmNzM3ODRlMzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWU2NTZiMmEzY2QzNDQ2NTk4YjRhOTVkNGUwOTA2N2QgPSAkKCc8ZGl2IGlkPSJodG1sX2VlNjU2YjJhM2NkMzQ0NjU5OGI0YTk1ZDRlMDkwNjdkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEtvb3RlbmF5czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjFjMDFmMTljNTM4NGU0N2FlOGYzZGRmNzM3ODRlMzIuc2V0Q29udGVudChodG1sX2VlNjU2YjJhM2NkMzQ0NjU5OGI0YTk1ZDRlMDkwNjdkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJmZTA3YTkzOTgzMzRlY2ZhNGRmMmFiMzgzYzAwZWQwLmJpbmRQb3B1cChwb3B1cF82MWMwMWYxOWM1Mzg0ZTQ3YWU4ZjNkZGY3Mzc4NGUzMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MmM2MmU0NWExZTk0ZDU1OTg0MWE5YTQ4ODkzYzk4ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ4LjQzNzUsLTEyMy40Mzc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhiNWRhYzFhNGFmMTRlNmNhNTIxNDY4YTBmZWU2ZGI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY2YzExNTM0MWE3ZTRkZjlhNGZmZGNhOWM5MjE4NDMwID0gJCgnPGRpdiBpZD0iaHRtbF82NmMxMTUzNDFhN2U0ZGY5YTRmZmRjYTljOTIxODQzMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RXNxdWltYWx0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YjVkYWMxYTRhZjE0ZTZjYTUyMTQ2OGEwZmVlNmRiOS5zZXRDb250ZW50KGh0bWxfNjZjMTE1MzQxYTdlNGRmOWE0ZmZkY2E5YzkyMTg0MzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODJjNjJlNDVhMWU5NGQ1NTk4NDFhOWE0ODg5M2M5OGYuYmluZFBvcHVwKHBvcHVwXzhiNWRhYzFhNGFmMTRlNmNhNTIxNDY4YTBmZWU2ZGI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FhMTYwYzVmMzE4YjQzOWZhNGQ3ZDA4OTBmYjk5ODhjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTYuMjUsLTEyMC44NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2FmNjI1Y2E2NDE2NGIzN2IxZWUxZjU2YTA1MDE4YzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDgxMmZiNjg5ODBlNDgyZGE2NGM5MmQ3YWRiMzk1ODQgPSAkKCc8ZGl2IGlkPSJodG1sX2Q4MTJmYjY4OTgwZTQ4MmRhNjRjOTJkN2FkYjM5NTg0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3J0IFN0LiBKb2huPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYWY2MjVjYTY0MTY0YjM3YjFlZTFmNTZhMDUwMThjMi5zZXRDb250ZW50KGh0bWxfZDgxMmZiNjg5ODBlNDgyZGE2NGM5MmQ3YWRiMzk1ODQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWExNjBjNWYzMThiNDM5ZmE0ZDdkMDg5MGZiOTk4OGMuYmluZFBvcHVwKHBvcHVwX2NhZjYyNWNhNjQxNjRiMzdiMWVlMWY1NmEwNTAxOGMyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg2NDE3YzJlYjM1MzQ3YjRhNjc2YWU2MTE3NjQzZTZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuNjI1LC0xMjIuMDYyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNDYyNmI2OTVmMGQ0MjM3Yjk3OGQ1OGQ2NmI4YWFhZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NTA1NDZlZmU2NDE0Yjk0YWFjZjY4ZDNmYjliNWY1NCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDUwNTQ2ZWZlNjQxNGI5NGFhY2Y2OGQzZmI5YjVmNTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhcnJpc29uIExha2UgUmVnaW9uPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNDYyNmI2OTVmMGQ0MjM3Yjk3OGQ1OGQ2NmI4YWFhZC5zZXRDb250ZW50KGh0bWxfNDUwNTQ2ZWZlNjQxNGI5NGFhY2Y2OGQzZmI5YjVmNTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODY0MTdjMmViMzUzNDdiNGE2NzZhZTYxMTc2NDNlNmMuYmluZFBvcHVwKHBvcHVwX2E0NjI2YjY5NWYwZDQyMzdiOTc4ZDU4ZDY2YjhhYWFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M3YjVjZWJiOWIwYjQ0YWFhZmI1NWI1ZDkzNTVjODJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDguNDY4NzUsLTEyMy41XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q3ZTA5MzhlYzQ2YjRkZmE5MDBjYmQxYWIyZGYzNWZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYxZjFhNGZkNTgwODRlOWZiZWI2ZjNkYmM0YmYxNGQzID0gJCgnPGRpdiBpZD0iaHRtbF82MWYxYTRmZDU4MDg0ZTlmYmViNmYzZGJjNGJmMTRkMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGlnaGxhbmRzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kN2UwOTM4ZWM0NmI0ZGZhOTAwY2JkMWFiMmRmMzVmYS5zZXRDb250ZW50KGh0bWxfNjFmMWE0ZmQ1ODA4NGU5ZmJlYjZmM2RiYzRiZjE0ZDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzdiNWNlYmI5YjBiNDRhYWFmYjU1YjVkOTM1NWM4MmUuYmluZFBvcHVwKHBvcHVwX2Q3ZTA5MzhlYzQ2YjRkZmE5MDBjYmQxYWIyZGYzNWZhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkzMDhiMjg0NmQwMzRlMmM4ZjJjYTBkZGRlZDY0ZDczID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuMjE4NzUsLTEyNi4xODc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAwZjg0MDUyMjRkMjQ3MThhMGQ3NjIyNzRhNDliYzJjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y3YmM5NDczYWE1NDQ1NzNhMjU3ODljZGIxN2FlODRjID0gJCgnPGRpdiBpZD0iaHRtbF9mN2JjOTQ3M2FhNTQ0NTczYTI1Nzg5Y2RiMTdhZTg0YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SW5zaWRlIFBhc3NhZ2UgYW5kIHRoZSBRdWVlbiBDaGFybG90dGVzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMGY4NDA1MjI0ZDI0NzE4YTBkNzYyMjc0YTQ5YmMyYy5zZXRDb250ZW50KGh0bWxfZjdiYzk0NzNhYTU0NDU3M2EyNTc4OWNkYjE3YWU4NGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTMwOGIyODQ2ZDAzNGUyYzhmMmNhMGRkZGVkNjRkNzMuYmluZFBvcHVwKHBvcHVwXzAwZjg0MDUyMjRkMjQ3MThhMGQ3NjIyNzRhNDliYzJjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y4ZDMwNTQ2NjNlODQwYjQ5NjlmNzFkMGZiZjA5MTI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDguNTMxMjUsLTEyMy42ODc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y4OGNlNDg5YjFjNTQ5NjBiM2IwZGYxYzAyYzkxNTRjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc1ZTVhYzBhYzI1ZTQ5N2Y4ZjZhYWNjYWMzMmY5ODEyID0gJCgnPGRpdiBpZD0iaHRtbF83NWU1YWMwYWMyNWU0OTdmOGY2YWFjY2FjMzJmOTgxMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SnVhbiBkZSBGdWNhIFNob3JlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mODhjZTQ4OWIxYzU0OTYwYjNiMGRmMWMwMmM5MTU0Yy5zZXRDb250ZW50KGh0bWxfNzVlNWFjMGFjMjVlNDk3ZjhmNmFhY2NhYzMyZjk4MTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjhkMzA1NDY2M2U4NDBiNDk2OWY3MWQwZmJmMDkxMjYuYmluZFBvcHVwKHBvcHVwX2Y4OGNlNDg5YjFjNTQ5NjBiM2IwZGYxYzAyYzkxNTRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRkZjFkNzRjNzBiYTQ4MjQ5NzgwODUyNDk3OTViMjhkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuNjg3NSwtMTIwLjQzNzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDAyMzliM2NlODA3NGE5ZmFmNWNkNDgyOGRkODZiZjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjJjMTZkY2IwYTVkNDM1OWE5MjdkMGQ0ZDZiODA3NGUgPSAkKCc8ZGl2IGlkPSJodG1sX2YyYzE2ZGNiMGE1ZDQzNTlhOTI3ZDBkNGQ2YjgwNzRlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LYW1sb29wcyBDZW50cmFsIGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDAyMzliM2NlODA3NGE5ZmFmNWNkNDgyOGRkODZiZjkuc2V0Q29udGVudChodG1sX2YyYzE2ZGNiMGE1ZDQzNTlhOTI3ZDBkNGQ2YjgwNzRlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRkZjFkNzRjNzBiYTQ4MjQ5NzgwODUyNDk3OTViMjhkLmJpbmRQb3B1cChwb3B1cF9kMDIzOWIzY2U4MDc0YTlmYWY1Y2Q0ODI4ZGQ4NmJmOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZjg3OTlkZWEzNDM0MDY2YmIyOTk0MzUyYzNkZTQ3ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkwNjI1LC0xMTkuNDM3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMjY2NTM4ZjhhZDk0ZmYzYTBiMWE4NWVkOTIyOGVkMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yOTVkNzllZWFjNmY0ZWVmYWIyYWNkODU2Yjk5YTlkOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjk1ZDc5ZWVhYzZmNGVlZmFiMmFjZDg1NmI5OWE5ZDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktlbG93bmEgQ2VudHJhbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjI2NjUzOGY4YWQ5NGZmM2EwYjFhODVlZDkyMjhlZDEuc2V0Q29udGVudChodG1sXzI5NWQ3OWVlYWM2ZjRlZWZhYjJhY2Q4NTZiOTlhOWQ5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZmODc5OWRlYTM0MzQwNjZiYjI5OTQzNTJjM2RlNDdlLmJpbmRQb3B1cChwb3B1cF9mMjY2NTM4ZjhhZDk0ZmYzYTBiMWE4NWVkOTIyOGVkMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mODJhYzEwOTQ2MjE0ZmRmYmEzYmE0OGQ2Yjg1NmIzZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjY4NzUsLTExNi4wXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNkNjljZmEwMjA1NDQ1NDE5MjBkZWFkNzAxM2U3OGRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZjMTM3NGM3NjE5ZDQwZDRhYzE0ZWQyMmU2ZjUxMWVhID0gJCgnPGRpdiBpZD0iaHRtbF9mYzEzNzRjNzYxOWQ0MGQ0YWMxNGVkMjJlNmY1MTFlYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2ltYmVybGV5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZDY5Y2ZhMDIwNTQ0NTQxOTIwZGVhZDcwMTNlNzhkZi5zZXRDb250ZW50KGh0bWxfZmMxMzc0Yzc2MTlkNDBkNGFjMTRlZDIyZTZmNTExZWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjgyYWMxMDk0NjIxNGZkZmJhM2JhNDhkNmI4NTZiM2YuYmluZFBvcHVwKHBvcHVwXzNkNjljZmEwMjA1NDQ1NDE5MjBkZWFkNzAxM2U3OGRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdjZGIyODNmYTljZDRiNzBhZjljNDM1ZTQwMGIzOGFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuMDYyNSwtMTI4LjYyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZjkzOTk1ZmY5MzY0NTIzOTJiYmE2NTE1ZmQ0YzBkOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jY2Y3MDcyM2E0MGE0MGQ5YTcxZDNlZWFiOGJhNDY4NyA9ICQoJzxkaXYgaWQ9Imh0bWxfY2NmNzA3MjNhNDBhNDBkOWE3MWQzZWVhYjhiYTQ2ODciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktpdGltYXQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmOTM5OTVmZjkzNjQ1MjM5MmJiYTY1MTVmZDRjMGQ5LnNldENvbnRlbnQoaHRtbF9jY2Y3MDcyM2E0MGE0MGQ5YTcxZDNlZWFiOGJhNDY4Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83Y2RiMjgzZmE5Y2Q0YjcwYWY5YzQzNWU0MDBiMzhhYS5iaW5kUG9wdXAocG9wdXBfYWY5Mzk5NWZmOTM2NDUyMzkyYmJhNjUxNWZkNGMwZDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWMzMzNjMDU4OGZmNDA1N2E3M2IzZTkzZmI4YzU0YmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OC45Njg3NSwtMTIzLjgxMjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmMwZTQ2OTVlM2IxNDZhYTgwY2Q2YWJiNzliMjJmNmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTc2MzlkZjdmNDQ0NGM0Zjg5NWRiNGQ3ODI4NTA3OWQgPSAkKCc8ZGl2IGlkPSJodG1sX2E3NjM5ZGY3ZjQ0NDRjNGY4OTVkYjRkNzgyODUwNzlkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYWR5c21pdGg8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JjMGU0Njk1ZTNiMTQ2YWE4MGNkNmFiYjc5YjIyZjZiLnNldENvbnRlbnQoaHRtbF9hNzYzOWRmN2Y0NDQ0YzRmODk1ZGI0ZDc4Mjg1MDc5ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YzMzM2MwNTg4ZmY0MDU3YTczYjNlOTNmYjhjNTRiZC5iaW5kUG9wdXAocG9wdXBfYmMwZTQ2OTVlM2IxNDZhYTgwY2Q2YWJiNzliMjJmNmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWZhYTgzYWQ4MGRiNGU4N2I0YjY0OWQ0YWYwMGZkMWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS4wOTM3NSwtMTIyLjU2MjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzRjOWI0NTI5MzIwNGYyMjkyODZmODMwMmJmMDc3MWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzUxNThkYWEzOWRlNDQ1Mjk5Nzc0YmViZjM5ODNmZjEgPSAkKCc8ZGl2IGlkPSJodG1sXzc1MTU4ZGFhMzlkZTQ0NTI5OTc3NGJlYmYzOTgzZmYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYW5nbGV5IENpdHk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc0YzliNDUyOTMyMDRmMjI5Mjg2ZjgzMDJiZjA3NzFlLnNldENvbnRlbnQoaHRtbF83NTE1OGRhYTM5ZGU0NDUyOTk3NzRiZWJmMzk4M2ZmMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZmFhODNhZDgwZGI0ZTg3YjRiNjQ5ZDRhZjAwZmQxZS5iaW5kUG9wdXAocG9wdXBfNzRjOWI0NTI5MzIwNGYyMjkyODZmODMwMmJmMDc3MWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWZlOWNkZGJlMmVlNGIxMjkwZmU3ZTkwNWVkMDIzODYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My45Njg3NSwtMTI5Ljg3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMDAxYzQ5OTE1OTg0MWJjOGIyZTcwMmJiYjJhMzZkNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMTIxZGEzZjBhZmI0MTcxYTRmNjRkNDVhOTk1NjM5NCA9ICQoJzxkaXYgaWQ9Imh0bWxfMzEyMWRhM2YwYWZiNDE3MWE0ZjY0ZDQ1YTk5NTYzOTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxvd2VyIFNrZWVuYTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDAwMWM0OTkxNTk4NDFiYzhiMmU3MDJiYmIyYTM2ZDUuc2V0Q29udGVudChodG1sXzMxMjFkYTNmMGFmYjQxNzFhNGY2NGQ0NWE5OTU2Mzk0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlmZTljZGRiZTJlZTRiMTI5MGZlN2U5MDVlZDAyMzg2LmJpbmRQb3B1cChwb3B1cF9kMDAxYzQ5OTE1OTg0MWJjOGIyZTcwMmJiYjJhMzZkNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xYjZhOThlNWNiOGQ0NGI4YjhkZTk1NzA3ZTJjNTQzOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjI1LC0xMjIuNTYyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMmE5NGJiZDUxMjA0YTVmOTg0YWRjZTA2MDE1ZmRmNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMDhiZjg5ZGM1Zjg0NDZhYmE4NGRhNTg0MjM1ZmQyMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTA4YmY4OWRjNWY4NDQ2YWJhODRkYTU4NDIzNWZkMjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hcGxlIFJpZGdlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMmE5NGJiZDUxMjA0YTVmOTg0YWRjZTA2MDE1ZmRmNS5zZXRDb250ZW50KGh0bWxfMTA4YmY4OWRjNWY4NDQ2YWJhODRkYTU4NDIzNWZkMjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWI2YTk4ZTVjYjhkNDRiOGI4ZGU5NTcwN2UyYzU0MzguYmluZFBvcHVwKHBvcHVwXzMyYTk0YmJkNTEyMDRhNWY5ODRhZGNlMDYwMTVmZGY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAxNjcwYjgzNmVmOTQxNzM5YTdhNTg2OWYzNmU3NzcwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMTI1LC0xMjAuODEyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ODFjNWU5NzVlNzE0YTJmYjRhNjA5N2Y2M2ExNTFjNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YzEwM2I0NWFhZmY0ODBlOWE3NWJiMzgxNzNlMTc3MyA9ICQoJzxkaXYgaWQ9Imh0bWxfNmMxMDNiNDVhYWZmNDgwZTlhNzViYjM4MTczZTE3NzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1lcnJpdHQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc4MWM1ZTk3NWU3MTRhMmZiNGE2MDk3ZjYzYTE1MWM1LnNldENvbnRlbnQoaHRtbF82YzEwM2I0NWFhZmY0ODBlOWE3NWJiMzgxNzNlMTc3Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMTY3MGI4MzZlZjk0MTczOWE3YTU4NjlmMzZlNzc3MC5iaW5kUG9wdXAocG9wdXBfNzgxYzVlOTc1ZTcxNGEyZmI0YTYwOTdmNjNhMTUxYzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWFlZDNhZGI1MTRiNDFjOGEyYzliOGE1Y2NiYTM1YWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OC4zNzUsLTEyMy41NjI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMwNmQ3OGUxMjViMTQyZjU5OTRiNjM1YTVmZTQ0NGFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhmY2EyZTJhZjBhYzRkZDE5ZDMxZTc4YzQ5OTMwODMzID0gJCgnPGRpdiBpZD0iaHRtbF84ZmNhMmUyYWYwYWM0ZGQxOWQzMWU3OGM0OTkzMDgzMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWV0Y2hvc2luPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMDZkNzhlMTI1YjE0MmY1OTk0YjYzNWE1ZmU0NDRhZS5zZXRDb250ZW50KGh0bWxfOGZjYTJlMmFmMGFjNGRkMTlkMzFlNzhjNDk5MzA4MzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWFlZDNhZGI1MTRiNDFjOGEyYzliOGE1Y2NiYTM1YWYuYmluZFBvcHVwKHBvcHVwXzMwNmQ3OGUxMjViMTQyZjU5OTRiNjM1YTVmZTQ0NGFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UzNDI3N2U4YTViZTQzZjk4ZTc1ZDNhYjEzNmJmZDMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuNDM3NSwtMTIyLjQzNzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWQ5OTEzMzZhY2IzNDAyY2FjMWI1OWM1MTU0NmM0MjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWQyMTQ4NGNmMWJlNDU5OGFiMWZhMDU2NjdhMzY4ZDcgPSAkKCc8ZGl2IGlkPSJodG1sX2FkMjE0ODRjZjFiZTQ1OThhYjFmYTA1NjY3YTM2OGQ3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaXNzaW9uPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZDk5MTMzNmFjYjM0MDJjYWMxYjU5YzUxNTQ2YzQyMi5zZXRDb250ZW50KGh0bWxfYWQyMTQ4NGNmMWJlNDU5OGFiMWZhMDU2NjdhMzY4ZDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTM0Mjc3ZThhNWJlNDNmOThlNzVkM2FiMTM2YmZkMzMuYmluZFBvcHVwKHBvcHVwX2VkOTkxMzM2YWNiMzQwMmNhYzFiNTljNTE1NDZjNDIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlkMDljYjA4ZDkyOTRjY2FhY2ZkMGMzMTFlMjc3NzRhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuMTg3NSwtMTI0LjBdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjU0ODc1MjU5YzI2NGVmZDg1ODg4ZDUxZDA5ODg0OTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWY3YjcxMDE4MjdmNDlhNWE5NDMzZDY2MzIwOTk5Y2QgPSAkKCc8ZGl2IGlkPSJodG1sXzVmN2I3MTAxODI3ZjQ5YTVhOTQzM2Q2NjMyMDk5OWNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OYW5haW1vIENlbnRyYWw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY1NDg3NTI1OWMyNjRlZmQ4NTg4OGQ1MWQwOTg4NDkyLnNldENvbnRlbnQoaHRtbF81ZjdiNzEwMTgyN2Y0OWE1YTk0MzNkNjYzMjA5OTljZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZDA5Y2IwOGQ5Mjk0Y2NhYWNmZDBjMzExZTI3Nzc0YS5iaW5kUG9wdXAocG9wdXBfNjU0ODc1MjU5YzI2NGVmZDg1ODg4ZDUxZDA5ODg0OTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTE1ZGJlOTkxMzM4NDFkYmI0OTQ2Yzk0NjliNzA4MWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS41LC0xMTcuMzEyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMDE1MjM2Mzg3ZGM0MDQyODM4NDg5ZjJjMWE4MjY1NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZmIxNWFiZDZiOWQ0MWQ1YjNhMWJlYWM5OTlhOTUxZiA9ICQoJzxkaXYgaWQ9Imh0bWxfOGZiMTVhYmQ2YjlkNDFkNWIzYTFiZWFjOTk5YTk1MWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5lbHNvbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTAxNTIzNjM4N2RjNDA0MjgzODQ4OWYyYzFhODI2NTUuc2V0Q29udGVudChodG1sXzhmYjE1YWJkNmI5ZDQxZDViM2ExYmVhYzk5OWE5NTFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkxNWRiZTk5MTMzODQxZGJiNDk0NmM5NDY5YjcwODFkLmJpbmRQb3B1cChwb3B1cF9lMDE1MjM2Mzg3ZGM0MDQyODM4NDg5ZjJjMWE4MjY1NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNzg5NTk5YTk4NmQ0YmRjYTY4NGY4N2JlZTcyOTViNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjE4NzUsLTEyMi44NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmQzYTIxOTM4NjgxNDhkMWJhYzA3OWY5ZmY2N2Q1YjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmQ3OGNmZGY1OTI0NDVhYjhhODdhNzRkYTQ4OGRkYzYgPSAkKCc8ZGl2IGlkPSJodG1sX2JkNzhjZmRmNTkyNDQ1YWI4YTg3YTc0ZGE0ODhkZGM2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgV2VzdG1pbnN0ZXIgTm9ydGhlYXN0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZDNhMjE5Mzg2ODE0OGQxYmFjMDc5ZjlmZjY3ZDViMS5zZXRDb250ZW50KGh0bWxfYmQ3OGNmZGY1OTI0NDVhYjhhODdhNzRkYTQ4OGRkYzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjc4OTU5OWE5ODZkNGJkY2E2ODRmODdiZWU3Mjk1YjYuYmluZFBvcHVwKHBvcHVwX2ZkM2EyMTkzODY4MTQ4ZDFiYWMwNzlmOWZmNjdkNWIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc3MmExZTlkYWUzMTQ5NTZiNmY1ZGU5OTJjZWRmMjU3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuNTYyNSwtMTIzLjYyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kODJkMzM2MTk0OWI0ZWEwYmZhMGFkNDgyNjYwNTVlNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85Mjg0YTkyNWY0YWU0NjcyYWIxYmUyNGQ5ZjE4MDFiOSA9ICQoJzxkaXYgaWQ9Imh0bWxfOTI4NGE5MjVmNGFlNDY3MmFiMWJlMjRkOWYxODAxYjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIENlbnRyYWwgSXNsYW5kIGFuZCBCdXRlIElubGV0IFJlZ2lvbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDgyZDMzNjE5NDliNGVhMGJmYTBhZDQ4MjY2MDU1ZTQuc2V0Q29udGVudChodG1sXzkyODRhOTI1ZjRhZTQ2NzJhYjFiZTI0ZDlmMTgwMWI5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc3MmExZTlkYWUzMTQ5NTZiNmY1ZGU5OTJjZWRmMjU3LmJpbmRQb3B1cChwb3B1cF9kODJkMzM2MTk0OWI0ZWEwYmZhMGFkNDgyNjYwNTVlNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNThmMmM2MDFhZGY0YjRmOWViMDcyZTRjZDE0MDg4OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU4LjM3NSwtMTI1LjY4NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDMzZDBjODQzYmExNGFkYWFjODExZDg1MzM4N2QxZjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTE1MmExMzVmZWQ0NDZkODg1ZDgzOTJhZjU0ZDkwYjIgPSAkKCc8ZGl2IGlkPSJodG1sXzkxNTJhMTM1ZmVkNDQ2ZDg4NWQ4MzkyYWY1NGQ5MGIyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aGVybiBCcml0aXNoIENvbHVtYmlhPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMzNkMGM4NDNiYTE0YWRhYWM4MTFkODUzMzg3ZDFmNy5zZXRDb250ZW50KGh0bWxfOTE1MmExMzVmZWQ0NDZkODg1ZDgzOTJhZjU0ZDkwYjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTU4ZjJjNjAxYWRmNGI0ZjllYjA3MmU0Y2QxNDA4ODguYmluZFBvcHVwKHBvcHVwX2QzM2QwYzg0M2JhMTRhZGFhYzgxMWQ4NTMzODdkMWY3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QzY2I0NWJhYTVmYjRkOGI4NTM3Mzg3ZjcyMDg0MWY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDguNDM3NSwtMTIzLjMxMjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzU5Y2YzMjdiNWNiNDg2NGIyYTI1OGM3OWFkMDM1ODggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzdiMmQ0ODUzOWFiNDc2YmI1OTMyZjBiODg5NzM0N2QgPSAkKCc8ZGl2IGlkPSJodG1sXzM3YjJkNDg1MzlhYjQ3NmJiNTkzMmYwYjg4OTczNDdkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PYWsgQmF5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNTljZjMyN2I1Y2I0ODY0YjJhMjU4Yzc5YWQwMzU4OC5zZXRDb250ZW50KGh0bWxfMzdiMmQ0ODUzOWFiNDc2YmI1OTMyZjBiODg5NzM0N2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDNjYjQ1YmFhNWZiNGQ4Yjg1MzczODdmNzIwODQxZjYuYmluZFBvcHVwKHBvcHVwX2M1OWNmMzI3YjVjYjQ4NjRiMmEyNThjNzlhZDAzNTg4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RlOWZjOTdkOTBmZTQ4MjViM2VkMTNmYmFiMTgwODdmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTYuMCwtMTI2Ljg3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNGU5MWIwNTFjZGQ0YTIwYjJlMmYxNTNkNTBiMTM4MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNjIxYzQ1YWE2NjQ0NjgzYWFjNDdhNzQwMmVmYmFkZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTYyMWM0NWFhNjY0NDY4M2FhYzQ3YTc0MDJlZmJhZGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9taW5lY2EgYW5kIFllbGxvd2hlYWQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U0ZTkxYjA1MWNkZDRhMjBiMmUyZjE1M2Q1MGIxMzgzLnNldENvbnRlbnQoaHRtbF8xNjIxYzQ1YWE2NjQ0NjgzYWFjNDdhNzQwMmVmYmFkZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZTlmYzk3ZDkwZmU0ODI1YjNlZDEzZmJhYjE4MDg3Zi5iaW5kUG9wdXAocG9wdXBfZTRlOTFiMDUxY2RkNGEyMGIyZTJmMTUzZDUwYjEzODMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmFhODBiN2NmMGM4NGY1NWFiYTYwY2I1NjIzZmEzNjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS4zMTI1LC0xMjQuMzEyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZDgzMDk4OGUyZmE0YTNmYjg3NWYyMmYyNzJiMTA4OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wN2U1ODBkZThmNGE0ZjUyYTQzNDEyNjBiZjI1NThmYyA9ICQoJzxkaXYgaWQ9Imh0bWxfMDdlNTgwZGU4ZjRhNGY1MmE0MzQxMjYwYmYyNTU4ZmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhcmtzdmlsbGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RkODMwOTg4ZTJmYTRhM2ZiODc1ZjIyZjI3MmIxMDg5LnNldENvbnRlbnQoaHRtbF8wN2U1ODBkZThmNGE0ZjUyYTQzNDEyNjBiZjI1NThmYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYWE4MGI3Y2YwYzg0ZjU1YWJhNjBjYjU2MjNmYTM2OS5iaW5kUG9wdXAocG9wdXBfZGQ4MzA5ODhlMmZhNGEzZmI4NzVmMjJmMjcyYjEwODkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDJmODEyOWIwNmY0NDE2NTgwYmE2MGFlYjBlNDYwYzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS40Njg3NSwtMTE5LjU2MjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTZhZWJiYTgyZWI3NDM1ZDlhM2M5YjdkOWYxYjUyYWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTRmZDUwNjY0MzI1NDExMGFiNDc3YzU1YmM5ZjA3ODYgPSAkKCc8ZGl2IGlkPSJodG1sXzE0ZmQ1MDY2NDMyNTQxMTBhYjQ3N2M1NWJjOWYwNzg2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZW50aWN0b248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE2YWViYmE4MmViNzQzNWQ5YTNjOWI3ZDlmMWI1MmFkLnNldENvbnRlbnQoaHRtbF8xNGZkNTA2NjQzMjU0MTEwYWI0NzdjNTViYzlmMDc4Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMmY4MTI5YjA2ZjQ0MTY1ODBiYTYwYWViMGU0NjBjMS5iaW5kUG9wdXAocG9wdXBfMTZhZWJiYTgyZWI3NDM1ZDlhM2M5YjdkOWYxYjUyYWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTA5OWFiOWRjNzM0NGFiMGI0YzFiZGU0MmRiZTQ1YWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS4yMTg3NSwtMTIyLjY4NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTExZjY4MTYzZWMzNGEyOTk2M2M1YzZiYTMxODA4NTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWM0OWQ3ZDMxMzMxNGRjN2JiMzJlNGM2YzYwNzgyODAgPSAkKCc8ZGl2IGlkPSJodG1sX2FjNDlkN2QzMTMzMTRkYzdiYjMyZTRjNmM2MDc4MjgwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXR0IE1lYWRvd3M8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UxMWY2ODE2M2VjMzRhMjk5NjNjNWM2YmEzMTgwODU3LnNldENvbnRlbnQoaHRtbF9hYzQ5ZDdkMzEzMzE0ZGM3YmIzMmU0YzZjNjA3ODI4MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMDk5YWI5ZGM3MzQ0YWIwYjRjMWJkZTQyZGJlNDVhYy5iaW5kUG9wdXAocG9wdXBfZTExZjY4MTYzZWMzNGEyOTk2M2M1YzZiYTMxODA4NTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmE4NDUxN2YxZWNhNGE0OTkyODExY2Q4OThkM2JiZDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS4yODEyNSwtMTIzLjE4NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOThmNTBkMGRmMTllNGJlYmFkZmY0YTcwMDEwOWQwODAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmE0OGUxYjk1YWNlNDcyMDkxNzBlMjY1MDc4Zjk1ZGUgPSAkKCc8ZGl2IGlkPSJodG1sX2ZhNDhlMWI5NWFjZTQ3MjA5MTcwZTI2NTA3OGY5NWRlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qb3J0IEFsYmVybmk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk4ZjUwZDBkZjE5ZTRiZWJhZGZmNGE3MDAxMDlkMDgwLnNldENvbnRlbnQoaHRtbF9mYTQ4ZTFiOTVhY2U0NzIwOTE3MGUyNjUwNzhmOTVkZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYTg0NTE3ZjFlY2E0YTQ5OTI4MTFjZDg5OGQzYmJkMi5iaW5kUG9wdXAocG9wdXBfOThmNTBkMGRmMTllNGJlYmFkZmY0YTcwMDEwOWQwODApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDZjNjc0YWQ2MzliNDQ2MmJjOWFlMjk4YzA2MDAxZmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wMzEyNSwtMTI0LjMxMjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTBmMDA0YWEyNDEyNGVlNWIyY2Q0MTM4NWQ2YWJhYTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWViZWJlYjQzYmQ4NDk5NWJiYWM2MWQ0NTdiNjRjMDQgPSAkKCc8ZGl2IGlkPSJodG1sX2FlYmViZWI0M2JkODQ5OTViYmFjNjFkNDU3YjY0YzA0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qb3dlbGwgUml2ZXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EwZjAwNGFhMjQxMjRlZTViMmNkNDEzODVkNmFiYWEzLnNldENvbnRlbnQoaHRtbF9hZWJlYmViNDNiZDg0OTk1YmJhYzYxZDQ1N2I2NGMwNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NmM2NzRhZDYzOWI0NDYyYmM5YWUyOThjMDYwMDFmZi5iaW5kUG9wdXAocG9wdXBfYTBmMDA0YWEyNDEyNGVlNWIyY2Q0MTM4NWQ2YWJhYTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjFkYjAwZDBiN2Q0NGFhY2E3ZGYwMmJlNTY4MzkxOTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My45Njg3NSwtMTI0LjM3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83YWUzZDA1M2ZmNmI0MDk4YWQ5YjBmZTI2ZTUwZjlkMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hOTRmODQxNjhmZmU0MmEyODA0MjVkODAyMDllNjMyMiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTk0Zjg0MTY4ZmZlNDJhMjgwNDI1ZDgwMjA5ZTYzMjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlByaW5jZSBHZW9yZ2UgQ2VudHJhbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2FlM2QwNTNmZjZiNDA5OGFkOWIwZmUyNmU1MGY5ZDAuc2V0Q29udGVudChodG1sX2E5NGY4NDE2OGZmZTQyYTI4MDQyNWQ4MDIwOWU2MzIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YxZGIwMGQwYjdkNDRhYWNhN2RmMDJiZTU2ODM5MTkxLmJpbmRQb3B1cChwb3B1cF83YWUzZDA1M2ZmNmI0MDk4YWQ5YjBmZTI2ZTUwZjlkMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZmJlNWY2M2U4MzY0ZDA2YmNjOWEyNDcxZDEwM2QwZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjM0Mzc1LC0xMjQuNDM3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNGFkNzM3Y2ExOTA0ZGM0OWU3YTAwZjY4NzVlNmYwMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NTU5ZDVlMTRhNjM0YWViODFhNWJkOTAxN2EwOTgxNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDU1OWQ1ZTE0YTYzNGFlYjgxYTViZDkwMTdhMDk4MTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlF1YWxpY3VtIEJlYWNoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNGFkNzM3Y2ExOTA0ZGM0OWU3YTAwZjY4NzVlNmYwMS5zZXRDb250ZW50KGh0bWxfNDU1OWQ1ZTE0YTYzNGFlYjgxYTViZDkwMTdhMDk4MTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2ZiZTVmNjNlODM2NGQwNmJjYzlhMjQ3MWQxMDNkMGQuYmluZFBvcHVwKHBvcHVwX2Q0YWQ3MzdjYTE5MDRkYzQ5ZTdhMDBmNjg3NWU2ZjAxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFkNDRiY2UwNTY2MjRhNzU4YmMzNzU2Y2NmZThlOGY5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuOTY4NzUsLTEyMi41XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg3YjE2MGY3ZTU3MDQxMGM5NmY5NmYzYThmZjkzMTZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y3ZGU3NzNlM2YwODQwMGNiMTE1NTk4NTBkYmIwNWQwID0gJCgnPGRpdiBpZD0iaHRtbF9mN2RlNzczZTNmMDg0MDBjYjExNTU5ODUwZGJiMDVkMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlc25lbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODdiMTYwZjdlNTcwNDEwYzk2Zjk2ZjNhOGZmOTMxNmIuc2V0Q29udGVudChodG1sX2Y3ZGU3NzNlM2YwODQwMGNiMTE1NTk4NTBkYmIwNWQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFkNDRiY2UwNTY2MjRhNzU4YmMzNzU2Y2NmZThlOGY5LmJpbmRQb3B1cChwb3B1cF84N2IxNjBmN2U1NzA0MTBjOTZmOTZmM2E4ZmY5MzE2Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZTMzNzE0ZmNiN2I0MDc2YTdhNTU4NmRlNjg3YWM0MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjE1NjI1LC0xMjMuMTI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQyMjA2NGUyNGJkMjQzMjA5MDE0ZjMzYzFhNzQyYTljID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcyNGEwNmFhNTZiMDRmOTA4NjhkZTRkNDQ2ZWY1M2UwID0gJCgnPGRpdiBpZD0iaHRtbF83MjRhMDZhYTU2YjA0ZjkwODY4ZGU0ZDQ0NmVmNTNlMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmljaG1vbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQyMjA2NGUyNGJkMjQzMjA5MDE0ZjMzYzFhNzQyYTljLnNldENvbnRlbnQoaHRtbF83MjRhMDZhYTU2YjA0ZjkwODY4ZGU0ZDQ0NmVmNTNlMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZTMzNzE0ZmNiN2I0MDc2YTdhNTU4NmRlNjg3YWM0MS5iaW5kUG9wdXAocG9wdXBfNDIyMDY0ZTI0YmQyNDMyMDkwMTRmMzNjMWE3NDJhOWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWEyN2I0YmNkOTViNDAyZDljMzYxNDEzZjdiZjI5NTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OC41LC0xMjMuMzc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg5OWEwNDFiMmM2NTQxOWM4Y2UyY2ExMWI5NzM5ZGM1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEyYTgxYTljNjBiMjQ5MjU4ZDIxZmJhNWQ2YTBjODE1ID0gJCgnPGRpdiBpZD0iaHRtbF8xMmE4MWE5YzYwYjI0OTI1OGQyMWZiYTVkNmEwYzgxNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2FhbmljaCBDZW50cmFsPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OTlhMDQxYjJjNjU0MTljOGNlMmNhMTFiOTczOWRjNS5zZXRDb250ZW50KGh0bWxfMTJhODFhOWM2MGIyNDkyNThkMjFmYmE1ZDZhMGM4MTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWEyN2I0YmNkOTViNDAyZDljMzYxNDEzZjdiZjI5NTguYmluZFBvcHVwKHBvcHVwXzg5OWEwNDFiMmM2NTQxOWM4Y2UyY2ExMWI5NzM5ZGM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZhNDMxZjhkY2QxOTQ0YzQ5N2U2N2RiOWM5MmIxYWVkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuNjg3NSwtMTE5LjI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YzNjczMmM5ZWZjMjRkZTJhMjExY2JlMTBjMGI0MjczID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEwZTg5MWNjMDU1ZDRmNTY5Y2EyZTFjZmNkZTM1NGM0ID0gJCgnPGRpdiBpZD0iaHRtbF8xMGU4OTFjYzA1NWQ0ZjU2OWNhMmUxY2ZjZGUzNTRjNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2FsbW9uIEFybTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjM2NzMyYzllZmMyNGRlMmEyMTFjYmUxMGMwYjQyNzMuc2V0Q29udGVudChodG1sXzEwZTg5MWNjMDU1ZDRmNTY5Y2EyZTFjZmNkZTM1NGM0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZhNDMxZjhkY2QxOTQ0YzQ5N2U2N2RiOWM5MmIxYWVkLmJpbmRQb3B1cChwb3B1cF9mMzY3MzJjOWVmYzI0ZGUyYTIxMWNiZTEwYzBiNDI3Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yODJlMWVhNmY4ZjI0YTU2YjA5ZWJlZGE2NWYxNGY5YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ4LjgxMjUsLTEyMy41XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRmMmZkYTMzYzY3MDQzMTY5YTMzNzc5OGRiZjBjMzUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBmOTQ1NzZmODE3MjRiOWQ4MGQ4NDkzODkzMTU4MTdjID0gJCgnPGRpdiBpZD0iaHRtbF8wZjk0NTc2ZjgxNzI0YjlkODBkODQ5Mzg5MzE1ODE3YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2FsdHNwcmluZyBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRmMmZkYTMzYzY3MDQzMTY5YTMzNzc5OGRiZjBjMzUyLnNldENvbnRlbnQoaHRtbF8wZjk0NTc2ZjgxNzI0YjlkODBkODQ5Mzg5MzE1ODE3Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yODJlMWVhNmY4ZjI0YTU2YjA5ZWJlZGE2NWYxNGY5Yy5iaW5kUG9wdXAocG9wdXBfNGYyZmRhMzNjNjcwNDMxNjlhMzM3Nzk4ZGJmMGMzNTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWYzNTdlMWQ1ZjRlNDgxMjliMTQzOGE1OTNmZmE1ZjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OC42NTYyNSwtMTIzLjM3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80M2Q2Mzk4NDZmNzU0YWQ5YjQyMmY2ZmJmZWFiYzU0ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMGU2MWExOTdmMDE0YjkzOGRkZjYyNTc1ZTFhOTQ5YSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDBlNjFhMTk3ZjAxNGI5MzhkZGY2MjU3NWUxYTk0OWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNpZG5leTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDNkNjM5ODQ2Zjc1NGFkOWI0MjJmNmZiZmVhYmM1NGUuc2V0Q29udGVudChodG1sXzAwZTYxYTE5N2YwMTRiOTM4ZGRmNjI1NzVlMWE5NDlhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlmMzU3ZTFkNWY0ZTQ4MTI5YjE0MzhhNTkzZmZhNWYzLmJpbmRQb3B1cChwb3B1cF80M2Q2Mzk4NDZmNzU0YWQ5YjQyMmY2ZmJmZWFiYzU0ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMTRlMjBkYjA4MzY0YjZiOTMwOGVhMTI0Y2NkMjI4ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjM3NSwtMTIwLjY4NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTBiNTQwNjA3ZmU5NDgyYzgwNjE4YTkwNDJlZDdhNDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmE1MmI0YjlhY2M5NDJkMzk5ZjdkYjg5NzRhNGY5M2QgPSAkKCc8ZGl2IGlkPSJodG1sX2ZhNTJiNGI5YWNjOTQyZDM5OWY3ZGI4OTc0YTRmOTNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TaW1pbGthbWVlbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTBiNTQwNjA3ZmU5NDgyYzgwNjE4YTkwNDJlZDdhNDkuc2V0Q29udGVudChodG1sX2ZhNTJiNGI5YWNjOTQyZDM5OWY3ZGI4OTc0YTRmOTNkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMxNGUyMGRiMDgzNjRiNmI5MzA4ZWExMjRjY2QyMjhkLmJpbmRQb3B1cChwb3B1cF9lMGI1NDA2MDdmZTk0ODJjODA2MThhOTA0MmVkN2E0OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YjRiYmUwY2Y4YjY0MGNjOTUwMmRkMmZlMjljNzhlNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ4LjM3NSwtMTIzLjc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZkYTM2MDc3NzQzODQ1YzBiMTEzZjdjMDQ0NzEyZThmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUyNTlkMGNiMDc2MzRlMTFhYjdkYTRlZTE5ZjkwN2UyID0gJCgnPGRpdiBpZD0iaHRtbF81MjU5ZDBjYjA3NjM0ZTExYWI3ZGE0ZWUxOWY5MDdlMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U29va2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZkYTM2MDc3NzQzODQ1YzBiMTEzZjdjMDQ0NzEyZThmLnNldENvbnRlbnQoaHRtbF81MjU5ZDBjYjA3NjM0ZTExYWI3ZGE0ZWUxOWY5MDdlMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YjRiYmUwY2Y4YjY0MGNjOTUwMmRkMmZlMjljNzhlNS5iaW5kUG9wdXAocG9wdXBfZmRhMzYwNzc3NDM4NDVjMGIxMTNmN2MwNDQ3MTJlOGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzU2MjE3YzMzYWIxNDE2NTkyYWI1NTg4Y2Y0YjZkMWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS40MDYyNSwtMTE5LjBdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWQwNTNhMzJhZjRlNGVhY2E3Yzc2MDEzZWJlOWM1MTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWE3Y2ZkNzhlM2E0NDFmNjk3ZmI0YzU0NzY0MjI0MTcgPSAkKCc8ZGl2IGlkPSJodG1sX2FhN2NmZDc4ZTNhNDQxZjY5N2ZiNGM1NDc2NDIyNDE3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb3V0aCBPa2FuYWdhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWQwNTNhMzJhZjRlNGVhY2E3Yzc2MDEzZWJlOWM1MTkuc2V0Q29udGVudChodG1sX2FhN2NmZDc4ZTNhNDQxZjY5N2ZiNGM1NDc2NDIyNDE3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM1NjIxN2MzM2FiMTQxNjU5MmFiNTU4OGNmNGI2ZDFiLmJpbmRQb3B1cChwb3B1cF9lZDA1M2EzMmFmNGU0ZWFjYTdjNzYwMTNlYmU5YzUxOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iOGJkNzk5NGFiYmE0MjdiYTdhNGVmYzBiNzk0ZDBhMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjY4NzUsLTEyMy4xMjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjQxYmY2MzFhZmNhNGEyYzhlNTI0YzdiODkzNzQ2ZDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzk5YjAzYzA3YjQ2NDM2MThlZmM1ZjRhZjI2YjkwZGIgPSAkKCc8ZGl2IGlkPSJodG1sXzM5OWIwM2MwN2I0NjQzNjE4ZWZjNWY0YWYyNmI5MGRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcXVhbWlzaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjQxYmY2MzFhZmNhNGEyYzhlNTI0YzdiODkzNzQ2ZDkuc2V0Q29udGVudChodG1sXzM5OWIwM2MwN2I0NjQzNjE4ZWZjNWY0YWYyNmI5MGRiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I4YmQ3OTk0YWJiYTQyN2JhN2E0ZWZjMGI3OTRkMGExLmJpbmRQb3B1cChwb3B1cF8yNDFiZjYzMWFmY2E0YTJjOGU1MjRjN2I4OTM3NDZkOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZTdlOGRkNTc0NGU0ZDhmOTE1NzNkNDVmZDllMzk5OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjEyNSwtMTIyLjgxMjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWZlZjcwYzE0NGVkNDdkZmFkZTM0MmFkN2JkZjAwMDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmJiNTY3MWVkMzE5NGMxNTk3NjdkOTQ2NDQ4N2Q2YjQgPSAkKCc8ZGl2IGlkPSJodG1sXzJiYjU2NzFlZDMxOTRjMTU5NzY3ZDk0NjQ0ODdkNmI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdXJyZXk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVmZWY3MGMxNDRlZDQ3ZGZhZGUzNDJhZDdiZGYwMDA2LnNldENvbnRlbnQoaHRtbF8yYmI1NjcxZWQzMTk0YzE1OTc2N2Q5NDY0NDg3ZDZiNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZTdlOGRkNTc0NGU0ZDhmOTE1NzNkNDVmZDllMzk5OS5iaW5kUG9wdXAocG9wdXBfNWZlZjcwYzE0NGVkNDdkZmFkZTM0MmFkN2JkZjAwMDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzdiYWVhOTQ2ZDJlNGEzZDg1M2Y4Y2ZjNWQxMGE3NGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NC41MzEyNSwtMTI4LjYyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMDkxZmJhNDEyYjY0YWRkOGIxYzUyN2U1ZmQ1NGQ2MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lODY5ZGQwOTRkMjM0OTEzYmM2YjhjODYzZTcxYmQ1NyA9ICQoJzxkaXYgaWQ9Imh0bWxfZTg2OWRkMDk0ZDIzNDkxM2JjNmI4Yzg2M2U3MWJkNTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRlcnJhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAwOTFmYmE0MTJiNjRhZGQ4YjFjNTI3ZTVmZDU0ZDYwLnNldENvbnRlbnQoaHRtbF9lODY5ZGQwOTRkMjM0OTEzYmM2YjhjODYzZTcxYmQ1Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jN2JhZWE5NDZkMmU0YTNkODUzZjhjZmM1ZDEwYTc0ZC5iaW5kUG9wdXAocG9wdXBfMDA5MWZiYTQxMmI2NGFkZDhiMWM1MjdlNWZkNTRkNjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzg1OGI0ZTMxMzU2NDc1MzlhMTBmMTdiOTZlOGIyZjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS4wOTM3NSwtMTE3LjY4NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjIwYzc4YTQxNGM1NDMzZjk1MWYyNmI4MzQwM2RjZmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDFiMmY4NTlkNDNlNDk1ZjkzNTFkOGI2OTc0YTYxOGMgPSAkKCc8ZGl2IGlkPSJodG1sXzQxYjJmODU5ZDQzZTQ5NWY5MzUxZDhiNjk3NGE2MThjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UcmFpbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjIwYzc4YTQxNGM1NDMzZjk1MWYyNmI4MzQwM2RjZmMuc2V0Q29udGVudChodG1sXzQxYjJmODU5ZDQzZTQ5NWY5MzUxZDhiNjk3NGE2MThjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M4NThiNGUzMTM1NjQ3NTM5YTEwZjE3Yjk2ZThiMmYxLmJpbmRQb3B1cChwb3B1cF9iMjBjNzhhNDE0YzU0MzNmOTUxZjI2YjgzNDAzZGNmYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZTQ2ZTcxMWYzOGQ0MzQzYjljYTI0ZmUzN2M2OTU2MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjMxMjUsLTExNi45Mzc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRlZWQxMDJlMGIyYzRhMDE4ZDJjMzY5NTQ1NDRiNjk1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IyNWVhZDViYTE1MTRmZGU5OGFiZGVmNzIzZGM0MmRiID0gJCgnPGRpdiBpZD0iaHRtbF9iMjVlYWQ1YmExNTE0ZmRlOThhYmRlZjcyM2RjNDJkYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgQ29sdW1iaWEgUmVnaW9uPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZWVkMTAyZTBiMmM0YTAxOGQyYzM2OTU0NTQ0YjY5NS5zZXRDb250ZW50KGh0bWxfYjI1ZWFkNWJhMTUxNGZkZTk4YWJkZWY3MjNkYzQyZGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmU0NmU3MTFmMzhkNDM0M2I5Y2EyNGZlMzdjNjk1NjAuYmluZFBvcHVwKHBvcHVwXzRlZWQxMDJlMGIyYzRhMDE4ZDJjMzY5NTQ1NDRiNjk1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUzMTE0NDY1ZDMwZDQwMTk5MDRhNGEwNjJlYWY0MjNhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuMjUsLTEyMy4xMjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWU0YjdhMGI1OTc2NGNjOWE5NWI4NTNkOTU2Y2M0OTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTI0MzEzOTFjNzU1NGRmM2I2NDBmZjE2YTM2ZDhmZjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDhlMmJkMjVmNGU5NGMyOGFkNTY2MThiZWViNzYxN2UgPSAkKCc8ZGl2IGlkPSJodG1sX2Q4ZTJiZDI1ZjRlOTRjMjhhZDU2NjE4YmVlYjc2MTdlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WYW5jb3V2ZXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UyNDMxMzkxYzc1NTRkZjNiNjQwZmYxNmEzNmQ4ZmYzLnNldENvbnRlbnQoaHRtbF9kOGUyYmQyNWY0ZTk0YzI4YWQ1NjYxOGJlZWI3NjE3ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MzExNDQ2NWQzMGQ0MDE5OTA0YTRhMDYyZWFmNDIzYS5iaW5kUG9wdXAocG9wdXBfZTI0MzEzOTFjNzU1NGRmM2I2NDBmZjE2YTM2ZDhmZjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTYwYjFiZmM2NDhmNGFmNmIwZWZkNDM4Mjc3OThhYzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4yMTg3NSwtMTE5LjI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MyODA5YzcxYmE0NjRlZTVhMDcyNDhmMjY2MjZmNjc4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc0ZWI2NTc2ZTkwYjQzZGFiNWM0ZjdlYWEyMzZmZWFlID0gJCgnPGRpdiBpZD0iaHRtbF83NGViNjU3NmU5MGI0M2RhYjVjNGY3ZWFhMjM2ZmVhZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VmVybm9uIENlbnRyYWw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MyODA5YzcxYmE0NjRlZTVhMDcyNDhmMjY2MjZmNjc4LnNldENvbnRlbnQoaHRtbF83NGViNjU3NmU5MGI0M2RhYjVjNGY3ZWFhMjM2ZmVhZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NjBiMWJmYzY0OGY0YWY2YjBlZmQ0MzgyNzc5OGFjOS5iaW5kUG9wdXAocG9wdXBfYzI4MDljNzFiYTQ2NGVlNWEwNzI0OGYyNjYyNmY2NzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmY4YWM5Mjk2MThmNDc0MjhkMWVmMWNhZTBjODlmN2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OC40Mzc1LC0xMjMuMzc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZhNjU5NTI1MzFiMDQ5YTU5YWI1ZDU4ODFhZGFlMWM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY4ODRjOGNkMDYxMTRkZjJiNmQxM2Q0NjYwZjY3YjlmID0gJCgnPGRpdiBpZD0iaHRtbF82ODg0YzhjZDA2MTE0ZGYyYjZkMTNkNDY2MGY2N2I5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VmljdG9yaWEgQ2VudHJhbCBCcml0aXNoIENvbHVtYmlhIFByb3ZpbmNpYWwgR292ZXJubWVudDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmE2NTk1MjUzMWIwNDlhNTlhYjVkNTg4MWFkYWUxYzkuc2V0Q29udGVudChodG1sXzY4ODRjOGNkMDYxMTRkZjJiNmQxM2Q0NjYwZjY3YjlmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZmOGFjOTI5NjE4ZjQ3NDI4ZDFlZjFjYWUwYzg5ZjdhLmJpbmRQb3B1cChwb3B1cF82YTY1OTUyNTMxYjA0OWE1OWFiNWQ1ODgxYWRhZTFjOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYzFmZWJhNDUzNWI0M2U3OGU3YzZkYmY0NzlkY2I3MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjUsLTEyMi4wNjI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM4OTk5N2NlZmZhNDQ3ZmY4N2UyYjM4ZDg2YWRkNGQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZkYzgyNjRmMGViYTRhOWNhZjU2MTI4YTM1MWM0MDQ5ID0gJCgnPGRpdiBpZD0iaHRtbF9mZGM4MjY0ZjBlYmE0YTljYWY1NjEyOGEzNTFjNDA0OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBLb290ZW5heXM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM4OTk5N2NlZmZhNDQ3ZmY4N2UyYjM4ZDg2YWRkNGQ3LnNldENvbnRlbnQoaHRtbF9mZGM4MjY0ZjBlYmE0YTljYWY1NjEyOGEzNTFjNDA0OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYzFmZWJhNDUzNWI0M2U3OGU3YzZkYmY0NzlkY2I3MC5iaW5kUG9wdXAocG9wdXBfMzg5OTk3Y2VmZmE0NDdmZjg3ZTJiMzhkODZhZGQ0ZDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODgzMjgzMzQzMjdkNDg1OThlZWQ2YTZiY2Q3MjA1OWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44NzUsLTExOS43NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kM2MwNzJmMjQxYmQ0M2I3YWEwMjAxMWEwNDRiODc2ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YzhjODkwM2M3MDc0OTA3ODFjMWU1ZDc5MWFkNTQ1ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNWM4Yzg5MDNjNzA3NDkwNzgxYzFlNWQ3OTFhZDU0NWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldlc3RiYW5rPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kM2MwNzJmMjQxYmQ0M2I3YWEwMjAxMWEwNDRiODc2ZS5zZXRDb250ZW50KGh0bWxfNWM4Yzg5MDNjNzA3NDkwNzgxYzFlNWQ3OTFhZDU0NWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODgzMjgzMzQzMjdkNDg1OThlZWQ2YTZiY2Q3MjA1OWMuYmluZFBvcHVwKHBvcHVwX2QzYzA3MmYyNDFiZDQzYjdhYTAyMDExYTA0NGI4NzZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFjMzk3NzQwYzQzYjRmN2M5ZjA4MDJhZTczMzM0NjRiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMTI1LC0xMjIuOTM3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZTRiN2EwYjU5NzY0Y2M5YTk1Yjg1M2Q5NTZjYzQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xOTc0NDE5ZDZhYTc0Mzk4ODg5MWU4NzIwMmVkNWQwMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YWRlMWFiNmE2ZTA0ZTRiODM4OTMxNzAyMjhlNjFkYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGFkZTFhYjZhNmUwNGU0YjgzODkzMTcwMjI4ZTYxZGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldoaXN0bGVyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xOTc0NDE5ZDZhYTc0Mzk4ODg5MWU4NzIwMmVkNWQwMy5zZXRDb250ZW50KGh0bWxfNGFkZTFhYjZhNmUwNGU0YjgzODkzMTcwMjI4ZTYxZGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWMzOTc3NDBjNDNiNGY3YzlmMDgwMmFlNzMzMzQ2NGIuYmluZFBvcHVwKHBvcHVwXzE5NzQ0MTlkNmFhNzQzOTg4ODkxZTg3MjAyZWQ1ZDAzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE2ZTk0MGI5YjViODQ3YzRhMDMzN2RjMzdhYTY0ZmUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuMDMxMjUsLTEyMi44MTI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZlNTA5MDVjZjUzNjQyZWY5OGQwNTc4MGE4YThlYmI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E5MTQzZDVjY2U4ODRjOTBiYWEzOGNmZjk4NmQxZDY2ID0gJCgnPGRpdiBpZD0iaHRtbF9hOTE0M2Q1Y2NlODg0YzkwYmFhMzhjZmY5ODZkMWQ2NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2hpdGUgUm9jazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmU1MDkwNWNmNTM2NDJlZjk4ZDA1NzgwYThhOGViYjQuc2V0Q29udGVudChodG1sX2E5MTQzZDVjY2U4ODRjOTBiYWEzOGNmZjk4NmQxZDY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE2ZTk0MGI5YjViODQ3YzRhMDMzN2RjMzdhYTY0ZmUxLmJpbmRQb3B1cChwb3B1cF82ZTUwOTA1Y2Y1MzY0MmVmOThkMDU3ODBhOGE4ZWJiNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNThlNDc4MjY3OTc0OTI4OGE2OTk0NzBkNjk0NTkzZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjE1NjI1LC0xMjIuMTI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUwNjViNmJkYWM5ODRiODhhZmI1MDgzYzFkOWFjZjZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA0NzhkNTA5YmIxMDQwNzU4YzYwZjk0ODkwYmYxNjRjID0gJCgnPGRpdiBpZD0iaHRtbF8wNDc4ZDUwOWJiMTA0MDc1OGM2MGY5NDg5MGJmMTY0YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2lsbGlhbXMgTGFrZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTA2NWI2YmRhYzk4NGI4OGFmYjUwODNjMWQ5YWNmNmMuc2V0Q29udGVudChodG1sXzA0NzhkNTA5YmIxMDQwNzU4YzYwZjk0ODkwYmYxNjRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM1OGU0NzgyNjc5NzQ5Mjg4YTY5OTQ3MGQ2OTQ1OTNkLmJpbmRQb3B1cChwb3B1cF81MDY1YjZiZGFjOTg0Yjg4YWZiNTA4M2MxZDlhY2Y2Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MmJiM2I3NWYxMDI0ZDVjYjk2NmEwMzYyOWQ4ODI5OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjAzMTI1LC0xMTkuMzc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVlNGI3YTBiNTk3NjRjYzlhOTViODUzZDk1NmNjNDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZiZGIyOWQxMWRhMTQ2ZWZhYjQ1ZGY0MTdhNzJjZjgyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M5YTVhODU5YjAzNDQwM2NhODY3MjY0OGUyYzUxZmYwID0gJCgnPGRpdiBpZD0iaHRtbF9jOWE1YTg1OWIwMzQ0MDNjYTg2NzI2NDhlMmM1MWZmMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2luZmllbGQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZiZGIyOWQxMWRhMTQ2ZWZhYjQ1ZGY0MTdhNzJjZjgyLnNldENvbnRlbnQoaHRtbF9jOWE1YTg1OWIwMzQ0MDNjYTg2NzI2NDhlMmM1MWZmMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MmJiM2I3NWYxMDI0ZDVjYjk2NmEwMzYyOWQ4ODI5OC5iaW5kUG9wdXAocG9wdXBfZmJkYjI5ZDExZGExNDZlZmFiNDVkZjQxN2E3MmNmODIpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg== onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7fef7f14d550>"
]
},
"execution_count": 95,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"map_bc = folium.Map(location=[lat, long], zoom_start=5)\n",
"print(\"{} , {}\".format(lat,long))\n",
"for lati, lng, label in zip(df_new['Latitude'], df_new['Longitude'], df_new['Place']):\n",
" label = folium.Popup(label, parse_html=True)\n",
" folium.CircleMarker(\n",
" [lati, lng],\n",
" radius=5,\n",
" popup=label,\n",
" color='blue',\n",
" fill=True,\n",
" fill_color='#3186cc',\n",
" fill_opacity=0.7,\n",
" parse_html=False).add_to(map_bc)\n",
" \n",
"map_bc"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### We leverage the Foursquare API to explore the nearby locations of each neighborhood. To do so, we first define our Foursqaure credentials and version.\n"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Your credentails:\n",
"CLIENT_ID: QIQC42VYJTUBVEV1B0DBVBEFM4TR2YKVTUJOI21ELHIIIFLP\n",
"CLIENT_SECRET:ZXKAIHJSAPDYD1X5YUOJE0GIMO3C3O5DVG41FXGPT2JEUQCI\n"
]
}
],
"source": [
"CLIENT_ID = 'QIQC42VYJTUBVEV1B0DBVBEFM4TR2YKVTUJOI21ELHIIIFLP' # your Foursquare ID\n",
"CLIENT_SECRET = 'ZXKAIHJSAPDYD1X5YUOJE0GIMO3C3O5DVG41FXGPT2JEUQCI' # your Foursquare Secret\n",
"VERSION = '20180605' # Foursquare API version\n",
"\n",
"print('Your credentails:')\n",
"print('CLIENT_ID: ' + CLIENT_ID)\n",
"print('CLIENT_SECRET:' + CLIENT_SECRET)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### We also combine the entire process of creating the url request for each location, extracting the locations from the response file and storing them into a data frame, into a function named as 'getNearbyVenues'. \n"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [],
"source": [
"def getNearbyVenues(names, latitudes, longitudes, radius=500, limit=150):\n",
" \n",
" venues_list=[]\n",
" for name, lat, lng in zip(names, latitudes, longitudes):\n",
" print(name)\n",
" \n",
" # create the API request URL\n",
" url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" lat, \n",
" lng, \n",
" radius, \n",
" limit)\n",
" \n",
" # make the GET request\n",
" results = requests.get(url).json()[\"response\"]['groups'][0]['items']\n",
" \n",
" # return only relevant information for each nearby venue\n",
" venues_list.append([(\n",
" name, \n",
" lat, \n",
" lng, \n",
" v['venue']['name'], \n",
" v['venue']['location']['lat'], \n",
" v['venue']['location']['lng'], \n",
" v['venue']['categories'][0]['name']) for v in results])\n",
"\n",
" #print(venues_list)\n",
" nearby_venues = pd.DataFrame([item for var in venues_list for item in var])\n",
" nearby_venues.columns = ['Neighborhood', \n",
" 'Neighborhood Latitude', \n",
" 'Neighborhood Longitude', \n",
" 'Venue', \n",
" 'Venue Latitude',\n",
" 'Venue Longitude', \n",
" 'Venue Category']\n",
" \n",
" return(nearby_venues)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Call the function using values from our data frame.\n"
]
},
{
"cell_type": "code",
"execution_count": 96,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Abbotsford\n",
"Atlin Region\n",
"Burnaby\n",
"Campbell River Central\n",
"Cariboo and West Okanagan\n",
"Castlegar\n",
"Cedar\n",
"Central Island\n",
"Chilcotin\n",
"Chilliwack Central\n",
"Comox\n",
"Coquitlam\n",
"Courtenay Central\n",
"Cranbrook\n",
"Dawson Creek\n",
"Delta Central\n",
"Duncan\n",
"East Kootenays\n",
"Esquimalt\n",
"Fort St. John\n",
"Harrison Lake Region\n",
"Highlands\n",
"Inside Passage and the Queen Charlottes\n",
"Juan de Fuca Shore\n",
"Kamloops Central and\n",
"Kelowna Central\n",
"Kimberley\n",
"Kitimat\n",
"Ladysmith\n",
"Langley City\n",
"Lower Skeena\n",
"Maple Ridge\n",
"Merritt\n",
"Metchosin\n",
"Mission\n",
"Nanaimo Central\n",
"Nelson\n",
"New Westminster Northeast\n",
"North Central Island and Bute Inlet Region\n",
"Northern British Columbia\n",
"Oak Bay\n",
"Omineca and Yellowhead\n",
"Parksville\n",
"Penticton\n",
"Pitt Meadows\n",
"Port Alberni\n",
"Powell River\n",
"Prince George Central\n",
"Qualicum Beach\n",
"Quesnel\n",
"Richmond\n",
"Saanich Central\n",
"Salmon Arm\n",
"Saltspring Island\n",
"Sidney\n",
"Similkameen\n",
"Sooke\n",
"South Okanagan\n",
"Squamish\n",
"Surrey\n",
"Terrace\n",
"Trail\n",
"Upper Columbia Region\n",
"Vancouver\n",
"Vernon Central\n",
"Victoria Central British Columbia Provincial Government\n",
"West Kootenays\n",
"Westbank\n",
"Whistler\n",
"White Rock\n",
"Williams Lake\n",
"Winfield\n"
]
}
],
"source": [
"neighborhood_venues = getNearbyVenues(names=df_new['Place'],\n",
" latitudes=df_new['Latitude'],\n",
" longitudes=df_new['Longitude']\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Checking the size of the resulting data frame.\n"
]
},
{
"cell_type": "code",
"execution_count": 97,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(145, 7)\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>Neighborhood</th>\n",
" <th>Neighborhood Latitude</th>\n",
" <th>Neighborhood Longitude</th>\n",
" <th>Venue</th>\n",
" <th>Venue Latitude</th>\n",
" <th>Venue Longitude</th>\n",
" <th>Venue Category</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Abbotsford</td>\n",
" <td>49.0625</td>\n",
" <td>-122.3125</td>\n",
" <td>Discovery Trail</td>\n",
" <td>49.060245</td>\n",
" <td>-122.315565</td>\n",
" <td>Trail</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Abbotsford</td>\n",
" <td>49.0625</td>\n",
" <td>-122.3125</td>\n",
" <td>Grandmas Market Gladwin Rd</td>\n",
" <td>49.066149</td>\n",
" <td>-122.313659</td>\n",
" <td>Grocery Store</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Burnaby</td>\n",
" <td>49.2500</td>\n",
" <td>-123.0000</td>\n",
" <td>BCITSA's Stand Central SE2</td>\n",
" <td>49.251424</td>\n",
" <td>-123.001384</td>\n",
" <td>Snack Place</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Burnaby</td>\n",
" <td>49.2500</td>\n",
" <td>-123.0000</td>\n",
" <td>BCIT Bookstore</td>\n",
" <td>49.251548</td>\n",
" <td>-123.001364</td>\n",
" <td>Bookstore</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Burnaby</td>\n",
" <td>49.2500</td>\n",
" <td>-123.0000</td>\n",
" <td>The Rix @ BCIT</td>\n",
" <td>49.251153</td>\n",
" <td>-123.000636</td>\n",
" <td>Coffee Shop</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Neighborhood Latitude Neighborhood Longitude \\\n",
"0 Abbotsford 49.0625 -122.3125 \n",
"1 Abbotsford 49.0625 -122.3125 \n",
"2 Burnaby 49.2500 -123.0000 \n",
"3 Burnaby 49.2500 -123.0000 \n",
"4 Burnaby 49.2500 -123.0000 \n",
"\n",
" Venue Venue Latitude Venue Longitude Venue Category \n",
"0 Discovery Trail 49.060245 -122.315565 Trail \n",
"1 Grandmas Market Gladwin Rd 49.066149 -122.313659 Grocery Store \n",
"2 BCITSA's Stand Central SE2 49.251424 -123.001384 Snack Place \n",
"3 BCIT Bookstore 49.251548 -123.001364 Bookstore \n",
"4 The Rix @ BCIT 49.251153 -123.000636 Coffee Shop "
]
},
"execution_count": 97,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(neighborhood_venues.shape)\n",
"neighborhood_venues.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Checking how many venues were returned for each neighborhood.\n"
]
},
{
"cell_type": "code",
"execution_count": 98,
"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>Neighborhood Latitude</th>\n",
" <th>Neighborhood Longitude</th>\n",
" <th>Venue</th>\n",
" <th>Venue Latitude</th>\n",
" <th>Venue Longitude</th>\n",
" <th>Venue Category</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Neighborhood</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>Abbotsford</th>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Burnaby</th>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Comox</th>\n",
" <td>6</td>\n",
" <td>6</td>\n",
" <td>6</td>\n",
" <td>6</td>\n",
" <td>6</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Coquitlam</th>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Cranbrook</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Duncan</th>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Esquimalt</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Fort St. John</th>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Highlands</th>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Kelowna Central</th>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Kimberley</th>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Kitimat</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Langley City</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Nanaimo Central</th>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Nelson</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>New Westminster Northeast</th>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Oak Bay</th>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Parksville</th>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Pitt Meadows</th>\n",
" <td>6</td>\n",
" <td>6</td>\n",
" <td>6</td>\n",
" <td>6</td>\n",
" <td>6</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Qualicum Beach</th>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Richmond</th>\n",
" <td>27</td>\n",
" <td>27</td>\n",
" <td>27</td>\n",
" <td>27</td>\n",
" <td>27</td>\n",
" <td>27</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Saanich Central</th>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Salmon Arm</th>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Sooke</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>South Okanagan</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Surrey</th>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Terrace</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Trail</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Vancouver</th>\n",
" <td>20</td>\n",
" <td>20</td>\n",
" <td>20</td>\n",
" <td>20</td>\n",
" <td>20</td>\n",
" <td>20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Victoria Central British Columbia Provincial Government</th>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Whistler</th>\n",
" <td>7</td>\n",
" <td>7</td>\n",
" <td>7</td>\n",
" <td>7</td>\n",
" <td>7</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>White Rock</th>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Latitude \\\n",
"Neighborhood \n",
"Abbotsford 2 \n",
"Burnaby 9 \n",
"Comox 6 \n",
"Coquitlam 5 \n",
"Cranbrook 1 \n",
"Duncan 3 \n",
"Esquimalt 1 \n",
"Fort St. John 2 \n",
"Highlands 4 \n",
"Kelowna Central 2 \n",
"Kimberley 4 \n",
"Kitimat 1 \n",
"Langley City 1 \n",
"Nanaimo Central 2 \n",
"Nelson 1 \n",
"New Westminster Northeast 3 \n",
"Oak Bay 9 \n",
"Parksville 2 \n",
"Pitt Meadows 6 \n",
"Qualicum Beach 4 \n",
"Richmond 27 \n",
"Saanich Central 2 \n",
"Salmon Arm 2 \n",
"Sooke 1 \n",
"South Okanagan 1 \n",
"Surrey 2 \n",
"Terrace 1 \n",
"Trail 1 \n",
"Vancouver 20 \n",
"Victoria Central British Columbia Provincial Go... 9 \n",
"Whistler 7 \n",
"White Rock 4 \n",
"\n",
" Neighborhood Longitude \\\n",
"Neighborhood \n",
"Abbotsford 2 \n",
"Burnaby 9 \n",
"Comox 6 \n",
"Coquitlam 5 \n",
"Cranbrook 1 \n",
"Duncan 3 \n",
"Esquimalt 1 \n",
"Fort St. John 2 \n",
"Highlands 4 \n",
"Kelowna Central 2 \n",
"Kimberley 4 \n",
"Kitimat 1 \n",
"Langley City 1 \n",
"Nanaimo Central 2 \n",
"Nelson 1 \n",
"New Westminster Northeast 3 \n",
"Oak Bay 9 \n",
"Parksville 2 \n",
"Pitt Meadows 6 \n",
"Qualicum Beach 4 \n",
"Richmond 27 \n",
"Saanich Central 2 \n",
"Salmon Arm 2 \n",
"Sooke 1 \n",
"South Okanagan 1 \n",
"Surrey 2 \n",
"Terrace 1 \n",
"Trail 1 \n",
"Vancouver 20 \n",
"Victoria Central British Columbia Provincial Go... 9 \n",
"Whistler 7 \n",
"White Rock 4 \n",
"\n",
" Venue Venue Latitude \\\n",
"Neighborhood \n",
"Abbotsford 2 2 \n",
"Burnaby 9 9 \n",
"Comox 6 6 \n",
"Coquitlam 5 5 \n",
"Cranbrook 1 1 \n",
"Duncan 3 3 \n",
"Esquimalt 1 1 \n",
"Fort St. John 2 2 \n",
"Highlands 4 4 \n",
"Kelowna Central 2 2 \n",
"Kimberley 4 4 \n",
"Kitimat 1 1 \n",
"Langley City 1 1 \n",
"Nanaimo Central 2 2 \n",
"Nelson 1 1 \n",
"New Westminster Northeast 3 3 \n",
"Oak Bay 9 9 \n",
"Parksville 2 2 \n",
"Pitt Meadows 6 6 \n",
"Qualicum Beach 4 4 \n",
"Richmond 27 27 \n",
"Saanich Central 2 2 \n",
"Salmon Arm 2 2 \n",
"Sooke 1 1 \n",
"South Okanagan 1 1 \n",
"Surrey 2 2 \n",
"Terrace 1 1 \n",
"Trail 1 1 \n",
"Vancouver 20 20 \n",
"Victoria Central British Columbia Provincial Go... 9 9 \n",
"Whistler 7 7 \n",
"White Rock 4 4 \n",
"\n",
" Venue Longitude \\\n",
"Neighborhood \n",
"Abbotsford 2 \n",
"Burnaby 9 \n",
"Comox 6 \n",
"Coquitlam 5 \n",
"Cranbrook 1 \n",
"Duncan 3 \n",
"Esquimalt 1 \n",
"Fort St. John 2 \n",
"Highlands 4 \n",
"Kelowna Central 2 \n",
"Kimberley 4 \n",
"Kitimat 1 \n",
"Langley City 1 \n",
"Nanaimo Central 2 \n",
"Nelson 1 \n",
"New Westminster Northeast 3 \n",
"Oak Bay 9 \n",
"Parksville 2 \n",
"Pitt Meadows 6 \n",
"Qualicum Beach 4 \n",
"Richmond 27 \n",
"Saanich Central 2 \n",
"Salmon Arm 2 \n",
"Sooke 1 \n",
"South Okanagan 1 \n",
"Surrey 2 \n",
"Terrace 1 \n",
"Trail 1 \n",
"Vancouver 20 \n",
"Victoria Central British Columbia Provincial Go... 9 \n",
"Whistler 7 \n",
"White Rock 4 \n",
"\n",
" Venue Category \n",
"Neighborhood \n",
"Abbotsford 2 \n",
"Burnaby 9 \n",
"Comox 6 \n",
"Coquitlam 5 \n",
"Cranbrook 1 \n",
"Duncan 3 \n",
"Esquimalt 1 \n",
"Fort St. John 2 \n",
"Highlands 4 \n",
"Kelowna Central 2 \n",
"Kimberley 4 \n",
"Kitimat 1 \n",
"Langley City 1 \n",
"Nanaimo Central 2 \n",
"Nelson 1 \n",
"New Westminster Northeast 3 \n",
"Oak Bay 9 \n",
"Parksville 2 \n",
"Pitt Meadows 6 \n",
"Qualicum Beach 4 \n",
"Richmond 27 \n",
"Saanich Central 2 \n",
"Salmon Arm 2 \n",
"Sooke 1 \n",
"South Okanagan 1 \n",
"Surrey 2 \n",
"Terrace 1 \n",
"Trail 1 \n",
"Vancouver 20 \n",
"Victoria Central British Columbia Provincial Go... 9 \n",
"Whistler 7 \n",
"White Rock 4 "
]
},
"execution_count": 98,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"neighborhood_venues.groupby('Neighborhood').count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Unique categories all over British Columbia.\n"
]
},
{
"cell_type": "code",
"execution_count": 99,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"There are 76 uniques categories.\n"
]
}
],
"source": [
"print('There are {} uniques categories.'.format(len(neighborhood_venues['Venue Category'].unique())))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"## Analyze each neighborhood <a name=\"analysis\"></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### We analyze the nearby locations of each neighborhood using the one hot encoding technique.\n"
]
},
{
"cell_type": "code",
"execution_count": 134,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(145, 76)\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>American Restaurant</th>\n",
" <th>Asian Restaurant</th>\n",
" <th>Athletics &amp; Sports</th>\n",
" <th>Auto Workshop</th>\n",
" <th>Bakery</th>\n",
" <th>Bank</th>\n",
" <th>Baseball Field</th>\n",
" <th>Beach</th>\n",
" <th>Boat or Ferry</th>\n",
" <th>Bookstore</th>\n",
" <th>Breakfast Spot</th>\n",
" <th>Brewery</th>\n",
" <th>Bubble Tea Shop</th>\n",
" <th>Burger Joint</th>\n",
" <th>Bus Station</th>\n",
" <th>Bus Stop</th>\n",
" <th>Business Service</th>\n",
" <th>Café</th>\n",
" <th>Chinese Restaurant</th>\n",
" <th>Coffee Shop</th>\n",
" <th>Construction &amp; Landscaping</th>\n",
" <th>Convenience Store</th>\n",
" <th>Dessert Shop</th>\n",
" <th>Dim Sum Restaurant</th>\n",
" <th>Dog Run</th>\n",
" <th>Elementary School</th>\n",
" <th>Falafel Restaurant</th>\n",
" <th>Fast Food Restaurant</th>\n",
" <th>Fish &amp; Chips Shop</th>\n",
" <th>Fried Chicken Joint</th>\n",
" <th>Garden</th>\n",
" <th>Gas Station</th>\n",
" <th>Gastropub</th>\n",
" <th>Gift Shop</th>\n",
" <th>Golf Course</th>\n",
" <th>Greek Restaurant</th>\n",
" <th>Grocery Store</th>\n",
" <th>Gym</th>\n",
" <th>Gym / Fitness Center</th>\n",
" <th>Home Service</th>\n",
" <th>Hot Dog Joint</th>\n",
" <th>Hotel</th>\n",
" <th>Indian Restaurant</th>\n",
" <th>Juice Bar</th>\n",
" <th>Korean Restaurant</th>\n",
" <th>Lake</th>\n",
" <th>Liquor Store</th>\n",
" <th>Malay Restaurant</th>\n",
" <th>Men's Store</th>\n",
" <th>Motorcycle Shop</th>\n",
" <th>Mountain</th>\n",
" <th>Park</th>\n",
" <th>Pet Store</th>\n",
" <th>Pharmacy</th>\n",
" <th>Pizza Place</th>\n",
" <th>Playground</th>\n",
" <th>Plaza</th>\n",
" <th>Pub</th>\n",
" <th>Recreation Center</th>\n",
" <th>Restaurant</th>\n",
" <th>Salon / Barbershop</th>\n",
" <th>Sandwich Place</th>\n",
" <th>Shipping Store</th>\n",
" <th>Ski Area</th>\n",
" <th>Ski Lodge</th>\n",
" <th>Snack Place</th>\n",
" <th>Sporting Goods Shop</th>\n",
" <th>Sushi Restaurant</th>\n",
" <th>Theme Park</th>\n",
" <th>Tourist Information Center</th>\n",
" <th>Toy / Game Store</th>\n",
" <th>Trail</th>\n",
" <th>Vacation Rental</th>\n",
" <th>Vietnamese Restaurant</th>\n",
" <th>Wine Shop</th>\n",
" <th>Zoo</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" American Restaurant Asian Restaurant Athletics & Sports Auto Workshop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Bakery Bank Baseball Field Beach Boat or Ferry Bookstore \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 1 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Breakfast Spot Brewery Bubble Tea Shop Burger Joint Bus Station \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Bus Stop Business Service Café Chinese Restaurant Coffee Shop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 1 \n",
"\n",
" Construction & Landscaping Convenience Store Dessert Shop \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Dim Sum Restaurant Dog Run Elementary School Falafel Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Fast Food Restaurant Fish & Chips Shop Fried Chicken Joint Garden \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Gas Station Gastropub Gift Shop Golf Course Greek Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Grocery Store Gym Gym / Fitness Center Home Service Hot Dog Joint \\\n",
"0 0 0 0 0 0 \n",
"1 1 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Hotel Indian Restaurant Juice Bar Korean Restaurant Lake Liquor Store \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Malay Restaurant Men's Store Motorcycle Shop Mountain Park Pet Store \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Pharmacy Pizza Place Playground Plaza Pub Recreation Center \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Restaurant Salon / Barbershop Sandwich Place Shipping Store Ski Area \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Ski Lodge Snack Place Sporting Goods Shop Sushi Restaurant Theme Park \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 1 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Tourist Information Center Toy / Game Store Trail Vacation Rental \\\n",
"0 0 0 1 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Vietnamese Restaurant Wine Shop Zoo \n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 "
]
},
"execution_count": 134,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"one_hot = pd.get_dummies(neighborhood_venues[['Venue Category']], prefix=\"\", prefix_sep=\"\")\n",
"print(one_hot.shape)\n",
"one_hot.head()"
]
},
{
"cell_type": "code",
"execution_count": 135,
"metadata": {},
"outputs": [],
"source": [
"pd.set_option('display.max_columns', one_hot.shape[1]+1)"
]
},
{
"cell_type": "code",
"execution_count": 136,
"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>American Restaurant</th>\n",
" <th>Asian Restaurant</th>\n",
" <th>Athletics &amp; Sports</th>\n",
" <th>Auto Workshop</th>\n",
" <th>Bakery</th>\n",
" <th>Bank</th>\n",
" <th>Baseball Field</th>\n",
" <th>Beach</th>\n",
" <th>Boat or Ferry</th>\n",
" <th>Bookstore</th>\n",
" <th>Breakfast Spot</th>\n",
" <th>Brewery</th>\n",
" <th>Bubble Tea Shop</th>\n",
" <th>Burger Joint</th>\n",
" <th>Bus Station</th>\n",
" <th>Bus Stop</th>\n",
" <th>Business Service</th>\n",
" <th>Café</th>\n",
" <th>Chinese Restaurant</th>\n",
" <th>Coffee Shop</th>\n",
" <th>Construction &amp; Landscaping</th>\n",
" <th>Convenience Store</th>\n",
" <th>Dessert Shop</th>\n",
" <th>Dim Sum Restaurant</th>\n",
" <th>Dog Run</th>\n",
" <th>Elementary School</th>\n",
" <th>Falafel Restaurant</th>\n",
" <th>Fast Food Restaurant</th>\n",
" <th>Fish &amp; Chips Shop</th>\n",
" <th>Fried Chicken Joint</th>\n",
" <th>Garden</th>\n",
" <th>Gas Station</th>\n",
" <th>Gastropub</th>\n",
" <th>Gift Shop</th>\n",
" <th>Golf Course</th>\n",
" <th>Greek Restaurant</th>\n",
" <th>Grocery Store</th>\n",
" <th>Gym</th>\n",
" <th>Gym / Fitness Center</th>\n",
" <th>Home Service</th>\n",
" <th>Hot Dog Joint</th>\n",
" <th>Hotel</th>\n",
" <th>Indian Restaurant</th>\n",
" <th>Juice Bar</th>\n",
" <th>Korean Restaurant</th>\n",
" <th>Lake</th>\n",
" <th>Liquor Store</th>\n",
" <th>Malay Restaurant</th>\n",
" <th>Men's Store</th>\n",
" <th>Motorcycle Shop</th>\n",
" <th>Mountain</th>\n",
" <th>Park</th>\n",
" <th>Pet Store</th>\n",
" <th>Pharmacy</th>\n",
" <th>Pizza Place</th>\n",
" <th>Playground</th>\n",
" <th>Plaza</th>\n",
" <th>Pub</th>\n",
" <th>Recreation Center</th>\n",
" <th>Restaurant</th>\n",
" <th>Salon / Barbershop</th>\n",
" <th>Sandwich Place</th>\n",
" <th>Shipping Store</th>\n",
" <th>Ski Area</th>\n",
" <th>Ski Lodge</th>\n",
" <th>Snack Place</th>\n",
" <th>Sporting Goods Shop</th>\n",
" <th>Sushi Restaurant</th>\n",
" <th>Theme Park</th>\n",
" <th>Tourist Information Center</th>\n",
" <th>Toy / Game Store</th>\n",
" <th>Trail</th>\n",
" <th>Vacation Rental</th>\n",
" <th>Vietnamese Restaurant</th>\n",
" <th>Wine Shop</th>\n",
" <th>Zoo</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>140</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>141</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>142</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>143</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>144</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>145 rows × 76 columns</p>\n",
"</div>"
],
"text/plain": [
" American Restaurant Asian Restaurant Athletics & Sports Auto Workshop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
".. ... ... ... ... \n",
"140 0 0 0 0 \n",
"141 0 0 0 0 \n",
"142 0 0 0 0 \n",
"143 0 0 0 0 \n",
"144 0 0 1 0 \n",
"\n",
" Bakery Bank Baseball Field Beach Boat or Ferry Bookstore \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 1 \n",
"4 0 0 0 0 0 0 \n",
".. ... ... ... ... ... ... \n",
"140 0 0 0 0 0 0 \n",
"141 0 0 0 0 0 0 \n",
"142 0 0 0 0 0 0 \n",
"143 0 0 0 0 0 0 \n",
"144 0 0 0 0 0 0 \n",
"\n",
" Breakfast Spot Brewery Bubble Tea Shop Burger Joint Bus Station \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
".. ... ... ... ... ... \n",
"140 0 0 0 0 0 \n",
"141 0 0 0 0 0 \n",
"142 0 0 0 0 0 \n",
"143 0 0 0 0 0 \n",
"144 0 0 0 0 0 \n",
"\n",
" Bus Stop Business Service Café Chinese Restaurant Coffee Shop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 1 \n",
".. ... ... ... ... ... \n",
"140 0 0 0 0 0 \n",
"141 0 0 0 0 0 \n",
"142 0 0 0 0 0 \n",
"143 0 0 0 0 0 \n",
"144 0 0 0 0 0 \n",
"\n",
" Construction & Landscaping Convenience Store Dessert Shop \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
".. ... ... ... \n",
"140 0 0 0 \n",
"141 0 0 0 \n",
"142 0 0 0 \n",
"143 0 0 0 \n",
"144 0 0 0 \n",
"\n",
" Dim Sum Restaurant Dog Run Elementary School Falafel Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
".. ... ... ... ... \n",
"140 0 0 0 0 \n",
"141 0 0 0 0 \n",
"142 0 0 0 0 \n",
"143 0 0 0 0 \n",
"144 0 0 0 0 \n",
"\n",
" Fast Food Restaurant Fish & Chips Shop Fried Chicken Joint Garden \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
".. ... ... ... ... \n",
"140 0 0 0 0 \n",
"141 0 0 0 0 \n",
"142 0 0 0 0 \n",
"143 0 0 0 0 \n",
"144 0 0 0 0 \n",
"\n",
" Gas Station Gastropub Gift Shop Golf Course Greek Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
".. ... ... ... ... ... \n",
"140 0 0 0 0 0 \n",
"141 0 0 0 0 0 \n",
"142 0 0 0 0 0 \n",
"143 0 0 0 0 0 \n",
"144 0 0 0 0 0 \n",
"\n",
" Grocery Store Gym Gym / Fitness Center Home Service Hot Dog Joint \\\n",
"0 0 0 0 0 0 \n",
"1 1 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
".. ... ... ... ... ... \n",
"140 0 0 0 0 0 \n",
"141 0 0 0 0 0 \n",
"142 0 0 0 0 0 \n",
"143 0 0 1 0 0 \n",
"144 0 0 0 0 0 \n",
"\n",
" Hotel Indian Restaurant Juice Bar Korean Restaurant Lake \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
".. ... ... ... ... ... \n",
"140 1 0 0 0 0 \n",
"141 0 0 0 0 0 \n",
"142 0 0 0 0 0 \n",
"143 0 0 0 0 0 \n",
"144 0 0 0 0 0 \n",
"\n",
" Liquor Store Malay Restaurant Men's Store Motorcycle Shop Mountain \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
".. ... ... ... ... ... \n",
"140 0 0 0 0 0 \n",
"141 0 0 0 0 0 \n",
"142 0 0 0 0 0 \n",
"143 0 0 0 0 0 \n",
"144 0 0 0 0 0 \n",
"\n",
" Park Pet Store Pharmacy Pizza Place Playground Plaza Pub \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
".. ... ... ... ... ... ... ... \n",
"140 0 0 0 0 0 0 0 \n",
"141 1 0 0 0 0 0 0 \n",
"142 1 0 0 0 0 0 0 \n",
"143 0 0 0 0 0 0 0 \n",
"144 0 0 0 0 0 0 0 \n",
"\n",
" Recreation Center Restaurant Salon / Barbershop Sandwich Place \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
".. ... ... ... ... \n",
"140 0 0 0 0 \n",
"141 0 0 0 0 \n",
"142 0 0 0 0 \n",
"143 0 0 0 0 \n",
"144 0 0 0 0 \n",
"\n",
" Shipping Store Ski Area Ski Lodge Snack Place Sporting Goods Shop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 1 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
".. ... ... ... ... ... \n",
"140 0 0 0 0 0 \n",
"141 0 0 0 0 0 \n",
"142 0 0 0 0 0 \n",
"143 0 0 0 0 0 \n",
"144 0 0 0 0 0 \n",
"\n",
" Sushi Restaurant Theme Park Tourist Information Center \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
".. ... ... ... \n",
"140 0 0 0 \n",
"141 0 0 0 \n",
"142 0 0 0 \n",
"143 0 0 0 \n",
"144 0 0 0 \n",
"\n",
" Toy / Game Store Trail Vacation Rental Vietnamese Restaurant \\\n",
"0 0 1 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
".. ... ... ... ... \n",
"140 0 0 0 0 \n",
"141 0 0 0 0 \n",
"142 0 0 0 0 \n",
"143 0 0 0 0 \n",
"144 0 0 0 0 \n",
"\n",
" Wine Shop Zoo \n",
"0 0 0 \n",
"1 0 0 \n",
"2 0 0 \n",
"3 0 0 \n",
"4 0 0 \n",
".. ... ... \n",
"140 0 0 \n",
"141 0 0 \n",
"142 0 0 \n",
"143 0 0 \n",
"144 0 0 \n",
"\n",
"[145 rows x 76 columns]"
]
},
"execution_count": 136,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"one_hot"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Add neighborhood values corresponding to their nearby locations.\n"
]
},
{
"cell_type": "code",
"execution_count": 138,
"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>American Restaurant</th>\n",
" <th>Asian Restaurant</th>\n",
" <th>Athletics &amp; Sports</th>\n",
" <th>Auto Workshop</th>\n",
" <th>Bakery</th>\n",
" <th>Bank</th>\n",
" <th>Baseball Field</th>\n",
" <th>Beach</th>\n",
" <th>Boat or Ferry</th>\n",
" <th>Bookstore</th>\n",
" <th>Breakfast Spot</th>\n",
" <th>Brewery</th>\n",
" <th>Bubble Tea Shop</th>\n",
" <th>Burger Joint</th>\n",
" <th>Bus Station</th>\n",
" <th>Bus Stop</th>\n",
" <th>Business Service</th>\n",
" <th>Café</th>\n",
" <th>Chinese Restaurant</th>\n",
" <th>Coffee Shop</th>\n",
" <th>Construction &amp; Landscaping</th>\n",
" <th>Convenience Store</th>\n",
" <th>Dessert Shop</th>\n",
" <th>Dim Sum Restaurant</th>\n",
" <th>Dog Run</th>\n",
" <th>Elementary School</th>\n",
" <th>Falafel Restaurant</th>\n",
" <th>Fast Food Restaurant</th>\n",
" <th>Fish &amp; Chips Shop</th>\n",
" <th>Fried Chicken Joint</th>\n",
" <th>Garden</th>\n",
" <th>Gas Station</th>\n",
" <th>Gastropub</th>\n",
" <th>Gift Shop</th>\n",
" <th>Golf Course</th>\n",
" <th>Greek Restaurant</th>\n",
" <th>Grocery Store</th>\n",
" <th>Gym</th>\n",
" <th>Gym / Fitness Center</th>\n",
" <th>Home Service</th>\n",
" <th>Hot Dog Joint</th>\n",
" <th>Hotel</th>\n",
" <th>Indian Restaurant</th>\n",
" <th>Juice Bar</th>\n",
" <th>Korean Restaurant</th>\n",
" <th>Lake</th>\n",
" <th>Liquor Store</th>\n",
" <th>Malay Restaurant</th>\n",
" <th>Men's Store</th>\n",
" <th>Motorcycle Shop</th>\n",
" <th>Mountain</th>\n",
" <th>Park</th>\n",
" <th>Pet Store</th>\n",
" <th>Pharmacy</th>\n",
" <th>Pizza Place</th>\n",
" <th>Playground</th>\n",
" <th>Plaza</th>\n",
" <th>Pub</th>\n",
" <th>Recreation Center</th>\n",
" <th>Restaurant</th>\n",
" <th>Salon / Barbershop</th>\n",
" <th>Sandwich Place</th>\n",
" <th>Shipping Store</th>\n",
" <th>Ski Area</th>\n",
" <th>Ski Lodge</th>\n",
" <th>Snack Place</th>\n",
" <th>Sporting Goods Shop</th>\n",
" <th>Sushi Restaurant</th>\n",
" <th>Theme Park</th>\n",
" <th>Tourist Information Center</th>\n",
" <th>Toy / Game Store</th>\n",
" <th>Trail</th>\n",
" <th>Vacation Rental</th>\n",
" <th>Vietnamese Restaurant</th>\n",
" <th>Wine Shop</th>\n",
" <th>Zoo</th>\n",
" <th>Neighborhood</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Abbotsford</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Abbotsford</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Burnaby</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Burnaby</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Burnaby</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" American Restaurant Asian Restaurant Athletics & Sports Auto Workshop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Bakery Bank Baseball Field Beach Boat or Ferry Bookstore \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 1 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Breakfast Spot Brewery Bubble Tea Shop Burger Joint Bus Station \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Bus Stop Business Service Café Chinese Restaurant Coffee Shop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 1 \n",
"\n",
" Construction & Landscaping Convenience Store Dessert Shop \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Dim Sum Restaurant Dog Run Elementary School Falafel Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Fast Food Restaurant Fish & Chips Shop Fried Chicken Joint Garden \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Gas Station Gastropub Gift Shop Golf Course Greek Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Grocery Store Gym Gym / Fitness Center Home Service Hot Dog Joint \\\n",
"0 0 0 0 0 0 \n",
"1 1 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Hotel Indian Restaurant Juice Bar Korean Restaurant Lake Liquor Store \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Malay Restaurant Men's Store Motorcycle Shop Mountain Park Pet Store \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Pharmacy Pizza Place Playground Plaza Pub Recreation Center \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Restaurant Salon / Barbershop Sandwich Place Shipping Store Ski Area \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Ski Lodge Snack Place Sporting Goods Shop Sushi Restaurant Theme Park \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 1 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Tourist Information Center Toy / Game Store Trail Vacation Rental \\\n",
"0 0 0 1 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Vietnamese Restaurant Wine Shop Zoo Neighborhood \n",
"0 0 0 0 Abbotsford \n",
"1 0 0 0 Abbotsford \n",
"2 0 0 0 Burnaby \n",
"3 0 0 0 Burnaby \n",
"4 0 0 0 Burnaby "
]
},
"execution_count": 138,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"one_hot['Neighborhood'] = neighborhood_venues['Neighborhood'] \n",
"one_hot.head()"
]
},
{
"cell_type": "code",
"execution_count": 139,
"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>Neighborhood</th>\n",
" <th>American Restaurant</th>\n",
" <th>Asian Restaurant</th>\n",
" <th>Athletics &amp; Sports</th>\n",
" <th>Auto Workshop</th>\n",
" <th>Bakery</th>\n",
" <th>Bank</th>\n",
" <th>Baseball Field</th>\n",
" <th>Beach</th>\n",
" <th>Boat or Ferry</th>\n",
" <th>Bookstore</th>\n",
" <th>Breakfast Spot</th>\n",
" <th>Brewery</th>\n",
" <th>Bubble Tea Shop</th>\n",
" <th>Burger Joint</th>\n",
" <th>Bus Station</th>\n",
" <th>Bus Stop</th>\n",
" <th>Business Service</th>\n",
" <th>Café</th>\n",
" <th>Chinese Restaurant</th>\n",
" <th>Coffee Shop</th>\n",
" <th>Construction &amp; Landscaping</th>\n",
" <th>Convenience Store</th>\n",
" <th>Dessert Shop</th>\n",
" <th>Dim Sum Restaurant</th>\n",
" <th>Dog Run</th>\n",
" <th>Elementary School</th>\n",
" <th>Falafel Restaurant</th>\n",
" <th>Fast Food Restaurant</th>\n",
" <th>Fish &amp; Chips Shop</th>\n",
" <th>Fried Chicken Joint</th>\n",
" <th>Garden</th>\n",
" <th>Gas Station</th>\n",
" <th>Gastropub</th>\n",
" <th>Gift Shop</th>\n",
" <th>Golf Course</th>\n",
" <th>Greek Restaurant</th>\n",
" <th>Grocery Store</th>\n",
" <th>Gym</th>\n",
" <th>Gym / Fitness Center</th>\n",
" <th>Home Service</th>\n",
" <th>Hot Dog Joint</th>\n",
" <th>Hotel</th>\n",
" <th>Indian Restaurant</th>\n",
" <th>Juice Bar</th>\n",
" <th>Korean Restaurant</th>\n",
" <th>Lake</th>\n",
" <th>Liquor Store</th>\n",
" <th>Malay Restaurant</th>\n",
" <th>Men's Store</th>\n",
" <th>Motorcycle Shop</th>\n",
" <th>Mountain</th>\n",
" <th>Park</th>\n",
" <th>Pet Store</th>\n",
" <th>Pharmacy</th>\n",
" <th>Pizza Place</th>\n",
" <th>Playground</th>\n",
" <th>Plaza</th>\n",
" <th>Pub</th>\n",
" <th>Recreation Center</th>\n",
" <th>Restaurant</th>\n",
" <th>Salon / Barbershop</th>\n",
" <th>Sandwich Place</th>\n",
" <th>Shipping Store</th>\n",
" <th>Ski Area</th>\n",
" <th>Ski Lodge</th>\n",
" <th>Snack Place</th>\n",
" <th>Sporting Goods Shop</th>\n",
" <th>Sushi Restaurant</th>\n",
" <th>Theme Park</th>\n",
" <th>Tourist Information Center</th>\n",
" <th>Toy / Game Store</th>\n",
" <th>Trail</th>\n",
" <th>Vacation Rental</th>\n",
" <th>Vietnamese Restaurant</th>\n",
" <th>Wine Shop</th>\n",
" <th>Zoo</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Abbotsford</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Abbotsford</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Burnaby</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Burnaby</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Burnaby</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood American Restaurant Asian Restaurant Athletics & Sports \\\n",
"0 Abbotsford 0 0 0 \n",
"1 Abbotsford 0 0 0 \n",
"2 Burnaby 0 0 0 \n",
"3 Burnaby 0 0 0 \n",
"4 Burnaby 0 0 0 \n",
"\n",
" Auto Workshop Bakery Bank Baseball Field Beach Boat or Ferry \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Bookstore Breakfast Spot Brewery Bubble Tea Shop Burger Joint \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 1 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Bus Station Bus Stop Business Service Café Chinese Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Coffee Shop Construction & Landscaping Convenience Store Dessert Shop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 1 0 0 0 \n",
"\n",
" Dim Sum Restaurant Dog Run Elementary School Falafel Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Fast Food Restaurant Fish & Chips Shop Fried Chicken Joint Garden \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Gas Station Gastropub Gift Shop Golf Course Greek Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Grocery Store Gym Gym / Fitness Center Home Service Hot Dog Joint \\\n",
"0 0 0 0 0 0 \n",
"1 1 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Hotel Indian Restaurant Juice Bar Korean Restaurant Lake Liquor Store \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Malay Restaurant Men's Store Motorcycle Shop Mountain Park Pet Store \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Pharmacy Pizza Place Playground Plaza Pub Recreation Center \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Restaurant Salon / Barbershop Sandwich Place Shipping Store Ski Area \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Ski Lodge Snack Place Sporting Goods Shop Sushi Restaurant Theme Park \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 1 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Tourist Information Center Toy / Game Store Trail Vacation Rental \\\n",
"0 0 0 1 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Vietnamese Restaurant Wine Shop Zoo \n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 "
]
},
"execution_count": 139,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fixed_columns = [one_hot.columns[-1]] + list(one_hot.columns[:-1])\n",
"one_hot = one_hot[fixed_columns]\n",
"one_hot.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Checking the size of our new data frame.\n"
]
},
{
"cell_type": "code",
"execution_count": 140,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(145, 77)"
]
},
"execution_count": 140,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"one_hot.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Next, let's group rows by neighborhood and by taking the mean of the frequency of occurrence of each category.\n"
]
},
{
"cell_type": "code",
"execution_count": 141,
"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>Neighborhood</th>\n",
" <th>American Restaurant</th>\n",
" <th>Asian Restaurant</th>\n",
" <th>Athletics &amp; Sports</th>\n",
" <th>Auto Workshop</th>\n",
" <th>Bakery</th>\n",
" <th>Bank</th>\n",
" <th>Baseball Field</th>\n",
" <th>Beach</th>\n",
" <th>Boat or Ferry</th>\n",
" <th>Bookstore</th>\n",
" <th>Breakfast Spot</th>\n",
" <th>Brewery</th>\n",
" <th>Bubble Tea Shop</th>\n",
" <th>Burger Joint</th>\n",
" <th>Bus Station</th>\n",
" <th>Bus Stop</th>\n",
" <th>Business Service</th>\n",
" <th>Café</th>\n",
" <th>Chinese Restaurant</th>\n",
" <th>Coffee Shop</th>\n",
" <th>Construction &amp; Landscaping</th>\n",
" <th>Convenience Store</th>\n",
" <th>Dessert Shop</th>\n",
" <th>Dim Sum Restaurant</th>\n",
" <th>Dog Run</th>\n",
" <th>Elementary School</th>\n",
" <th>Falafel Restaurant</th>\n",
" <th>Fast Food Restaurant</th>\n",
" <th>Fish &amp; Chips Shop</th>\n",
" <th>Fried Chicken Joint</th>\n",
" <th>Garden</th>\n",
" <th>Gas Station</th>\n",
" <th>Gastropub</th>\n",
" <th>Gift Shop</th>\n",
" <th>Golf Course</th>\n",
" <th>Greek Restaurant</th>\n",
" <th>Grocery Store</th>\n",
" <th>Gym</th>\n",
" <th>Gym / Fitness Center</th>\n",
" <th>Home Service</th>\n",
" <th>Hot Dog Joint</th>\n",
" <th>Hotel</th>\n",
" <th>Indian Restaurant</th>\n",
" <th>Juice Bar</th>\n",
" <th>Korean Restaurant</th>\n",
" <th>Lake</th>\n",
" <th>Liquor Store</th>\n",
" <th>Malay Restaurant</th>\n",
" <th>Men's Store</th>\n",
" <th>Motorcycle Shop</th>\n",
" <th>Mountain</th>\n",
" <th>Park</th>\n",
" <th>Pet Store</th>\n",
" <th>Pharmacy</th>\n",
" <th>Pizza Place</th>\n",
" <th>Playground</th>\n",
" <th>Plaza</th>\n",
" <th>Pub</th>\n",
" <th>Recreation Center</th>\n",
" <th>Restaurant</th>\n",
" <th>Salon / Barbershop</th>\n",
" <th>Sandwich Place</th>\n",
" <th>Shipping Store</th>\n",
" <th>Ski Area</th>\n",
" <th>Ski Lodge</th>\n",
" <th>Snack Place</th>\n",
" <th>Sporting Goods Shop</th>\n",
" <th>Sushi Restaurant</th>\n",
" <th>Theme Park</th>\n",
" <th>Tourist Information Center</th>\n",
" <th>Toy / Game Store</th>\n",
" <th>Trail</th>\n",
" <th>Vacation Rental</th>\n",
" <th>Vietnamese Restaurant</th>\n",
" <th>Wine Shop</th>\n",
" <th>Zoo</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Abbotsford</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.5</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.5</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Burnaby</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.111111</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.111111</td>\n",
" <td>0.111111</td>\n",
" <td>0.222222</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.111111</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.111111</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.111111</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.111111</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Comox</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.166667</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.333333</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.166667</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.166667</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.166667</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Coquitlam</td>\n",
" <td>0.0</td>\n",
" <td>0.2</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.200000</td>\n",
" <td>0.0</td>\n",
" <td>0.2</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.2</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.2</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Cranbrook</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood American Restaurant Asian Restaurant Athletics & Sports \\\n",
"0 Abbotsford 0.0 0.0 0.0 \n",
"1 Burnaby 0.0 0.0 0.0 \n",
"2 Comox 0.0 0.0 0.0 \n",
"3 Coquitlam 0.0 0.2 0.0 \n",
"4 Cranbrook 0.0 0.0 0.0 \n",
"\n",
" Auto Workshop Bakery Bank Baseball Field Beach Boat or Ferry \\\n",
"0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"1 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"2 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"3 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"4 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"\n",
" Bookstore Breakfast Spot Brewery Bubble Tea Shop Burger Joint \\\n",
"0 0.000000 0.0 0.0 0.0 0.000000 \n",
"1 0.111111 0.0 0.0 0.0 0.111111 \n",
"2 0.000000 0.0 0.0 0.0 0.000000 \n",
"3 0.000000 0.0 0.0 0.0 0.000000 \n",
"4 0.000000 0.0 0.0 0.0 0.000000 \n",
"\n",
" Bus Station Bus Stop Business Service Café Chinese Restaurant \\\n",
"0 0.000000 0.000000 0.0 0.0 0.0 \n",
"1 0.111111 0.222222 0.0 0.0 0.0 \n",
"2 0.000000 0.000000 0.0 0.0 0.0 \n",
"3 0.000000 0.000000 0.0 0.0 0.0 \n",
"4 0.000000 0.000000 0.0 0.0 0.0 \n",
"\n",
" Coffee Shop Construction & Landscaping Convenience Store Dessert Shop \\\n",
"0 0.000000 0.0 0.0 0.0 \n",
"1 0.111111 0.0 0.0 0.0 \n",
"2 0.166667 0.0 0.0 0.0 \n",
"3 0.200000 0.0 0.2 0.0 \n",
"4 0.000000 1.0 0.0 0.0 \n",
"\n",
" Dim Sum Restaurant Dog Run Elementary School Falafel Restaurant \\\n",
"0 0.0 0.0 0.0 0.0 \n",
"1 0.0 0.0 0.0 0.0 \n",
"2 0.0 0.0 0.0 0.0 \n",
"3 0.0 0.0 0.0 0.0 \n",
"4 0.0 0.0 0.0 0.0 \n",
"\n",
" Fast Food Restaurant Fish & Chips Shop Fried Chicken Joint Garden \\\n",
"0 0.000000 0.0 0.0 0.0 \n",
"1 0.000000 0.0 0.0 0.0 \n",
"2 0.333333 0.0 0.0 0.0 \n",
"3 0.000000 0.0 0.0 0.0 \n",
"4 0.000000 0.0 0.0 0.0 \n",
"\n",
" Gas Station Gastropub Gift Shop Golf Course Greek Restaurant \\\n",
"0 0.0 0.0 0.0 0.0 0.0 \n",
"1 0.0 0.0 0.0 0.0 0.0 \n",
"2 0.0 0.0 0.0 0.0 0.0 \n",
"3 0.2 0.0 0.0 0.2 0.0 \n",
"4 0.0 0.0 0.0 0.0 0.0 \n",
"\n",
" Grocery Store Gym Gym / Fitness Center Home Service Hot Dog Joint \\\n",
"0 0.5 0.0 0.0 0.0 0.0 \n",
"1 0.0 0.0 0.0 0.0 0.0 \n",
"2 0.0 0.0 0.0 0.0 0.0 \n",
"3 0.0 0.0 0.0 0.0 0.0 \n",
"4 0.0 0.0 0.0 0.0 0.0 \n",
"\n",
" Hotel Indian Restaurant Juice Bar Korean Restaurant Lake Liquor Store \\\n",
"0 0.0 0.0 0.000000 0.0 0.0 0.0 \n",
"1 0.0 0.0 0.000000 0.0 0.0 0.0 \n",
"2 0.0 0.0 0.166667 0.0 0.0 0.0 \n",
"3 0.0 0.0 0.000000 0.0 0.0 0.0 \n",
"4 0.0 0.0 0.000000 0.0 0.0 0.0 \n",
"\n",
" Malay Restaurant Men's Store Motorcycle Shop Mountain Park \\\n",
"0 0.0 0.0 0.0 0.0 0.000000 \n",
"1 0.0 0.0 0.0 0.0 0.111111 \n",
"2 0.0 0.0 0.0 0.0 0.000000 \n",
"3 0.0 0.0 0.0 0.0 0.000000 \n",
"4 0.0 0.0 0.0 0.0 0.000000 \n",
"\n",
" Pet Store Pharmacy Pizza Place Playground Plaza Pub \\\n",
"0 0.0 0.000000 0.0 0.0 0.0 0.0 \n",
"1 0.0 0.000000 0.0 0.0 0.0 0.0 \n",
"2 0.0 0.166667 0.0 0.0 0.0 0.0 \n",
"3 0.0 0.000000 0.0 0.0 0.0 0.0 \n",
"4 0.0 0.000000 0.0 0.0 0.0 0.0 \n",
"\n",
" Recreation Center Restaurant Salon / Barbershop Sandwich Place \\\n",
"0 0.0 0.0 0.0 0.000000 \n",
"1 0.0 0.0 0.0 0.111111 \n",
"2 0.0 0.0 0.0 0.166667 \n",
"3 0.0 0.0 0.0 0.000000 \n",
"4 0.0 0.0 0.0 0.000000 \n",
"\n",
" Shipping Store Ski Area Ski Lodge Snack Place Sporting Goods Shop \\\n",
"0 0.0 0.0 0.0 0.000000 0.0 \n",
"1 0.0 0.0 0.0 0.111111 0.0 \n",
"2 0.0 0.0 0.0 0.000000 0.0 \n",
"3 0.0 0.0 0.0 0.000000 0.0 \n",
"4 0.0 0.0 0.0 0.000000 0.0 \n",
"\n",
" Sushi Restaurant Theme Park Tourist Information Center Toy / Game Store \\\n",
"0 0.0 0.0 0.0 0.0 \n",
"1 0.0 0.0 0.0 0.0 \n",
"2 0.0 0.0 0.0 0.0 \n",
"3 0.0 0.0 0.0 0.0 \n",
"4 0.0 0.0 0.0 0.0 \n",
"\n",
" Trail Vacation Rental Vietnamese Restaurant Wine Shop Zoo \n",
"0 0.5 0.0 0.0 0.0 0.0 \n",
"1 0.0 0.0 0.0 0.0 0.0 \n",
"2 0.0 0.0 0.0 0.0 0.0 \n",
"3 0.0 0.0 0.0 0.0 0.0 \n",
"4 0.0 0.0 0.0 0.0 0.0 "
]
},
"execution_count": 141,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"british_columbia_grouped = one_hot.groupby('Neighborhood').mean().reset_index()\n",
"british_columbia_grouped.head()"
]
},
{
"cell_type": "code",
"execution_count": 142,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(32, 77)"
]
},
"execution_count": 142,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"british_columbia_grouped.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### We define a function to sort the venues in descending order.\n"
]
},
{
"cell_type": "code",
"execution_count": 143,
"metadata": {},
"outputs": [],
"source": [
"def return_most_common_venues(row, num_top_venues):\n",
" row_categories = row.iloc[1:]\n",
" row_categories_sorted = row_categories.sort_values(ascending=False)\n",
" \n",
" return row_categories_sorted.index.values[0:num_top_venues]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Now we create the new data frame and display the top 10 venues for each neighborhood.\n"
]
},
{
"cell_type": "code",
"execution_count": 147,
"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>Neighborhood</th>\n",
" <th>1st Most Common Venue</th>\n",
" <th>2nd Most Common Venue</th>\n",
" <th>3rd Most Common Venue</th>\n",
" <th>4th Most Common Venue</th>\n",
" <th>5th Most Common Venue</th>\n",
" <th>6th Most Common Venue</th>\n",
" <th>7th Most Common Venue</th>\n",
" <th>8th Most Common Venue</th>\n",
" <th>9th Most Common Venue</th>\n",
" <th>10th Most Common Venue</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Abbotsford</td>\n",
" <td>Grocery Store</td>\n",
" <td>Trail</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Burnaby</td>\n",
" <td>Bus Stop</td>\n",
" <td>Bookstore</td>\n",
" <td>Snack Place</td>\n",
" <td>Park</td>\n",
" <td>Bus Station</td>\n",
" <td>Burger Joint</td>\n",
" <td>Sandwich Place</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Falafel Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Comox</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Pharmacy</td>\n",
" <td>Sandwich Place</td>\n",
" <td>Juice Bar</td>\n",
" <td>Elementary School</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Coquitlam</td>\n",
" <td>Asian Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Golf Course</td>\n",
" <td>Gas Station</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Zoo</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Cranbrook</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Duncan</td>\n",
" <td>Convenience Store</td>\n",
" <td>Gas Station</td>\n",
" <td>Dog Run</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Esquimalt</td>\n",
" <td>Boat or Ferry</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Zoo</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Fort St. John</td>\n",
" <td>American Restaurant</td>\n",
" <td>Gas Station</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Highlands</td>\n",
" <td>Zoo</td>\n",
" <td>Theme Park</td>\n",
" <td>Boat or Ferry</td>\n",
" <td>Wine Shop</td>\n",
" <td>Auto Workshop</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Kelowna Central</td>\n",
" <td>Park</td>\n",
" <td>Mountain</td>\n",
" <td>Zoo</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>Kimberley</td>\n",
" <td>American Restaurant</td>\n",
" <td>Ski Lodge</td>\n",
" <td>Hotel</td>\n",
" <td>Ski Area</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Kitimat</td>\n",
" <td>Business Service</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>Langley City</td>\n",
" <td>Baseball Field</td>\n",
" <td>Zoo</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Nanaimo Central</td>\n",
" <td>Tourist Information Center</td>\n",
" <td>Brewery</td>\n",
" <td>Zoo</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Nelson</td>\n",
" <td>Trail</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>New Westminster Northeast</td>\n",
" <td>Hot Dog Joint</td>\n",
" <td>Garden</td>\n",
" <td>Playground</td>\n",
" <td>Zoo</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>Oak Bay</td>\n",
" <td>Gym</td>\n",
" <td>Bookstore</td>\n",
" <td>Gift Shop</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Men's Store</td>\n",
" <td>Breakfast Spot</td>\n",
" <td>Café</td>\n",
" <td>Bakery</td>\n",
" <td>Toy / Game Store</td>\n",
" <td>Bank</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>Parksville</td>\n",
" <td>Bookstore</td>\n",
" <td>Home Service</td>\n",
" <td>Zoo</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>Pitt Meadows</td>\n",
" <td>Gym / Fitness Center</td>\n",
" <td>Plaza</td>\n",
" <td>Elementary School</td>\n",
" <td>Pub</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>Qualicum Beach</td>\n",
" <td>American Restaurant</td>\n",
" <td>Restaurant</td>\n",
" <td>Pharmacy</td>\n",
" <td>Grocery Store</td>\n",
" <td>Gastropub</td>\n",
" <td>Gas Station</td>\n",
" <td>Garden</td>\n",
" <td>Fried Chicken Joint</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>Richmond</td>\n",
" <td>Gym</td>\n",
" <td>Grocery Store</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Sushi Restaurant</td>\n",
" <td>Pizza Place</td>\n",
" <td>Sandwich Place</td>\n",
" <td>Pub</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Indian Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>Saanich Central</td>\n",
" <td>Bank</td>\n",
" <td>Zoo</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>Salmon Arm</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>Sooke</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>South Okanagan</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>Surrey</td>\n",
" <td>Recreation Center</td>\n",
" <td>Auto Workshop</td>\n",
" <td>Zoo</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>Terrace</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>Trail</td>\n",
" <td>Pub</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Zoo</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>Vancouver</td>\n",
" <td>Bank</td>\n",
" <td>Sushi Restaurant</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Park</td>\n",
" <td>Gym</td>\n",
" <td>Sandwich Place</td>\n",
" <td>Greek Restaurant</td>\n",
" <td>Grocery Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Liquor Store</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>Victoria Central British Columbia Provincial G...</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Brewery</td>\n",
" <td>Restaurant</td>\n",
" <td>Motorcycle Shop</td>\n",
" <td>Sandwich Place</td>\n",
" <td>Gym</td>\n",
" <td>Gastropub</td>\n",
" <td>Fried Chicken Joint</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <td>Whistler</td>\n",
" <td>Hotel</td>\n",
" <td>Vacation Rental</td>\n",
" <td>Beach</td>\n",
" <td>Lake</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31</th>\n",
" <td>White Rock</td>\n",
" <td>Park</td>\n",
" <td>Gym / Fitness Center</td>\n",
" <td>Athletics &amp; Sports</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood \\\n",
"0 Abbotsford \n",
"1 Burnaby \n",
"2 Comox \n",
"3 Coquitlam \n",
"4 Cranbrook \n",
"5 Duncan \n",
"6 Esquimalt \n",
"7 Fort St. John \n",
"8 Highlands \n",
"9 Kelowna Central \n",
"10 Kimberley \n",
"11 Kitimat \n",
"12 Langley City \n",
"13 Nanaimo Central \n",
"14 Nelson \n",
"15 New Westminster Northeast \n",
"16 Oak Bay \n",
"17 Parksville \n",
"18 Pitt Meadows \n",
"19 Qualicum Beach \n",
"20 Richmond \n",
"21 Saanich Central \n",
"22 Salmon Arm \n",
"23 Sooke \n",
"24 South Okanagan \n",
"25 Surrey \n",
"26 Terrace \n",
"27 Trail \n",
"28 Vancouver \n",
"29 Victoria Central British Columbia Provincial G... \n",
"30 Whistler \n",
"31 White Rock \n",
"\n",
" 1st Most Common Venue 2nd Most Common Venue 3rd Most Common Venue \\\n",
"0 Grocery Store Trail Falafel Restaurant \n",
"1 Bus Stop Bookstore Snack Place \n",
"2 Fast Food Restaurant Coffee Shop Pharmacy \n",
"3 Asian Restaurant Convenience Store Golf Course \n",
"4 Construction & Landscaping Zoo Fast Food Restaurant \n",
"5 Convenience Store Gas Station Dog Run \n",
"6 Boat or Ferry Fish & Chips Shop Convenience Store \n",
"7 American Restaurant Gas Station Fast Food Restaurant \n",
"8 Zoo Theme Park Boat or Ferry \n",
"9 Park Mountain Zoo \n",
"10 American Restaurant Ski Lodge Hotel \n",
"11 Business Service Zoo Fast Food Restaurant \n",
"12 Baseball Field Zoo Fish & Chips Shop \n",
"13 Tourist Information Center Brewery Zoo \n",
"14 Trail Zoo Fast Food Restaurant \n",
"15 Hot Dog Joint Garden Playground \n",
"16 Gym Bookstore Gift Shop \n",
"17 Bookstore Home Service Zoo \n",
"18 Gym / Fitness Center Plaza Elementary School \n",
"19 American Restaurant Restaurant Pharmacy \n",
"20 Gym Grocery Store Dim Sum Restaurant \n",
"21 Bank Zoo Fish & Chips Shop \n",
"22 Construction & Landscaping Zoo Fast Food Restaurant \n",
"23 Construction & Landscaping Zoo Fast Food Restaurant \n",
"24 Construction & Landscaping Zoo Fast Food Restaurant \n",
"25 Recreation Center Auto Workshop Zoo \n",
"26 Construction & Landscaping Zoo Fast Food Restaurant \n",
"27 Pub Falafel Restaurant Coffee Shop \n",
"28 Bank Sushi Restaurant Coffee Shop \n",
"29 Coffee Shop Brewery Restaurant \n",
"30 Hotel Vacation Rental Beach \n",
"31 Park Gym / Fitness Center Athletics & Sports \n",
"\n",
" 4th Most Common Venue 5th Most Common Venue \\\n",
"0 Coffee Shop Construction & Landscaping \n",
"1 Park Bus Station \n",
"2 Sandwich Place Juice Bar \n",
"3 Gas Station Coffee Shop \n",
"4 Convenience Store Dessert Shop \n",
"5 Zoo Fast Food Restaurant \n",
"6 Dessert Shop Dim Sum Restaurant \n",
"7 Construction & Landscaping Convenience Store \n",
"8 Wine Shop Auto Workshop \n",
"9 Falafel Restaurant Convenience Store \n",
"10 Ski Area Construction & Landscaping \n",
"11 Convenience Store Dessert Shop \n",
"12 Convenience Store Dessert Shop \n",
"13 Falafel Restaurant Construction & Landscaping \n",
"14 Construction & Landscaping Convenience Store \n",
"15 Zoo Falafel Restaurant \n",
"16 Fish & Chips Shop Men's Store \n",
"17 Convenience Store Dessert Shop \n",
"18 Pub Coffee Shop \n",
"19 Grocery Store Gastropub \n",
"20 Sushi Restaurant Pizza Place \n",
"21 Convenience Store Dessert Shop \n",
"22 Convenience Store Dessert Shop \n",
"23 Convenience Store Dessert Shop \n",
"24 Convenience Store Dessert Shop \n",
"25 Falafel Restaurant Construction & Landscaping \n",
"26 Convenience Store Dessert Shop \n",
"27 Construction & Landscaping Convenience Store \n",
"28 Park Gym \n",
"29 Motorcycle Shop Sandwich Place \n",
"30 Lake Zoo \n",
"31 Zoo Fast Food Restaurant \n",
"\n",
" 6th Most Common Venue 7th Most Common Venue \\\n",
"0 Convenience Store Dessert Shop \n",
"1 Burger Joint Sandwich Place \n",
"2 Elementary School Construction & Landscaping \n",
"3 Zoo Falafel Restaurant \n",
"4 Dim Sum Restaurant Dog Run \n",
"5 Construction & Landscaping Dessert Shop \n",
"6 Dog Run Elementary School \n",
"7 Dessert Shop Dim Sum Restaurant \n",
"8 Fish & Chips Shop Dessert Shop \n",
"9 Dessert Shop Dim Sum Restaurant \n",
"10 Convenience Store Dessert Shop \n",
"11 Dim Sum Restaurant Dog Run \n",
"12 Dim Sum Restaurant Dog Run \n",
"13 Convenience Store Dessert Shop \n",
"14 Dessert Shop Dim Sum Restaurant \n",
"15 Construction & Landscaping Convenience Store \n",
"16 Breakfast Spot Café \n",
"17 Dim Sum Restaurant Dog Run \n",
"18 Construction & Landscaping Convenience Store \n",
"19 Gas Station Garden \n",
"20 Sandwich Place Pub \n",
"21 Dim Sum Restaurant Dog Run \n",
"22 Dim Sum Restaurant Dog Run \n",
"23 Dim Sum Restaurant Dog Run \n",
"24 Dim Sum Restaurant Dog Run \n",
"25 Convenience Store Dessert Shop \n",
"26 Dim Sum Restaurant Dog Run \n",
"27 Dessert Shop Dim Sum Restaurant \n",
"28 Sandwich Place Greek Restaurant \n",
"29 Gym Gastropub \n",
"30 Fast Food Restaurant Convenience Store \n",
"31 Convenience Store Dessert Shop \n",
"\n",
" 8th Most Common Venue 9th Most Common Venue 10th Most Common Venue \n",
"0 Dim Sum Restaurant Dog Run Elementary School \n",
"1 Coffee Shop Fast Food Restaurant Falafel Restaurant \n",
"2 Convenience Store Dessert Shop Dim Sum Restaurant \n",
"3 Dessert Shop Dim Sum Restaurant Dog Run \n",
"4 Elementary School Falafel Restaurant Fish & Chips Shop \n",
"5 Dim Sum Restaurant Elementary School Falafel Restaurant \n",
"6 Falafel Restaurant Fast Food Restaurant Zoo \n",
"7 Dog Run Elementary School Falafel Restaurant \n",
"8 Dim Sum Restaurant Dog Run Elementary School \n",
"9 Dog Run Elementary School Fast Food Restaurant \n",
"10 Dim Sum Restaurant Dog Run Elementary School \n",
"11 Elementary School Falafel Restaurant Fish & Chips Shop \n",
"12 Elementary School Falafel Restaurant Fast Food Restaurant \n",
"13 Dim Sum Restaurant Dog Run Elementary School \n",
"14 Dog Run Elementary School Falafel Restaurant \n",
"15 Dessert Shop Dim Sum Restaurant Dog Run \n",
"16 Bakery Toy / Game Store Bank \n",
"17 Elementary School Falafel Restaurant Fast Food Restaurant \n",
"18 Dessert Shop Dim Sum Restaurant Dog Run \n",
"19 Fried Chicken Joint Fish & Chips Shop Fast Food Restaurant \n",
"20 Fast Food Restaurant Falafel Restaurant Indian Restaurant \n",
"21 Elementary School Falafel Restaurant Fast Food Restaurant \n",
"22 Elementary School Falafel Restaurant Fish & Chips Shop \n",
"23 Elementary School Falafel Restaurant Fish & Chips Shop \n",
"24 Elementary School Falafel Restaurant Fish & Chips Shop \n",
"25 Dim Sum Restaurant Dog Run Elementary School \n",
"26 Elementary School Falafel Restaurant Fish & Chips Shop \n",
"27 Dog Run Elementary School Zoo \n",
"28 Grocery Store Dessert Shop Liquor Store \n",
"29 Fried Chicken Joint Fish & Chips Shop Fast Food Restaurant \n",
"30 Dessert Shop Dim Sum Restaurant Dog Run \n",
"31 Dim Sum Restaurant Dog Run Elementary School "
]
},
"execution_count": 147,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"indicators = ['st', 'nd', 'rd']\n",
"\n",
"# create columns according to number of top venues\n",
"columns = ['Neighborhood']\n",
"for ind in np.arange(10):\n",
" try:\n",
" columns.append('{}{} Most Common Venue'.format(ind+1, indicators[ind]))\n",
" except:\n",
" columns.append('{}th Most Common Venue'.format(ind+1))\n",
"\n",
"# create a new dataframe\n",
"neigh_top_venues = pd.DataFrame(columns=columns)\n",
"neigh_top_venues['Neighborhood'] = british_columbia_grouped['Neighborhood']\n",
"\n",
"for ind in np.arange(british_columbia_grouped.shape[0]):\n",
" neigh_top_venues.iloc[ind, 1:] = return_most_common_venues(british_columbia_grouped.iloc[ind, :], 10)\n",
"\n",
"neigh_top_venues"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"## Cluster Neighborhoods <a name=\"cluster\"></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Here, we cluster the neighborhoods using the k-means clustering based on similar nearby locations. One of the most important factor in K-Means Clustering is to choose the value of 'k', or the number of clusters for th dataset. To decide this, we plot a graph with the 'sum of squared distances' on the y-axis and the 'k' value on the x-axis. Ideally, from this graph, the best 'k' value would be the one with the least sum of squared distance but that usually results in a very high k value. Hence, we apply the elbow method to choose the optimum k value. In the graph, as we increase the value of k, the distance decreases. The point which shows a steep decline in the distance, after which the distance decrease is comparatively less is known as the optimal value of k ( also known as the elbow point ). \n"
]
},
{
"cell_type": "code",
"execution_count": 176,
"metadata": {},
"outputs": [],
"source": [
"british_columbia_clustering = british_columbia_grouped.drop('Neighborhood', 1)"
]
},
{
"cell_type": "code",
"execution_count": 177,
"metadata": {},
"outputs": [],
"source": [
"Sum_of_squared_distances = []\n",
"K = range(1,15)\n",
"for k in K:\n",
" km = KMeans(n_clusters=k)\n",
" km = km.fit(british_columbia_clustering)\n",
" Sum_of_squared_distances.append(km.inertia_)"
]
},
{
"cell_type": "code",
"execution_count": 178,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 179,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAEWCAYAAACOv5f1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3de7yVc/r/8dfVQaRSUUiSDMm57KacJRkS5RBiJ+OQ+Y3zDA2jMYyRMGMm4zAyRqFSEjmrL1tJThUphJmhA1EUUirV9fvjc2+tdru91732Wt1r7/V+Ph7rsfZ9r8N97VX7uu/1OVwfc3dERKSw1Eo6ABER2fyU/EVECpCSv4hIAVLyFxEpQEr+IiIFSMlfRKQAKfnLBszsHDObkrLtZvazJGPKlmz+Lmb2qZkdnY33ygdm9r2ZtcnB+27w/6nMY62jf5M62T6uVE7JvwBFieuH6A++9HZn0nHBT8nCzez2Mvt7RfuHpfk+L5vZ+TkJsvJjDzOz1WU+39Oz+P49zOxNM1tuZl+b2Qgzaxnj9Rt9Nu7ewN3/l60YJf8p+ReuE6I/+NLbxUkHlOK/wOllrgjPBj5KKJ5M3Frm8x0d9w3MrHY5+04FRgJDgO2AvYFVwBQza1LVoKVwKPlLOrqb2f/M7Cszu83MagGYWS0zG2hmc81skZk9aGbbRI8NN7PfRj/vFF21/zra/pmZLTEz28TxvgBmAb+Int8UOBh4MvVJZtbZzKaa2TdmNtPMjoz23wQcBtxZzreao83sYzNbamZ3lcZQ0e8SPd43euxrM7s20w/SzNpFV97fmNl7ZnZiymPDzOweM3vWzJYDXcq81oC/An929xHu/oO7fwGcD3wPXBE97xwze9XM/mFm35rZHDPrWtFnk9okFsVxt5k9Fz3nVTPbwcz+Hn1uc8ysfUpcV5vZf81smZm9b2YnZfjZnBJ9K90nk9dLPEr+ko6TgCKgA9ATODfaf0506wK0ARoApYl2EnBk9PMRwP+ie4DDgVe84toiDxKu9gHOAMYTrnCBcEIBngH+DDQFrgQeM7Nm7n4t8ApwcTnfanoAHYH9gdOITjAV/S5mthdwD9AXaAFsC6TdzJISc13gKWAC0By4BBhhZm1TnnYmcBPQECjbVt4WaAU8mrrT3dcBjwHdUnZ3Inzm2wF/BMaZWdNKPptUpwEDo9evAl4DZkTbY4HUZrn/Ek4o2wA3AA+b2Y4VfhhlmNkvgVuAo919dpzXSmaU/AvXE9HVZ+ntggqee4u7L3H3ecDfgT7R/rOA2939f+7+PXANcEbUXDMJOCz6lnA4cCtwSPS6I6LHK/I4cGR09X024WSQqhh41t2fdfd17j4RmAZ0r+R9B7v7N9HvUgIckMbvcirwtLtPdvdVwB+AdZUc58qUz/araF9nwkllsLuvdveXgKdZ/3kCjHf3V6PfaWWZ99wuul9YzvEWpjwOsAj4u7v/GDU5fQgcX0nMqR539+lRDI8DK939QXdfC4wGfrryd/dH3f3zKObRwMfAz2Mc63LgKuBId/9PjNdJFSj5F65e7t445XZfBc+dn/LzXMLVL9H93DKP1QG2d/f/EpoiDiBcFT4NfB5d5Vaa/N39B8KV/UBgO3d/tcxTdgF6p57AgEOByq44v0j5eQUhGVf4u0SP/fQZuPty4OtKjvOXlM+2NCm3AOZHV+qpx9kpZTv1sy6r9CRS3u+4Y8rjAJ+V+WaV+u+Wji9Tfv6hnO3Szw0zO9vM3kn5d9iHDU9ElbkKuMvdF8R4jVSRkr+kY+eUn1sBn0c/f05IwqmPrWF9ophEuGrewt0/i7bPBpoA76Rx3AeB3wIPlfPYfOChMiewrd19cPR43HK1Ff0uC0n5DMysPqHpJ67PgZ1L+0xSjvNZynZFcX8ILAB6p+6M3u8U4MWU3TuV6VNJ/XfLWilfM9sFuA+4GNjW3RsDs4FN9eeU5xhgoJmdkq24pHJK/pKOq8ysiZntDFxG+NoPMAq4wsx2NbMGwCBgtLuviR6fREgKk6Ptlwnt3FOi5oPKTCK0Y/+jnMceBk4ws1+YWW0z29LMjrT1Qx6/JLTdp6ui32Us0MPMDjWzLYA/kdnfzhvAcmCAmdWNOqhPAB5J58XRlfyVhER5ppltZWY7AP8CGgF/S3l6c+DS6Di9gXbAs9FjcT+bimxNOJkshp/a7uN22L4HHAvcldoBLrml5F+4nrINx6E/XsFzxwPTCVfrzwD3R/v/Tbgqnwx8AqwkJPdSkwgdl6XJfwpQP2W7Qh686O5LynlsPqHz+feExDOf0HxQ+n96CHBqNDrljjQOt8nfxd3fAy4iDLFcCCwlXIHH4u6rgROB4whNNHcDZ7v7nBjvMZrQ8XxF9B7vA1sBh7h7alPUG8Du0XNuAk5NeTzuZ1NRPO8TRiC9Rjip7AuUbaJL531mEjrj7zOz46oSk6THtJiLSM1iZucA57v7oUnHIvlLV/4iIgVIyV9EpACp2UdEpADpyl9EpABVm1Kq2223nbdu3TrpMEREqpXp06d/5e7Nyu6vNsm/devWTJs2LekwRESqFTObW95+NfuIiBQgJX8RkQKk5C8iUoCU/EVEClBOk7+Z/TtaFWl2mf2XmNmH0UpGt+YyBhER2Viur/yHEar1/cTMuhAKcu3n7nsDf8nFgW+9FUpKNtxXUhL2i4gUupwmf3efDJStyPj/CCsZrYqesygXx+7YEU47bf0JoKQkbHfsmIujiYhUL0m0+e9BWN7vDTObZGY5ScddusCYMdCrFxx3XEj8Y8aE/SIihS6J5F+HsJJTZ0L99TFlVhz6iZn1N7NpZjZt8eLFsQ/UpQvssgs8/zxccIESv4hIqSSS/wJgXLRQx5uEhbDLXe/T3Ye6e5G7FzVrttHs5EqVlMC8eeHnu+7auA9ARKRQJZH8nwCOAjCzPYAt2HDh6awobeMfOxZ22AH23XfDPgARkUKW66GeowjLu7U1swVmdh5hubw20fDPR4B+noO60m+9Fdr4jz4a+vSBN9+Ef/0r7BcRKXTVpp5/UVGRZ1rYbcYMOPBA+Oc/4cILsxyYiEgeM7Pp7l5Udn9BzPBt3x7atYOHH046EhGR/FAQyd8MiothyhT45JOkoxERSV5BJH+AM88M9yNHJhuHiEg+KJjk37o1HHZYaPqpJt0cIiI5UzDJH0LTz5w5oQNYRKSQFVTy790btthCHb8iIgWV/Js0gR49YNQoWLMm6WhERJJTUMkfQtPPl1/Ciy8mHYmISHIKLvl37w6NG8NDDyUdiYhIcgou+derF2r8PP44fP990tGIiCSj4JI/hKafFSvgiSeSjkREJBkFmfwPOSTU+deoHxEpVAWZ/GvVgrPOgokT4Ysvko5GRGTzK8jkDyH5r1sHjzySdCQiIptfwSb/vfaCDh3U9CMihalgkz9A374wfTp88EHSkYiIbF4FnfzPOCO0/48YkXQkIiKbV0En/x12gG7dQvJfty7paERENp+CTv4Qxvx/+ilMnZp0JCIim0/BJ/9evaB+fZV7EJHCUvDJv0EDOOkkGDMGVq1KOhoRkc0jp8nfzP5tZovMbHY5j11pZm5m2+UyhnQUF8M338CzzyYdiYjI5pHrK/9hwLFld5rZzkA3YF6Oj5+Wo4+G5s015l9ECkdOk7+7TwaWlPPQ34ABQF6splunDvTpA08/DUuXJh2NiEjubfY2fzM7EfjM3Wdu7mNXpLgYVq+GsWOTjkREJPc2a/I3s/rAtcB1aT6/v5lNM7NpixcvzmlsBx4Ibduq6UdECsPmvvLfDdgVmGlmnwItgRlmtkN5T3b3oe5e5O5FzZo1y2lgZqHcw+TJMHduTg8lIpK4zZr83X2Wuzd399bu3hpYAHRw97worHzmmeF+5Mhk4xARybVcD/UcBbwGtDWzBWZ2Xi6PV1W77gqHHhomfHledEWLiORGrkf79HH3Hd29rru3dPf7yzze2t2/ymUMcRUXhyqf77yTdCQiIrmTdvI3s8vMrJEF95vZDDM7JpfBJaF3b6hbV+UeRKRmi3Plf667fwccAzQDfgkMzklUCWraFI4/HkaNgjVrko5GRCQ34iR/i+67Aw9E4/StgudXW8XFYW3fl15KOhIRkdyIk/ynm9kEQvJ/wcwaAjWyCv7xx8M222jMv4jUXHGS/3nA1UBHd18BbEFo+qlxttwytP2PGwfLlycdjYhI9sVJ/g7sBVwabW8NbJn1iPJEcXFI/OPHJx2JiEj2xUn+dwMHAX2i7WXAXVmPKE8cdhi0aqWmHxGpmeIk/07ufhGwEsDdlxKafmqkWrXgrLNgwgT48sukoxERya44yf9HM6tNVIbZzJpRQzt8SxUXw9q1MHp00pGIiGRXnOR/B/A40NzMbgKmAINyElWe2GsvaN9eTT8iUvOknfzdfQRhAZabgYVAL3d/NFeB5YviYnjrLfjww6QjERHJnjjlHToTFmG5y93vBBaYWafchZYfzjgjtP+PGJF0JCIi2ROn2ece4PuU7eXRvhqtRQvo2jU0/ajSp4jUFLHKO7ivT3/uvg6ok/2Q8k9xMXzyCUydmnQkIiLZESf5/8/MLjWzutHtMuB/uQosn5x0Emy1lTp+RaTmiJP8fwUcDHxGWIGrE9A/F0Hlm4YNoVevMORz9eqkoxERqbo4o30WufsZ0TKM27v7me6+KJfB5ZO+fWHpUnjuuaQjERGpurTb7KNJXRcArVNf5+7nZj+s/NOtGzRrFpp+evZMOhoRkaqJ02E7HngF+D9gbW7CyV916kCfPnDvvfDNN9C4cdIRiYhkLk6bf313/527j3H3x0pvOYssDxUXw6pV8FhB/dYiUhPFSf5Pm1n3nEVSDRQVwR57aNSPiFR/cZL/ZYQTwA9m9p2ZLTOz73IVWD4yC1f/L78M8+YlHY2ISObijPZp6O613H0rd28UbTeq6DVm9m8zW2Rms1P23WZmc8zsXTN73MyqVev5WWeF+1Gjko1DRKQq4lz5Y2ZNzOznZnZ46a2SlwwDji2zbyKwj7vvB3wEXBMnhqS1aQMHHwwPPaRyDyJSfcUp7HY+MBl4Abghur++ote4+2RgSZl9E9x9TbT5OtAyRrx5obgY3nsPZs5MOhIRkczEbfPvCMx19y5Ae2BxFY9/LrDJaVNm1t/MppnZtMWLq3qo7DntNKhbVx2/IlJ9xUn+K919JYCZ1XP3OUDbTA9sZtcCa4BNFkt296HuXuTuRc2aNcv0UFm37bbQvTuMHBlW+hIRqW7iJP8FUefsE8BEMxsPfJ7JQc2sH9ADOCu1Umh1ceutcMABsHAhlJSEfSUlYb+ISHWQ9gxfdz8p+vF6MysBtqGCJptNMbNjgd8BR7j7irivzwcdO4amn/r1Q9NP7dphe8yYpCMTEUlPnA7fh0p/dvdJ7v4k8O9KXjMKeA1oa2YLzOw84E6gIeHbwztm9s/MQk9Oly4h0a9bF5p+evcO2126JB2ZiEh64tT22Tt1w8xqAwdW9AJ371PO7vtjHDNvdekSav088ECo+9Oy2o1ZEpFCVumVv5ldY2bLgP2imb3fRduLCMXeClJJCTz1VFjjd9Ei2H9/1fwRkeqj0uTv7je7e0Pgtmhmb+ns3m3dvVpN0MqWkpL1bfyjRoXF3X/8EU49Fa64Qgu+iEj+i1vYbWsAMys2s9vNbJccxZXX3nprwzb+Pn3gmWfCzN+//x2OPBLmz080RBGRCsVJ/vcAK8xsf2AAMBd4MCdR5bkBAzbu3D3mGHj11XBSmDUL2reHF15IJj4RkcrESf5rojH5PYEh7j6EMGpHUvTuDdOnQ4sWcNxxcN11mggmIvknTvJfZmbXAMXAM9Fon7q5Cat622MPeP116NcPbrwRfvGL0CksIpIv4iT/04FVwHnu/gWwE3BbTqKqAerXD8NA778/NAe1bw9TpiQdlYhIEKee/xfufru7vxJtz3P3gmzzj+Pcc8O3gPr1Q0fwbbepFLSIJC+dcf5TovtlKeP8C3Ilr0ztvz9Mmwa9eoXO4pNOCovAi4gkJZ1x/odG9w1TxvmntZKXrLfNNvDoo2Eo6DPPQIcOoWNYRCQJ6Vz5N63otjmCrCnM4LLL4JVXYM2aMC/g3nvVDCQim186bf7TgWnR/WLC0osfRz/r2jUDnTvDjBlhrsCvfgV9+8L33ycdlYgUknSafXZ19zaEZRtPcPft3H1bQj3+cbkOsKbabjt49tkwFHTUKPj5z+H995OOSkQKRZyhnh3d/dnSDXd/Djgi+yEVjlq1YOBAmDABvv46rBMwcmTSUYlIIYiT/L8ys4Fm1trMdomWYfw6V4EVkq5d4e234cAD4ayzQrNQ2dIQWilMRLIpTvLvAzQDHo9uzaJ9kgUtWsBLL4WhoG+8AT16rP8WUFpFtGPHZGMUkZrDsrWErpn9w90vycqblaOoqMinTZuWq7fPK08+CWeeCStWwMknw6RJWilMRDJjZtPdvajs/jhX/pU5JIvvVdBOPDFUBt1hh7BATOPG0Lp10lGJSE2SzeQvWfTpp2GBmG7d4D//gT33hMGDwz4RkapS8s9DqSuFTZgAjzwS9l9zjQrEiUh2ZDP5Wxbfq6CVXSns9NPh+edDiehly+Cww+D888PwUBGRTGQz+Q8pu8PM/m1mi8xsdsq+pmY20cw+ju6bZDGGGqG8lcK6dIFhw8JEsKuuCj/vuScMH67yECISX6WjfczsKWCTT3L3Eyt47eHA98CD7r5PtO9WYIm7Dzazq4Em7v67ygItpNE+6Xj33VAa4rXX4Igj4J57oF27pKMSkXxTldE+fwH+CnwC/ADcF92+B2ZX8DrcfTKwpMzunsDw6OfhQK80YpAy9tsvtP0PHQozZ4ay0QMHwg8/JB2ZiFQH6dT2meTuk4D27n66uz8V3c4EDs3gmNu7+8LovRcCzTf1RDPrb2bTzGza4sWLMzhUzVarFlxwAXz4YegXuOkm2Hff0EksIlKROG3+zcysTemGme1KmOWbM+4+1N2L3L2oWbOcHqpaa94cHnoIXnwRatcOawafcQYsXJh0ZCKSr+Ik/yuAl83sZTN7GSgBLs/gmF+a2Y4A0b2WNs+So44KfQE33ABPPBE6hO+6C9auTToyEck3cdbwfR7YHbgsurV19xcqflW5ngT6RT/3A8Zn8B6yCfXqwXXXhRnCHTvCxRfDQQeFwnEiIqXSTv5mVh+4CrjY3WcCrcysRyWvGQW8BrQ1swVmdh4wGOhmZh8D3aJtybLdd4eJE2HECJg7F4qK4IorwjwBEZE4zT4PAKuBg6LtBcCfK3qBu/dx9x3dva67t3T3+939a3fv6u67R/dlRwNJlpiFAnFz5kD//jBkCLRsGZqFUkf4qly0SOGJk/x3c/dbgR8B3P0HNKu3WmjSJMwDmDo1rCB2/fVh/eBPP1W5aJFCVSfGc1eb2VZEE77MbDdgVU6ikpzo3DkMC73kEvjnP0PTUL16oXNY5aJFCkucK/8/As8DO5vZCOBFYEBOopKcqVMnfAu49FJYswaWLw/lJKZPTzoyEdmc0kr+ZmbAHOBk4BxgFFDk7i/nLDLJmZKSsErYwIHQsGFo/vn5z+G3vw0nAxGp+dJK/h4KAD0RddY+4+5Pu/tXOY5NciC1XPSNN8L48WGmcPfucPvtsPfeoYKoiNRscZp9XjczdQtWc2XLRXfpAo8+GspET54MW20Fxx0XFpJfpOl3IjVW2mv4mtn7wB7AXGA5YaSPu/t+uQtvPVX13DxWrYKbb4ZBg6BBA/jrX+Gcc8KwURGpfrKxhu9xwG7AUcAJQI/oXmqQevXCUNCZM0MT0LnnQteu8PHHSUcmItkUp7zDXHefSyjr7Ck3qYHatYNJk8KQ0OnTQ7XQQYO0hrBITRGnvMOJUUmGT4BJwKfAczmKS/JArVpw4YXwwQdwwglw7bXQoQO8/nrSkYlIVcVp9rkR6Ax85O67Al2BV3MSleSVFi1Cp/D48bB0aZgdfMkl8N13SUcmIpmKk/x/dPevgVpmVsvdS4ADchSX5KETTwxrCF98cSgVvdde8OSTSUclIpmIk/y/MbMGwGRghJkNAdbkJizJV40awR13hLWDmzaFnj3h1FO1cIxIdRMn+fckdPZeQSjz8F802qdgdeoUOoIHDYKnnw4dxPfeC+vWJR2ZiKQjzmif5e6+1t3XuPtwd78jagaSAlW3LlxzTVg45sAD4Ve/gjZt4IEHNnyeSkaL5J84o32Wmdl30W2lma01M3X5CbvvDv/3fyHpL1kS5gacfTasXKmS0SL5Ku2Szu7eMHXbzHoBP896RFItmYWZwN27hwVkHnoIxo0Lj40apZLRIvkmTpv/Btz9CcJsX5GfNG8evgWcfXaoELp8ORQXw+9/D19+mXR0IlIqTrPPySm3U81sMJrhK+UoKYFnn4U//AEaN4b27WHwYGjdGi66CD75JOkIRSTOlf8JKbdfAMsII4BEfpJaMvpPfwpNP++9B8OHh28A990X+giKi0NHsYgkI85on1+m3C5w95vcXUV/ZQPllYweMybMA7jvvnDVf/nlYbbwfvtBjx7wquaJi2x2cUo631HR4+5+aawDm10BnE9oOpoF/NLdV27q+SrpXLMsWQJ33w1DhsBXX8Ghh8LVV4cOY5WPFsmebJR03hLoAHwc3Q4A1gLTo1ucYHYCLiUsBbkPUBs4I857SPXWtGlYRnLu3DBjeN688C1g//3DEpNrNHdcJKfiJP/dgS7u/g93/wehsNsB0YSv4Rkcuw6wlZnVAeoDn2fwHlLN1a8fisT95z+hX2Dt2rCK2B57hIXmV27yu6CIVEWc5N8CSB3r3yDaF5u7fwb8BZgHLAS+dfcJZZ9nZv3NbJqZTVu8eHEmh5Jqom7dMDx01ix44okwZPTXvw4jhAYPhm+/TTpCkZolTvIfDLxtZsPMbBgwAxiUyUHNrAlhpNCuhBPI1mZWXPZ57j7U3YvcvahZs2aZHEqqmVq1QrG4114LI4cOOCCUkGjVKnQeP/bYhs9X6QiRzMQZ7fMA0Al4PLodlGFzD8DRwCfuvtjdfwTGAQdn+F5SA5nBkUfC88+HAnLHHgsvvxwqiPbsGUYNqXSESObiTPI6BFjm7uMJzT8DzGyXDI87D+hsZvXNzAj9Bx9k+F5Sw3XoAKNHw0cfwfHHhzUEdtstjAy66y6VjhDJRJxmn3uAFWa2P3AVMBd4MJODuvsbwFhC09GsKI6hmbyXFI7ddw/loy+/HNxh9erQT3D55SodIRJXnOS/xsOkgJ7AHe4+hA07gGNx9z+6+57uvo+793X3VZm+lxSOkhJ4+OH1pSOOOgruvDOUkr7mmjB/QEQqFyf5LzOza4Bi4Bkzqw3UzU1YIhsrWzpi7Ngwo/iBB6BXL7jlFth1V7jhBq0vLFKZOMn/dGAVcJ67fwHsBNyWk6hEylFR6YgRI+Ddd+Hoo+H668NJ4NZbQ1VREdlY2uUdKn0js9fc/aCsvFk5VN5B0jV9emgWeu452H57uPZa6N8f6tVLOjKRzS8b5R0qs2UW30skYwceGEpKT5kS1ha+9NLQWXzfffDjj0lHJ5Ifspn8Vdtf8sohh8BLL4XFZVq0CFf/7dqFDuO1a5OOTiRZ2Uz+InnHDLp2DTOGn3oKGjSAvn1DOenHHoN165KOUCQZlSZ/M0u3pVSFeCVvmYWqoTNmhE7idevCbOGiotBElKWuL5FqI50r/9cAzOyhSp7Xt+rhiORWrVrQuzfMng0PPhgKxh1/fFhP4MILw3DSVKodJDVVOsl/CzPrBxxcZh3fk83s5NInufvs3IUpkl21a4fmnzlz4N57w3oCQ4fCL34RJo2BagdJzVbpUE8zOxQ4CzgNeLLMw+7u5+Yotg1oqKfk0sqV4SRw/fXwzTehs/jDDzecVyBSHW1qqGecZRzPc/f7sx5ZmpT8ZXNYvjw0Ab3zDuy7L0ybBltskXRUIpnLxjj/h8zsUjMbG90uMTOVd5Aa5c03YcGCUE561izo3FkLyUjNFCf53w0cGN3fTVjP955cBCWShNTaQSUlYUH5t98OC8rMn590dCLZVSfGczu6+/4p2y+Z2cxsBySSlLK1g26+GbbdNpSHOOigMCR0v/2SjVEkW+Jc+a81s91KN8ysDaB5klJjDBiwcefulVeGkwKEvoCJEzd/XCK5ECf5XwWUmNnLZjYJeAn4bW7CEskf++0Hr78eFpPv3h2GZ7p4qUgeSbvZx91fNLPdgbaE2bxzUhdgMbNu7q7rIqmRWraEV16BU06Bc84J8wIGDgwzh0Wqo1i1fdx9lbu/6+4zy1l565YsxiWSd7bZJrT7n302XHddKBSnKqFSXcXp8K2MroGkxttiCxg2DFq1gj//OQwLHTMGGma8oKlIMlTSWSQmM7jxxlAOYuJEOOKIsJqYSHWiks4iGbrgglAm+qOPwlDQ999POiKR9GUz+X8a58lm1jiaKTzHzD4ws5wtASmSK8cdB5Mnw6pVoR7QpElJRySSnrTb/M2sNnA80Dr1de5+e3R/cvmv3KQhwPPufqqZbQHUj/l6kbzQoUNYLKZ7dzjmmDAU9Iwzko5KpGJxOnyfAlYCs4AqrX9kZo2Aw4FzANx9NbC6Ku8pkqTWreHVV6FXL+jTJwwFveoqDQWV/BUn+bd092xNbm8DLAYeMLP9genAZe6+PPVJZtYf6A/QqlWrLB1aJDeaNIEXXgjzAH73O5g7F+64I6wdIJJv4rT5P2dmx2TpuHWICsO5e3tgOXB12Se5+1B3L3L3ombNmmXp0CK5s+WWMHJkuOq/+244+WRYsSLpqEQ2Fif5vw48bmY/mNl3ZrbMzL7L8LgLgAXu/ka0PZZwMhCp9mrVCks/3nknPP10qBe0aFHSUYlsKE7y/ytwEFDf3Ru5e0N3b5TJQd39C2C+mbWNdnUFNFBOapSLLoJx48K6AO3awUNlVsHW+sCSpDjJ/2Ngtqe79FflLgFGmNm7wAHAoCy9r0je6NkzJPk1a6BfP60PLPkjTofvQuBlM3sO+KmuT+lQz7jc/R1go6XFRGqaTp1g+vQwE/iSS+CZZ0KZ6Ecf1frAkpw4yf+T6LZFdBORNP3sZzBzZpgT8PzzoV9gyBD46ivo0QO22irpCKXQxG7BBhkAAAxkSURBVCnpfEMuAxGp6WbNgh9+gPPPhxEjYMoUGD8eGjQIo4LOPBO6doU62Sy3KLIJcWb4llBO8TZ3PyqrEYnUQKnrA3fpEhL9aafBX/8KH3wAY8fCgw9Cs2Zw+unh8c6dNUlMcidOh++VhNW8rgL+ALwDTMtFUCI1Tdn1gbt0Cdtr1sB998EXX8ATT4T9//oXHHwwtGkT1g9+771kY5eayaoyeMfMJrn7EVmMZ5OKiop82jSda6Tm++670Bw0cmQoGb12bVhK8swzQ82gXXZJOkKpTsxsurtvNLgm7St/M2uactvOzI4FdshqlCJCo0bQty889xx89hn84x+w9dZw9dWhhtBhh8E994TOYghzBUpKNnwPzSGQysRp9plOaOaZBkwFfgOcl4ugRCTYfnu4+GKYOhX++1+46SZYsgR+/WvYcUc4/nj49lvo3Xv9CUBzCCQdlTb7mFlHYH40Kxcz6wecQqjff727L8l1kKBmH5FS7mHk0MiR4TZ/PtSrFx7r1QtefHHD/gUpbFVp9rmXqNyymR0O3AwMB74FhmYzSBGpnFnoAxg8GD79FF55BX75y7B/9OhQSO6pp+Ddd5OOVPJZOsm/dsrV/enAUHd/zN3/APwsd6GJSGVq1YJDDw3NPA0ahPs1a0Ip6f33D5PKhgyBxYuTjlTyTVrJ38xK5wN0BV5KeUzTUUQSljqHYPToMIO4ceNQSqJWLbj8cmjRAk46KQwnXa1lk4T0kv8oYJKZjQd+AF4BMLOfEZp+RCRB5c0hePRRaNkSpk0L/QOXXx6WmjzpJNhpp7D9zjvJxi3JSmucv5l1BnYEJpSutmVmewAN3H1GbkMM1OErUjVr1oSVxoYPD/MIVq8OTUP9+sFZZ0Hz5klHKLmwqQ7fKk3y2pyU/EWyZ8kSeOQRGDYsfHOoUycsQN+vXyg0t4VKN9YYVZ7kJSI1R9OmYa7Am2+G8hG/+U04CZxySugfuPRSmDEjDCvVJLKaSclfpMDttRfccgvMmwfPPgtHHw1Dh8KBB4YhpZ98AqeeqklkNY2afURkI0uXhpFDw4fD66+HUUN16kC3bmG28aOPhvLTkv/U5i8iGZkzJ5wE7roLli0L+5o2hUMOCXWGDj00zCconWUs+UVt/iKSkT33hGOOCcn9oovCZLJOneDDD2HAgFB+unHjsEzltdeGgnTffJN01FIZTdISkQqVXYjmlFPWb++9N7z6aliVbMqU0Ak8aFAoNbHvvuFbQelt552T/k0klZp9RKRCt94aOndTC8WVlITRQQMGbPjc5cvDCKLSk8HUqfD99+GxVq02PBnsvTf85S/pv7dkJi/b/M2sNqFE9Gfu3qOi5yr5i1Q/a9aEAnOlJ4MpU2DhwvBY48bQtm2YgTxoEFx4YZiFnPotQ6ouX5P/b4AioJGSv0jN5x6GjqaeDD74IDxWq1a4nXJKmHF88MGw7bbJxlsT5F3yN7OWhNLQNwG/UfIXKUxffRU6kseMCXWHFi2CH38Mj+2114ZNRa1ba1H7uDaV/JPs8P07MABouKknmFl/oD9Aq1atNlNYIrI5zZoFL70Ef/hDWJ7yySehfv313wweeSRMOoMw+zj1ZLDfflC7drLxV1eJJH8z6wEscvfpZnbkpp7n7kOJFowpKiqqHj3TIpK2siOJunRZv/3734fnrF0bSlCUngxeeSU8DtCwIRx00PqTQadO4cRRKk5ndaFJpNnHzG4G+gJrgC2BRsA4dy/e1GvU7CNS82SanOfN27DfYPbs0J9Qp04oS1F6MnCH/v3Xn1zKnmwKQd61+f8UQLjyv1Jt/iKSqaVLw0ih0pPBm2/CqlXhsZYtQ79Cz56Fub5xPrb5i4hkRZMmoSR19+5he9UqmD59/clgwoRQq6hePXjwwbCWwVFHQd26ycadpMSv/NOlK38RyURpU0+3bjBuXOggXrEiDCM99VQ4/XQ4/PCa23Gs2j4iUnBS2/hHjgx1h+rXhxtvDPWKHn44fANo2TKsYTB1Kqxbl3TUm4eSv4jUWOWtbzxmTFipbOTIMKdgzJgwoWzo0FCptHVruPLKsP5xNWkYyYiafUREgO++C3MMRo8Oax3/+CPstltoFjr99FCorjpOMFOzj4hIBRo1guJieOop+PJLuP/+kPxvuSUsdL/33nDDDWF9A6j+y1sq+YuIlNGkCZx7bvgGsHBhmHncvHlI/u3awQEHwEcfVe/lLdXsIyKSps8/h7FjQ8mJ114L++rUCSuavf12aDI65phkYywrbyd5pUvJX0Tyydy5obP4b39bX6Z6q61CuYkjjgjDRzt1CvuSpDZ/EZEs2mUXKCoKHcO/+U3oMzjuOFiyBK6/Powsatw4nAQGDoSJE8NiN/lCM3xFRDJQtk5Qjx7rtw84ICxvOWkSTJ4MgwfDTTetrz10xBHhdsghsM02ycSvZh8RkQzEKUq3bFmYQFZ6MnjzzfCNoVatcKIobSY67LAw8zib1UjV5i8ikidWrIDXXw8ngkmTws8rV4bH9t0X2rQJaxw88EBY2awq1UiV/EVE8tSqVeGqftKkcJs6dX3/wLbbhpITjz2WWTVSdfiKiOSpevXC+gPXXhsqkC5dGr4NdO0KX38d5hxkuwy1kr+ISJ6pWzc0Dc2cGZa3HD5849nEVaXkLyKSZ1Lb+P/0p3B/2mnZPQEo+YuI5JlNVSN9663sHUMdviIiNZg6fEVE5CdK/iIiBUjJX0SkACn5i4gUICV/EZECVG1G+5jZYmBu0nGUYzvgq6SDyJBiT4ZiT0Z1jb2qce/i7s3K7qw2yT9fmdm08oZRVQeKPRmKPRnVNfZcxa1mHxGRAqTkLyJSgJT8q25o0gFUgWJPhmJPRnWNPSdxq81fRKQA6cpfRKQAKfmLiBQgJf8MmdnOZlZiZh+Y2XtmdlnSMcVlZrXN7G0zezrpWOIws8ZmNtbM5kSf/0FJx5QOM7si+r8y28xGmdmWScdUETP7t5ktMrPZKfuamtlEM/s4um+SZIzl2UTct0X/X941s8fNrHGSMW5KebGnPHalmbmZbZeNYyn5Z24N8Ft3bwd0Bi4ys70Sjimuy4APkg4iA0OA5919T2B/qsHvYGY7AZcCRe6+D1AbOCPZqCo1DDi2zL6rgRfdfXfgxWg73wxj47gnAvu4+37AR8A1mzuoNA1j49gxs52BbsC8bB1IyT9D7r7Q3WdEPy8jJKCdko0qfWbWEjge+FfSscRhZo2Aw4H7Adx9tbt/k2xUaasDbGVmdYD6wOcJx1Mhd58MLCmzuycwPPp5ONBrswaVhvLidvcJ7r4m2nwdaLnZA0vDJj5zgL8BA4CsjdBR8s8CM2sNtAfeSDaSWP5O+M+0LulAYmoDLAYeiJqs/mVmWycdVGXc/TPgL4Qrt4XAt+4+IdmoMrK9uy+EcAEENE84nkycCzyXdBDpMrMTgc/cfWY231fJv4rMrAHwGHC5u3+XdDzpMLMewCJ3n550LBmoA3QA7nH39sBy8rPpYQNR23hPYFegBbC1mRUnG1XhMbNrCU22I5KOJR1mVh+4Frgu2++t5F8FZlaXkPhHuPu4pOOJ4RDgRDP7FHgEOMrMHk42pLQtABa4e+m3rLGEk0G+Oxr4xN0Xu/uPwDjg4IRjysSXZrYjQHS/KOF40mZm/YAewFlefSY47Ua4YJgZ/b22BGaY2Q5VfWMl/wyZmRHanT9w99uTjicOd7/G3Vu6e2tCp+NL7l4trkLd/Qtgvpm1jXZ1Bd5PMKR0zQM6m1n96P9OV6pBR3U5ngT6RT/3A8YnGEvazOxY4HfAie6+Iul40uXus9y9ubu3jv5eFwAdor+DKlHyz9whQF/CVfM70a170kEViEuAEWb2LnAAMCjheCoVfVMZC8wAZhH+9vK63ICZjQJeA9qa2QIzOw8YDHQzs48Jo08GJxljeTYR951AQ2Bi9Lf6z0SD3IRNxJ6bY1Wfbz8iIpItuvIXESlASv4iIgVIyV9EpAAp+YuIFCAlfxGRAqTkL5IhM2tdXvVFkepAyV9EpAAp+YtkgZm1iQrNdUw6FpF0KPmLVFFUauIx4Jfu/lbS8Yiko07SAYhUc80I9W1Ocff3kg5GJF268hepmm+B+YRaTyLVhq78RapmNWE1qxfM7Ht3H5l0QCLpUPIXqSJ3Xx4tkDPRzJa7e7UocyyFTVU9RUQKkNr8RUQKkJK/iEgBUvIXESlASv4iIgVIyV9EpAAp+YuIFCAlfxGRAvT/AaS6J8ERqqKtAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(K, Sum_of_squared_distances, 'bx-')\n",
"plt.xlabel('k')\n",
"plt.ylabel('Sum_of_squared_distances')\n",
"plt.title('Elbow Method For Optimal k')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### In this case, the elbow point is k=8, and we run the run k-means to cluster the neighborhood into 8 clusters.\n"
]
},
{
"cell_type": "code",
"execution_count": 180,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 1, 1, 1, 2, 1, 3, 1, 3, 1, 1, 4, 0, 1, 7], dtype=int32)"
]
},
"execution_count": 180,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"obj = KMeans(n_clusters=8, random_state=0).fit(british_columbia_clustering)\n",
"\n",
"obj.labels_[0:15] "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Now, we create a new dataframe that includes the cluster as well as the top 10 venues for each neighborhood.\n"
]
},
{
"cell_type": "code",
"execution_count": 187,
"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>Cluster Labels</th>\n",
" <th>Neighborhood</th>\n",
" <th>1st Most Common Venue</th>\n",
" <th>2nd Most Common Venue</th>\n",
" <th>3rd Most Common Venue</th>\n",
" <th>4th Most Common Venue</th>\n",
" <th>5th Most Common Venue</th>\n",
" <th>6th Most Common Venue</th>\n",
" <th>7th Most Common Venue</th>\n",
" <th>8th Most Common Venue</th>\n",
" <th>9th Most Common Venue</th>\n",
" <th>10th Most Common Venue</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>Abbotsford</td>\n",
" <td>Grocery Store</td>\n",
" <td>Trail</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>Burnaby</td>\n",
" <td>Bus Stop</td>\n",
" <td>Bookstore</td>\n",
" <td>Snack Place</td>\n",
" <td>Park</td>\n",
" <td>Bus Station</td>\n",
" <td>Burger Joint</td>\n",
" <td>Sandwich Place</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Falafel Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1</td>\n",
" <td>Comox</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Pharmacy</td>\n",
" <td>Sandwich Place</td>\n",
" <td>Juice Bar</td>\n",
" <td>Elementary School</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>Coquitlam</td>\n",
" <td>Asian Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Golf Course</td>\n",
" <td>Gas Station</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Zoo</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2</td>\n",
" <td>Cranbrook</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Cluster Labels Neighborhood 1st Most Common Venue \\\n",
"0 1 Abbotsford Grocery Store \n",
"1 1 Burnaby Bus Stop \n",
"2 1 Comox Fast Food Restaurant \n",
"3 1 Coquitlam Asian Restaurant \n",
"4 2 Cranbrook Construction & Landscaping \n",
"\n",
" 2nd Most Common Venue 3rd Most Common Venue 4th Most Common Venue \\\n",
"0 Trail Falafel Restaurant Coffee Shop \n",
"1 Bookstore Snack Place Park \n",
"2 Coffee Shop Pharmacy Sandwich Place \n",
"3 Convenience Store Golf Course Gas Station \n",
"4 Zoo Fast Food Restaurant Convenience Store \n",
"\n",
" 5th Most Common Venue 6th Most Common Venue \\\n",
"0 Construction & Landscaping Convenience Store \n",
"1 Bus Station Burger Joint \n",
"2 Juice Bar Elementary School \n",
"3 Coffee Shop Zoo \n",
"4 Dessert Shop Dim Sum Restaurant \n",
"\n",
" 7th Most Common Venue 8th Most Common Venue 9th Most Common Venue \\\n",
"0 Dessert Shop Dim Sum Restaurant Dog Run \n",
"1 Sandwich Place Coffee Shop Fast Food Restaurant \n",
"2 Construction & Landscaping Convenience Store Dessert Shop \n",
"3 Falafel Restaurant Dessert Shop Dim Sum Restaurant \n",
"4 Dog Run Elementary School Falafel Restaurant \n",
"\n",
" 10th Most Common Venue \n",
"0 Elementary School \n",
"1 Falafel Restaurant \n",
"2 Dim Sum Restaurant \n",
"3 Dog Run \n",
"4 Fish & Chips Shop "
]
},
"execution_count": 187,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#neigh_top_venues.insert(0, 'Cluster Labels', obj.labels_)\n",
"neigh_top_venues['Cluster Labels'] = obj.labels_\n",
"neigh_top_venues.head()"
]
},
{
"cell_type": "code",
"execution_count": 188,
"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>Place</th>\n",
" <th>Code</th>\n",
" <th>Country</th>\n",
" <th>Province</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" <th>Cluster Labels</th>\n",
" <th>1st Most Common Venue</th>\n",
" <th>2nd Most Common Venue</th>\n",
" <th>3rd Most Common Venue</th>\n",
" <th>4th Most Common Venue</th>\n",
" <th>5th Most Common Venue</th>\n",
" <th>6th Most Common Venue</th>\n",
" <th>7th Most Common Venue</th>\n",
" <th>8th Most Common Venue</th>\n",
" <th>9th Most Common Venue</th>\n",
" <th>10th Most Common Venue</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Abbotsford</td>\n",
" <td>V3G</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.0625</td>\n",
" <td>-122.3125</td>\n",
" <td>1.0</td>\n",
" <td>Grocery Store</td>\n",
" <td>Trail</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Atlin Region</td>\n",
" <td>V0W</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>59.6250</td>\n",
" <td>-133.5000</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>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Burnaby</td>\n",
" <td>V3N</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.2500</td>\n",
" <td>-123.0000</td>\n",
" <td>1.0</td>\n",
" <td>Bus Stop</td>\n",
" <td>Bookstore</td>\n",
" <td>Snack Place</td>\n",
" <td>Park</td>\n",
" <td>Bus Station</td>\n",
" <td>Burger Joint</td>\n",
" <td>Sandwich Place</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Falafel Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Campbell River Central</td>\n",
" <td>V9W</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>50.0000</td>\n",
" <td>-125.5625</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>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Cariboo and West Okanagan</td>\n",
" <td>V0K</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>51.4375</td>\n",
" <td>-121.6250</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>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",
"</div>"
],
"text/plain": [
" Place Code Country Province Latitude \\\n",
"0 Abbotsford V3G Canada British Columbia 49.0625 \n",
"1 Atlin Region V0W Canada British Columbia 59.6250 \n",
"2 Burnaby V3N Canada British Columbia 49.2500 \n",
"3 Campbell River Central V9W Canada British Columbia 50.0000 \n",
"4 Cariboo and West Okanagan V0K Canada British Columbia 51.4375 \n",
"\n",
" Longitude Cluster Labels 1st Most Common Venue 2nd Most Common Venue \\\n",
"0 -122.3125 1.0 Grocery Store Trail \n",
"1 -133.5000 NaN NaN NaN \n",
"2 -123.0000 1.0 Bus Stop Bookstore \n",
"3 -125.5625 NaN NaN NaN \n",
"4 -121.6250 NaN NaN NaN \n",
"\n",
" 3rd Most Common Venue 4th Most Common Venue 5th Most Common Venue \\\n",
"0 Falafel Restaurant Coffee Shop Construction & Landscaping \n",
"1 NaN NaN NaN \n",
"2 Snack Place Park Bus Station \n",
"3 NaN NaN NaN \n",
"4 NaN NaN NaN \n",
"\n",
" 6th Most Common Venue 7th Most Common Venue 8th Most Common Venue \\\n",
"0 Convenience Store Dessert Shop Dim Sum Restaurant \n",
"1 NaN NaN NaN \n",
"2 Burger Joint Sandwich Place Coffee Shop \n",
"3 NaN NaN NaN \n",
"4 NaN NaN NaN \n",
"\n",
" 9th Most Common Venue 10th Most Common Venue \n",
"0 Dog Run Elementary School \n",
"1 NaN NaN \n",
"2 Fast Food Restaurant Falafel Restaurant \n",
"3 NaN NaN \n",
"4 NaN NaN "
]
},
"execution_count": 188,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"clustered_df = df_new\n",
"clustered_df = clustered_df.join(neigh_top_venues.set_index('Neighborhood'), on='Place')\n",
"clustered_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 189,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(72, 6)\n"
]
}
],
"source": [
"clustered_df.dropna(subset = [\"Cluster Labels\"], inplace=True)\n",
"print(df_new.shape)\n",
"clustered_df = clustered_df.astype({\"Cluster Labels\": int})"
]
},
{
"cell_type": "code",
"execution_count": 190,
"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>Place</th>\n",
" <th>Code</th>\n",
" <th>Country</th>\n",
" <th>Province</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" <th>Cluster Labels</th>\n",
" <th>1st Most Common Venue</th>\n",
" <th>2nd Most Common Venue</th>\n",
" <th>3rd Most Common Venue</th>\n",
" <th>4th Most Common Venue</th>\n",
" <th>5th Most Common Venue</th>\n",
" <th>6th Most Common Venue</th>\n",
" <th>7th Most Common Venue</th>\n",
" <th>8th Most Common Venue</th>\n",
" <th>9th Most Common Venue</th>\n",
" <th>10th Most Common Venue</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Abbotsford</td>\n",
" <td>V3G</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.06250</td>\n",
" <td>-122.3125</td>\n",
" <td>1</td>\n",
" <td>Grocery Store</td>\n",
" <td>Trail</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Burnaby</td>\n",
" <td>V3N</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.25000</td>\n",
" <td>-123.0000</td>\n",
" <td>1</td>\n",
" <td>Bus Stop</td>\n",
" <td>Bookstore</td>\n",
" <td>Snack Place</td>\n",
" <td>Park</td>\n",
" <td>Bus Station</td>\n",
" <td>Burger Joint</td>\n",
" <td>Sandwich Place</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Falafel Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Comox</td>\n",
" <td>V9M</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.68750</td>\n",
" <td>-124.9375</td>\n",
" <td>1</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Pharmacy</td>\n",
" <td>Sandwich Place</td>\n",
" <td>Juice Bar</td>\n",
" <td>Elementary School</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Coquitlam</td>\n",
" <td>V3J</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.25000</td>\n",
" <td>-122.8750</td>\n",
" <td>1</td>\n",
" <td>Asian Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Golf Course</td>\n",
" <td>Gas Station</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Zoo</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Cranbrook</td>\n",
" <td>V1C</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.50000</td>\n",
" <td>-115.7500</td>\n",
" <td>2</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Duncan</td>\n",
" <td>V9L</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.78125</td>\n",
" <td>-123.6875</td>\n",
" <td>1</td>\n",
" <td>Convenience Store</td>\n",
" <td>Gas Station</td>\n",
" <td>Dog Run</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Esquimalt</td>\n",
" <td>V9A</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.43750</td>\n",
" <td>-123.4375</td>\n",
" <td>3</td>\n",
" <td>Boat or Ferry</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Zoo</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Fort St. John</td>\n",
" <td>V1J</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>56.25000</td>\n",
" <td>-120.8750</td>\n",
" <td>1</td>\n",
" <td>American Restaurant</td>\n",
" <td>Gas Station</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Highlands</td>\n",
" <td>V9B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.46875</td>\n",
" <td>-123.5000</td>\n",
" <td>3</td>\n",
" <td>Zoo</td>\n",
" <td>Theme Park</td>\n",
" <td>Boat or Ferry</td>\n",
" <td>Wine Shop</td>\n",
" <td>Auto Workshop</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Kelowna Central</td>\n",
" <td>V1Y</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.90625</td>\n",
" <td>-119.4375</td>\n",
" <td>1</td>\n",
" <td>Park</td>\n",
" <td>Mountain</td>\n",
" <td>Zoo</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>Kimberley</td>\n",
" <td>V1A</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.68750</td>\n",
" <td>-116.0000</td>\n",
" <td>1</td>\n",
" <td>American Restaurant</td>\n",
" <td>Ski Lodge</td>\n",
" <td>Hotel</td>\n",
" <td>Ski Area</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Kitimat</td>\n",
" <td>V8C</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>54.06250</td>\n",
" <td>-128.6250</td>\n",
" <td>4</td>\n",
" <td>Business Service</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>Langley City</td>\n",
" <td>V3A</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.09375</td>\n",
" <td>-122.5625</td>\n",
" <td>0</td>\n",
" <td>Baseball Field</td>\n",
" <td>Zoo</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Nanaimo Central</td>\n",
" <td>V9S</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.18750</td>\n",
" <td>-124.0000</td>\n",
" <td>1</td>\n",
" <td>Tourist Information Center</td>\n",
" <td>Brewery</td>\n",
" <td>Zoo</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Nelson</td>\n",
" <td>V1L</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.50000</td>\n",
" <td>-117.3125</td>\n",
" <td>7</td>\n",
" <td>Trail</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>New Westminster Northeast</td>\n",
" <td>V3L</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.18750</td>\n",
" <td>-122.8750</td>\n",
" <td>1</td>\n",
" <td>Hot Dog Joint</td>\n",
" <td>Garden</td>\n",
" <td>Playground</td>\n",
" <td>Zoo</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>Oak Bay</td>\n",
" <td>V8R</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.43750</td>\n",
" <td>-123.3125</td>\n",
" <td>1</td>\n",
" <td>Gym</td>\n",
" <td>Bookstore</td>\n",
" <td>Gift Shop</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Men's Store</td>\n",
" <td>Breakfast Spot</td>\n",
" <td>Café</td>\n",
" <td>Bakery</td>\n",
" <td>Toy / Game Store</td>\n",
" <td>Bank</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>Parksville</td>\n",
" <td>V9P</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.31250</td>\n",
" <td>-124.3125</td>\n",
" <td>1</td>\n",
" <td>Bookstore</td>\n",
" <td>Home Service</td>\n",
" <td>Zoo</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>Pitt Meadows</td>\n",
" <td>V3Y</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.21875</td>\n",
" <td>-122.6875</td>\n",
" <td>1</td>\n",
" <td>Gym / Fitness Center</td>\n",
" <td>Plaza</td>\n",
" <td>Elementary School</td>\n",
" <td>Pub</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>Qualicum Beach</td>\n",
" <td>V9K</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.34375</td>\n",
" <td>-124.4375</td>\n",
" <td>1</td>\n",
" <td>American Restaurant</td>\n",
" <td>Restaurant</td>\n",
" <td>Pharmacy</td>\n",
" <td>Grocery Store</td>\n",
" <td>Gastropub</td>\n",
" <td>Gas Station</td>\n",
" <td>Garden</td>\n",
" <td>Fried Chicken Joint</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>Richmond</td>\n",
" <td>V7B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.15625</td>\n",
" <td>-123.1250</td>\n",
" <td>1</td>\n",
" <td>Gym</td>\n",
" <td>Grocery Store</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Sushi Restaurant</td>\n",
" <td>Pizza Place</td>\n",
" <td>Sandwich Place</td>\n",
" <td>Pub</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Indian Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>Saanich Central</td>\n",
" <td>V8Z</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.50000</td>\n",
" <td>-123.3750</td>\n",
" <td>6</td>\n",
" <td>Bank</td>\n",
" <td>Zoo</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>Salmon Arm</td>\n",
" <td>V1E</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>50.68750</td>\n",
" <td>-119.2500</td>\n",
" <td>2</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>Sooke</td>\n",
" <td>V9Z</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.37500</td>\n",
" <td>-123.7500</td>\n",
" <td>2</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>South Okanagan</td>\n",
" <td>V0H</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.40625</td>\n",
" <td>-119.0000</td>\n",
" <td>2</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>Surrey</td>\n",
" <td>V3Z</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.12500</td>\n",
" <td>-122.8125</td>\n",
" <td>1</td>\n",
" <td>Recreation Center</td>\n",
" <td>Auto Workshop</td>\n",
" <td>Zoo</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>Terrace</td>\n",
" <td>V8G</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>54.53125</td>\n",
" <td>-128.6250</td>\n",
" <td>2</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>Trail</td>\n",
" <td>V1R</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.09375</td>\n",
" <td>-117.6875</td>\n",
" <td>5</td>\n",
" <td>Pub</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Zoo</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>Vancouver</td>\n",
" <td>V5K</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.25000</td>\n",
" <td>-123.1250</td>\n",
" <td>1</td>\n",
" <td>Bank</td>\n",
" <td>Sushi Restaurant</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Park</td>\n",
" <td>Gym</td>\n",
" <td>Sandwich Place</td>\n",
" <td>Greek Restaurant</td>\n",
" <td>Grocery Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Liquor Store</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>Victoria Central British Columbia Provincial G...</td>\n",
" <td>V8W</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>48.43750</td>\n",
" <td>-123.3750</td>\n",
" <td>1</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Brewery</td>\n",
" <td>Restaurant</td>\n",
" <td>Motorcycle Shop</td>\n",
" <td>Sandwich Place</td>\n",
" <td>Gym</td>\n",
" <td>Gastropub</td>\n",
" <td>Fried Chicken Joint</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <td>Whistler</td>\n",
" <td>V8E</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>50.12500</td>\n",
" <td>-122.9375</td>\n",
" <td>1</td>\n",
" <td>Hotel</td>\n",
" <td>Vacation Rental</td>\n",
" <td>Beach</td>\n",
" <td>Lake</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31</th>\n",
" <td>White Rock</td>\n",
" <td>V4B</td>\n",
" <td>Canada</td>\n",
" <td>British Columbia</td>\n",
" <td>49.03125</td>\n",
" <td>-122.8125</td>\n",
" <td>1</td>\n",
" <td>Park</td>\n",
" <td>Gym / Fitness Center</td>\n",
" <td>Athletics &amp; Sports</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Place Code Country \\\n",
"0 Abbotsford V3G Canada \n",
"1 Burnaby V3N Canada \n",
"2 Comox V9M Canada \n",
"3 Coquitlam V3J Canada \n",
"4 Cranbrook V1C Canada \n",
"5 Duncan V9L Canada \n",
"6 Esquimalt V9A Canada \n",
"7 Fort St. John V1J Canada \n",
"8 Highlands V9B Canada \n",
"9 Kelowna Central V1Y Canada \n",
"10 Kimberley V1A Canada \n",
"11 Kitimat V8C Canada \n",
"12 Langley City V3A Canada \n",
"13 Nanaimo Central V9S Canada \n",
"14 Nelson V1L Canada \n",
"15 New Westminster Northeast V3L Canada \n",
"16 Oak Bay V8R Canada \n",
"17 Parksville V9P Canada \n",
"18 Pitt Meadows V3Y Canada \n",
"19 Qualicum Beach V9K Canada \n",
"20 Richmond V7B Canada \n",
"21 Saanich Central V8Z Canada \n",
"22 Salmon Arm V1E Canada \n",
"23 Sooke V9Z Canada \n",
"24 South Okanagan V0H Canada \n",
"25 Surrey V3Z Canada \n",
"26 Terrace V8G Canada \n",
"27 Trail V1R Canada \n",
"28 Vancouver V5K Canada \n",
"29 Victoria Central British Columbia Provincial G... V8W Canada \n",
"30 Whistler V8E Canada \n",
"31 White Rock V4B Canada \n",
"\n",
" Province Latitude Longitude Cluster Labels \\\n",
"0 British Columbia 49.06250 -122.3125 1 \n",
"1 British Columbia 49.25000 -123.0000 1 \n",
"2 British Columbia 49.68750 -124.9375 1 \n",
"3 British Columbia 49.25000 -122.8750 1 \n",
"4 British Columbia 49.50000 -115.7500 2 \n",
"5 British Columbia 48.78125 -123.6875 1 \n",
"6 British Columbia 48.43750 -123.4375 3 \n",
"7 British Columbia 56.25000 -120.8750 1 \n",
"8 British Columbia 48.46875 -123.5000 3 \n",
"9 British Columbia 49.90625 -119.4375 1 \n",
"10 British Columbia 49.68750 -116.0000 1 \n",
"11 British Columbia 54.06250 -128.6250 4 \n",
"12 British Columbia 49.09375 -122.5625 0 \n",
"13 British Columbia 49.18750 -124.0000 1 \n",
"14 British Columbia 49.50000 -117.3125 7 \n",
"15 British Columbia 49.18750 -122.8750 1 \n",
"16 British Columbia 48.43750 -123.3125 1 \n",
"17 British Columbia 49.31250 -124.3125 1 \n",
"18 British Columbia 49.21875 -122.6875 1 \n",
"19 British Columbia 49.34375 -124.4375 1 \n",
"20 British Columbia 49.15625 -123.1250 1 \n",
"21 British Columbia 48.50000 -123.3750 6 \n",
"22 British Columbia 50.68750 -119.2500 2 \n",
"23 British Columbia 48.37500 -123.7500 2 \n",
"24 British Columbia 49.40625 -119.0000 2 \n",
"25 British Columbia 49.12500 -122.8125 1 \n",
"26 British Columbia 54.53125 -128.6250 2 \n",
"27 British Columbia 49.09375 -117.6875 5 \n",
"28 British Columbia 49.25000 -123.1250 1 \n",
"29 British Columbia 48.43750 -123.3750 1 \n",
"30 British Columbia 50.12500 -122.9375 1 \n",
"31 British Columbia 49.03125 -122.8125 1 \n",
"\n",
" 1st Most Common Venue 2nd Most Common Venue 3rd Most Common Venue \\\n",
"0 Grocery Store Trail Falafel Restaurant \n",
"1 Bus Stop Bookstore Snack Place \n",
"2 Fast Food Restaurant Coffee Shop Pharmacy \n",
"3 Asian Restaurant Convenience Store Golf Course \n",
"4 Construction & Landscaping Zoo Fast Food Restaurant \n",
"5 Convenience Store Gas Station Dog Run \n",
"6 Boat or Ferry Fish & Chips Shop Convenience Store \n",
"7 American Restaurant Gas Station Fast Food Restaurant \n",
"8 Zoo Theme Park Boat or Ferry \n",
"9 Park Mountain Zoo \n",
"10 American Restaurant Ski Lodge Hotel \n",
"11 Business Service Zoo Fast Food Restaurant \n",
"12 Baseball Field Zoo Fish & Chips Shop \n",
"13 Tourist Information Center Brewery Zoo \n",
"14 Trail Zoo Fast Food Restaurant \n",
"15 Hot Dog Joint Garden Playground \n",
"16 Gym Bookstore Gift Shop \n",
"17 Bookstore Home Service Zoo \n",
"18 Gym / Fitness Center Plaza Elementary School \n",
"19 American Restaurant Restaurant Pharmacy \n",
"20 Gym Grocery Store Dim Sum Restaurant \n",
"21 Bank Zoo Fish & Chips Shop \n",
"22 Construction & Landscaping Zoo Fast Food Restaurant \n",
"23 Construction & Landscaping Zoo Fast Food Restaurant \n",
"24 Construction & Landscaping Zoo Fast Food Restaurant \n",
"25 Recreation Center Auto Workshop Zoo \n",
"26 Construction & Landscaping Zoo Fast Food Restaurant \n",
"27 Pub Falafel Restaurant Coffee Shop \n",
"28 Bank Sushi Restaurant Coffee Shop \n",
"29 Coffee Shop Brewery Restaurant \n",
"30 Hotel Vacation Rental Beach \n",
"31 Park Gym / Fitness Center Athletics & Sports \n",
"\n",
" 4th Most Common Venue 5th Most Common Venue \\\n",
"0 Coffee Shop Construction & Landscaping \n",
"1 Park Bus Station \n",
"2 Sandwich Place Juice Bar \n",
"3 Gas Station Coffee Shop \n",
"4 Convenience Store Dessert Shop \n",
"5 Zoo Fast Food Restaurant \n",
"6 Dessert Shop Dim Sum Restaurant \n",
"7 Construction & Landscaping Convenience Store \n",
"8 Wine Shop Auto Workshop \n",
"9 Falafel Restaurant Convenience Store \n",
"10 Ski Area Construction & Landscaping \n",
"11 Convenience Store Dessert Shop \n",
"12 Convenience Store Dessert Shop \n",
"13 Falafel Restaurant Construction & Landscaping \n",
"14 Construction & Landscaping Convenience Store \n",
"15 Zoo Falafel Restaurant \n",
"16 Fish & Chips Shop Men's Store \n",
"17 Convenience Store Dessert Shop \n",
"18 Pub Coffee Shop \n",
"19 Grocery Store Gastropub \n",
"20 Sushi Restaurant Pizza Place \n",
"21 Convenience Store Dessert Shop \n",
"22 Convenience Store Dessert Shop \n",
"23 Convenience Store Dessert Shop \n",
"24 Convenience Store Dessert Shop \n",
"25 Falafel Restaurant Construction & Landscaping \n",
"26 Convenience Store Dessert Shop \n",
"27 Construction & Landscaping Convenience Store \n",
"28 Park Gym \n",
"29 Motorcycle Shop Sandwich Place \n",
"30 Lake Zoo \n",
"31 Zoo Fast Food Restaurant \n",
"\n",
" 6th Most Common Venue 7th Most Common Venue \\\n",
"0 Convenience Store Dessert Shop \n",
"1 Burger Joint Sandwich Place \n",
"2 Elementary School Construction & Landscaping \n",
"3 Zoo Falafel Restaurant \n",
"4 Dim Sum Restaurant Dog Run \n",
"5 Construction & Landscaping Dessert Shop \n",
"6 Dog Run Elementary School \n",
"7 Dessert Shop Dim Sum Restaurant \n",
"8 Fish & Chips Shop Dessert Shop \n",
"9 Dessert Shop Dim Sum Restaurant \n",
"10 Convenience Store Dessert Shop \n",
"11 Dim Sum Restaurant Dog Run \n",
"12 Dim Sum Restaurant Dog Run \n",
"13 Convenience Store Dessert Shop \n",
"14 Dessert Shop Dim Sum Restaurant \n",
"15 Construction & Landscaping Convenience Store \n",
"16 Breakfast Spot Café \n",
"17 Dim Sum Restaurant Dog Run \n",
"18 Construction & Landscaping Convenience Store \n",
"19 Gas Station Garden \n",
"20 Sandwich Place Pub \n",
"21 Dim Sum Restaurant Dog Run \n",
"22 Dim Sum Restaurant Dog Run \n",
"23 Dim Sum Restaurant Dog Run \n",
"24 Dim Sum Restaurant Dog Run \n",
"25 Convenience Store Dessert Shop \n",
"26 Dim Sum Restaurant Dog Run \n",
"27 Dessert Shop Dim Sum Restaurant \n",
"28 Sandwich Place Greek Restaurant \n",
"29 Gym Gastropub \n",
"30 Fast Food Restaurant Convenience Store \n",
"31 Convenience Store Dessert Shop \n",
"\n",
" 8th Most Common Venue 9th Most Common Venue 10th Most Common Venue \n",
"0 Dim Sum Restaurant Dog Run Elementary School \n",
"1 Coffee Shop Fast Food Restaurant Falafel Restaurant \n",
"2 Convenience Store Dessert Shop Dim Sum Restaurant \n",
"3 Dessert Shop Dim Sum Restaurant Dog Run \n",
"4 Elementary School Falafel Restaurant Fish & Chips Shop \n",
"5 Dim Sum Restaurant Elementary School Falafel Restaurant \n",
"6 Falafel Restaurant Fast Food Restaurant Zoo \n",
"7 Dog Run Elementary School Falafel Restaurant \n",
"8 Dim Sum Restaurant Dog Run Elementary School \n",
"9 Dog Run Elementary School Fast Food Restaurant \n",
"10 Dim Sum Restaurant Dog Run Elementary School \n",
"11 Elementary School Falafel Restaurant Fish & Chips Shop \n",
"12 Elementary School Falafel Restaurant Fast Food Restaurant \n",
"13 Dim Sum Restaurant Dog Run Elementary School \n",
"14 Dog Run Elementary School Falafel Restaurant \n",
"15 Dessert Shop Dim Sum Restaurant Dog Run \n",
"16 Bakery Toy / Game Store Bank \n",
"17 Elementary School Falafel Restaurant Fast Food Restaurant \n",
"18 Dessert Shop Dim Sum Restaurant Dog Run \n",
"19 Fried Chicken Joint Fish & Chips Shop Fast Food Restaurant \n",
"20 Fast Food Restaurant Falafel Restaurant Indian Restaurant \n",
"21 Elementary School Falafel Restaurant Fast Food Restaurant \n",
"22 Elementary School Falafel Restaurant Fish & Chips Shop \n",
"23 Elementary School Falafel Restaurant Fish & Chips Shop \n",
"24 Elementary School Falafel Restaurant Fish & Chips Shop \n",
"25 Dim Sum Restaurant Dog Run Elementary School \n",
"26 Elementary School Falafel Restaurant Fish & Chips Shop \n",
"27 Dog Run Elementary School Zoo \n",
"28 Grocery Store Dessert Shop Liquor Store \n",
"29 Fried Chicken Joint Fish & Chips Shop Fast Food Restaurant \n",
"30 Dessert Shop Dim Sum Restaurant Dog Run \n",
"31 Dim Sum Restaurant Dog Run Elementary School "
]
},
"execution_count": 190,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"clustered_df.reset_index(inplace = True, drop = True)\n",
"clustered_df"
]
},
{
"cell_type": "code",
"execution_count": 191,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1 20\n",
"2 5\n",
"3 2\n",
"7 1\n",
"6 1\n",
"5 1\n",
"4 1\n",
"0 1\n",
"Name: Cluster Labels, dtype: int64"
]
},
"execution_count": 191,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"clustered_df['Cluster Labels'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 192,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The clustered neighborhoods of British Columbia are: 55.001251 , -125.002441\n"
]
}
],
"source": [
"print(\"The clustered neighborhoods of British Columbia are: {} , {}\".format(lat,long))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Finally, visualizing the resulting cluster onto the British Columbia map using Folium.\n"
]
},
{
"cell_type": "code",
"execution_count": 204,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMmVlZWViNGYwZmNlNDI2N2I1NDkxZTRlMjA4OGRiYjYgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzJlZWVlYjRmMGZjZTQyNjdiNTQ5MWU0ZTIwODhkYmI2IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8yZWVlZWI0ZjBmY2U0MjY3YjU0OTFlNGUyMDg4ZGJiNiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8yZWVlZWI0ZjBmY2U0MjY3YjU0OTFlNGUyMDg4ZGJiNicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTUuMDAxMjUxLC0xMjUuMDAyNDQxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzAwMGYzYzMxYzdhZTRlZDM4YmU2YmNmN2NhMDgxZDM4ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlZWVlYjRmMGZjZTQyNjdiNTQ5MWU0ZTIwODhkYmI2KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82OGIwOGI4ZmIzYTE0MDZhYWI2NDE0NmVjYTk5NWUwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjA2MjUsLTEyMi4zMTI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlZWVlYjRmMGZjZTQyNjdiNTQ5MWU0ZTIwODhkYmI2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E5NGE2Zjg3OGVhNjRjYTdhZTk0MDM1YWFmNDM5NmNjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M2OTlkZjI1ZTQ5OTQ3ZDg5NmIxY2YxMTBmN2M2MzQ5ID0gJCgnPGRpdiBpZD0iaHRtbF9jNjk5ZGYyNWU0OTk0N2Q4OTZiMWNmMTEwZjdjNjM0OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWJib3RzZm9yZCBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E5NGE2Zjg3OGVhNjRjYTdhZTk0MDM1YWFmNDM5NmNjLnNldENvbnRlbnQoaHRtbF9jNjk5ZGYyNWU0OTk0N2Q4OTZiMWNmMTEwZjdjNjM0OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82OGIwOGI4ZmIzYTE0MDZhYWI2NDE0NmVjYTk5NWUwZS5iaW5kUG9wdXAocG9wdXBfYTk0YTZmODc4ZWE2NGNhN2FlOTQwMzVhYWY0Mzk2Y2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDNkNThhYjNlODU5NDczNGJmMmI5YTAyZWU0NzZjMjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS4yNSwtMTIzLjBdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmVlZWViNGYwZmNlNDI2N2I1NDkxZTRlMjA4OGRiYjYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjBiMTI4NmUxNmE1NDBiNjkzMjExMWQxYmU1MzBmMzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDE0ZWNiOGEzOTUwNGEwMTkzYjZmNzk4NjQyYzMxNGUgPSAkKCc8ZGl2IGlkPSJodG1sX2QxNGVjYjhhMzk1MDRhMDE5M2I2Zjc5ODY0MmMzMTRlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXJuYWJ5IENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjBiMTI4NmUxNmE1NDBiNjkzMjExMWQxYmU1MzBmMzguc2V0Q29udGVudChodG1sX2QxNGVjYjhhMzk1MDRhMDE5M2I2Zjc5ODY0MmMzMTRlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAzZDU4YWIzZTg1OTQ3MzRiZjJiOWEwMmVlNDc2YzI1LmJpbmRQb3B1cChwb3B1cF8yMGIxMjg2ZTE2YTU0MGI2OTMyMTExZDFiZTUzMGYzOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNWEyMmM5MzBlOTA0MTA3ODczMjI2M2EyZGQzMjUwZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjY4NzUsLTEyNC45Mzc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlZWVlYjRmMGZjZTQyNjdiNTQ5MWU0ZTIwODhkYmI2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc3OGVhMmU1NjkxZTRjNjI5OGY2NWU4NzE2MTQyYTUwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEwNjM2YjFjMTU0MjQ5NzliMWQzNTMyMDBjZGU3YTEzID0gJCgnPGRpdiBpZD0iaHRtbF8xMDYzNmIxYzE1NDI0OTc5YjFkMzUzMjAwY2RlN2ExMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29tb3ggQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NzhlYTJlNTY5MWU0YzYyOThmNjVlODcxNjE0MmE1MC5zZXRDb250ZW50KGh0bWxfMTA2MzZiMWMxNTQyNDk3OWIxZDM1MzIwMGNkZTdhMTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjVhMjJjOTMwZTkwNDEwNzg3MzIyNjNhMmRkMzI1MGYuYmluZFBvcHVwKHBvcHVwXzc3OGVhMmU1NjkxZTRjNjI5OGY2NWU4NzE2MTQyYTUwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg5OWZmMzYwYjdhYTQyYzNhMDZhNTc0YjU1M2YwMGU5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuMjUsLTEyMi44NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmVlZWViNGYwZmNlNDI2N2I1NDkxZTRlMjA4OGRiYjYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWUxYjM0YzA1MjAwNDkzNDg4MTZhOTI5Y2NlZjIwYmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDdhM2IyZmY4MGQ2NDM5Mzk5OTBkNGVlMWRkODU2OTEgPSAkKCc8ZGl2IGlkPSJodG1sXzA3YTNiMmZmODBkNjQzOTM5OTkwZDRlZTFkZDg1NjkxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db3F1aXRsYW0gQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZTFiMzRjMDUyMDA0OTM0ODgxNmE5MjljY2VmMjBiZC5zZXRDb250ZW50KGh0bWxfMDdhM2IyZmY4MGQ2NDM5Mzk5OTBkNGVlMWRkODU2OTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODk5ZmYzNjBiN2FhNDJjM2EwNmE1NzRiNTUzZjAwZTkuYmluZFBvcHVwKHBvcHVwXzVlMWIzNGMwNTIwMDQ5MzQ4ODE2YTkyOWNjZWYyMGJkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhiMjM0ZGQ1NzJmMTRmZDM4NGQ1OWFmZjY3OWVkNDBhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuNSwtMTE1Ljc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzODZkZjkiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzg2ZGY5IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlZWVlYjRmMGZjZTQyNjdiNTQ5MWU0ZTIwODhkYmI2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg2YTdmNGM2ZjliZjQ3MjlhMmNhOWRmZWEwOWM1YmY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q1ODQ5ZGIyZjgxZDQ0MTk5OTdlOWVhZDhkNGY2ODgxID0gJCgnPGRpdiBpZD0iaHRtbF9kNTg0OWRiMmY4MWQ0NDE5OTk3ZTllYWQ4ZDRmNjg4MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3JhbmJyb29rIENsdXN0ZXIgMjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODZhN2Y0YzZmOWJmNDcyOWEyY2E5ZGZlYTA5YzViZjYuc2V0Q29udGVudChodG1sX2Q1ODQ5ZGIyZjgxZDQ0MTk5OTdlOWVhZDhkNGY2ODgxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhiMjM0ZGQ1NzJmMTRmZDM4NGQ1OWFmZjY3OWVkNDBhLmJpbmRQb3B1cChwb3B1cF84NmE3ZjRjNmY5YmY0NzI5YTJjYTlkZmVhMDljNWJmNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YmNhZGRmOTdjOTE0YjVkOTdiM2M3MzRiMWNiMGRhNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ4Ljc4MTI1LC0xMjMuNjg3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZWVlZWI0ZjBmY2U0MjY3YjU0OTFlNGUyMDg4ZGJiNik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYjNjYzgzZDA0Njk0Y2VhYjM5OTU0MmI1YTkwODQzYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YjAxZGEyYjUzNTU0OTAwOGMzNzlmZjYxMmJkMTUwNCA9ICQoJzxkaXYgaWQ9Imh0bWxfNWIwMWRhMmI1MzU1NDkwMDhjMzc5ZmY2MTJiZDE1MDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkR1bmNhbiBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RiM2NjODNkMDQ2OTRjZWFiMzk5NTQyYjVhOTA4NDNhLnNldENvbnRlbnQoaHRtbF81YjAxZGEyYjUzNTU0OTAwOGMzNzlmZjYxMmJkMTUwNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YmNhZGRmOTdjOTE0YjVkOTdiM2M3MzRiMWNiMGRhNy5iaW5kUG9wdXAocG9wdXBfZGIzY2M4M2QwNDY5NGNlYWIzOTk1NDJiNWE5MDg0M2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGNjOTc0ZGNiNjUxNGEwOGJmY2IyYWEwNjlmM2Y4OTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OC40Mzc1LC0xMjMuNDM3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMTJjOGU2IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyYzhlNiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZWVlZWI0ZjBmY2U0MjY3YjU0OTFlNGUyMDg4ZGJiNik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MmRkNTc0OWRmMDk0MDkwODYwY2QxZTczZTg4Nzk4MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zODc3YjgxNzIyOTQ0ZTIyODk2YTk2MmM0MjczYjJmOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzg3N2I4MTcyMjk0NGUyMjg5NmE5NjJjNDI3M2IyZjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVzcXVpbWFsdCBDbHVzdGVyIDM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYyZGQ1NzQ5ZGYwOTQwOTA4NjBjZDFlNzNlODg3OTgzLnNldENvbnRlbnQoaHRtbF8zODc3YjgxNzIyOTQ0ZTIyODk2YTk2MmM0MjczYjJmOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80Y2M5NzRkY2I2NTE0YTA4YmZjYjJhYTA2OWYzZjg5Ni5iaW5kUG9wdXAocG9wdXBfNjJkZDU3NDlkZjA5NDA5MDg2MGNkMWU3M2U4ODc5ODMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODhlYWMwZGI1MmYzNDkzNDk0ZGZmMTJjYjM3YTIwYTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1Ni4yNSwtMTIwLjg3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZWVlZWI0ZjBmY2U0MjY3YjU0OTFlNGUyMDg4ZGJiNik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kY2E3NThjYTc5MWU0OTlkYjI5NmNiZjM2MTBjYjBhZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMGY3YWY5ZTc1MTA0NTAyOWU4YmM3ZGI1MjZmZjU4MCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTBmN2FmOWU3NTEwNDUwMjllOGJjN2RiNTI2ZmY1ODAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgU3QuIEpvaG4gQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kY2E3NThjYTc5MWU0OTlkYjI5NmNiZjM2MTBjYjBhZi5zZXRDb250ZW50KGh0bWxfMTBmN2FmOWU3NTEwNDUwMjllOGJjN2RiNTI2ZmY1ODApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODhlYWMwZGI1MmYzNDkzNDk0ZGZmMTJjYjM3YTIwYTMuYmluZFBvcHVwKHBvcHVwX2RjYTc1OGNhNzkxZTQ5OWRiMjk2Y2JmMzYxMGNiMGFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MwYmNkZmJhNjg3NTRhZmFiZDhmY2FjMTczYmE2Y2M4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDguNDY4NzUsLTEyMy41XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMxMmM4ZTYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTJjOGU2IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlZWVlYjRmMGZjZTQyNjdiNTQ5MWU0ZTIwODhkYmI2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU1MmE1MmEwNGUyMzRkZjlhYThlZmI5MGE3Zjc1ZTM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ1YWJhZDdjMGY3NjQ4MWM5NmM4ZmIyYjBjZDUyMGRmID0gJCgnPGRpdiBpZD0iaHRtbF80NWFiYWQ3YzBmNzY0ODFjOTZjOGZiMmIwY2Q1MjBkZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGlnaGxhbmRzIENsdXN0ZXIgMzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTUyYTUyYTA0ZTIzNGRmOWFhOGVmYjkwYTdmNzVlMzkuc2V0Q29udGVudChodG1sXzQ1YWJhZDdjMGY3NjQ4MWM5NmM4ZmIyYjBjZDUyMGRmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MwYmNkZmJhNjg3NTRhZmFiZDhmY2FjMTczYmE2Y2M4LmJpbmRQb3B1cChwb3B1cF81NTJhNTJhMDRlMjM0ZGY5YWE4ZWZiOTBhN2Y3NWUzOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZGFmMmVmNjc4YjI0YjUzODU1MGEyYzM4M2VjZjg1YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkwNjI1LC0xMTkuNDM3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZWVlZWI0ZjBmY2U0MjY3YjU0OTFlNGUyMDg4ZGJiNik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MjU1NTJiMTNjMDg0ZjljYWIxMGUxNTVlYWJkMzQ2MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNTExNzIyMmYxZWQ0MDE1ODkwNTQ0M2U4MDdmN2RmNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjUxMTcyMjJmMWVkNDAxNTg5MDU0NDNlODA3ZjdkZjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktlbG93bmEgQ2VudHJhbCBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQyNTU1MmIxM2MwODRmOWNhYjEwZTE1NWVhYmQzNDYwLnNldENvbnRlbnQoaHRtbF8yNTExNzIyMmYxZWQ0MDE1ODkwNTQ0M2U4MDdmN2RmNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZGFmMmVmNjc4YjI0YjUzODU1MGEyYzM4M2VjZjg1Yy5iaW5kUG9wdXAocG9wdXBfNDI1NTUyYjEzYzA4NGY5Y2FiMTBlMTU1ZWFiZDM0NjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWQ3ODU4NzExZjc0NDY2MzgzYjdkMmM5NDJlM2FjM2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS42ODc1LC0xMTYuMF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZWVlZWI0ZjBmY2U0MjY3YjU0OTFlNGUyMDg4ZGJiNik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMjRmOTJmMmE5ZTA0Y2JjOTNiZWI5ODJiZDAwODUyZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNDM4MmFiNzFhNDE0NDJhOWFjNGFlZmY3ZjZmZmJjZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjQzODJhYjcxYTQxNDQyYTlhYzRhZWZmN2Y2ZmZiY2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktpbWJlcmxleSBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IyNGY5MmYyYTllMDRjYmM5M2JlYjk4MmJkMDA4NTJkLnNldENvbnRlbnQoaHRtbF9mNDM4MmFiNzFhNDE0NDJhOWFjNGFlZmY3ZjZmZmJjZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZDc4NTg3MTFmNzQ0NjYzODNiN2QyYzk0MmUzYWMzYS5iaW5kUG9wdXAocG9wdXBfYjI0ZjkyZjJhOWUwNGNiYzkzYmViOTgyYmQwMDg1MmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzdhNDhhNmU4NjNlNDc0ZGFhOTNmMzMyZWE4ZTllZTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NC4wNjI1LC0xMjguNjI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM1YWY4YzgiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjNWFmOGM4IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlZWVlYjRmMGZjZTQyNjdiNTQ5MWU0ZTIwODhkYmI2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q0ODcyNzE1N2U0ZDQwMWQ4NGJkN2ViZjg2OGU0YzdiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAyNmNlMDU5OWY4YjQ0YzBhYjhmZWI4ZmRhZTgwZDIzID0gJCgnPGRpdiBpZD0iaHRtbF8wMjZjZTA1OTlmOGI0NGMwYWI4ZmViOGZkYWU4MGQyMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2l0aW1hdCBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q0ODcyNzE1N2U0ZDQwMWQ4NGJkN2ViZjg2OGU0YzdiLnNldENvbnRlbnQoaHRtbF8wMjZjZTA1OTlmOGI0NGMwYWI4ZmViOGZkYWU4MGQyMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83N2E0OGE2ZTg2M2U0NzRkYWE5M2YzMzJlYThlOWVlMS5iaW5kUG9wdXAocG9wdXBfZDQ4NzI3MTU3ZTRkNDAxZDg0YmQ3ZWJmODY4ZTRjN2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2RiMDE5MjNlNzgzNGUyN2FmNzY1MmFiNGI2OTQ2ODYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS4wOTM3NSwtMTIyLjU2MjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmVlZWViNGYwZmNlNDI2N2I1NDkxZTRlMjA4OGRiYjYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGNjM2ZmY2JjZTZmNDZiN2I3ZDM4YTM5ZDcwZjFhZWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjlkZjJlNDk1YjMzNDEwNzg1OWNkODZiNDgwOTc1MTMgPSAkKCc8ZGl2IGlkPSJodG1sXzY5ZGYyZTQ5NWIzMzQxMDc4NTljZDg2YjQ4MDk3NTEzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYW5nbGV5IENpdHkgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kY2MzZmZjYmNlNmY0NmI3YjdkMzhhMzlkNzBmMWFlZi5zZXRDb250ZW50KGh0bWxfNjlkZjJlNDk1YjMzNDEwNzg1OWNkODZiNDgwOTc1MTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2RiMDE5MjNlNzgzNGUyN2FmNzY1MmFiNGI2OTQ2ODYuYmluZFBvcHVwKHBvcHVwX2RjYzNmZmNiY2U2ZjQ2YjdiN2QzOGEzOWQ3MGYxYWVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU5ZWIwOTMwZGYwYjRhODJiOWM4NDA0YTRjMGJhMTRlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuMTg3NSwtMTI0LjBdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmVlZWViNGYwZmNlNDI2N2I1NDkxZTRlMjA4OGRiYjYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmMzNjE3YmExNTViNGI5OWE1MzAzZmZiY2YzYjE1NDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjFkZTFkNWZhZGM3NDBlMmJjODA2Mjg2NjJjNWU2ZTcgPSAkKCc8ZGl2IGlkPSJodG1sXzYxZGUxZDVmYWRjNzQwZTJiYzgwNjI4NjYyYzVlNmU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OYW5haW1vIENlbnRyYWwgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYzM2MTdiYTE1NWI0Yjk5YTUzMDNmZmJjZjNiMTU0NS5zZXRDb250ZW50KGh0bWxfNjFkZTFkNWZhZGM3NDBlMmJjODA2Mjg2NjJjNWU2ZTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTllYjA5MzBkZjBiNGE4MmI5Yzg0MDRhNGMwYmExNGUuYmluZFBvcHVwKHBvcHVwX2ZjMzYxN2JhMTU1YjRiOTlhNTMwM2ZmYmNmM2IxNTQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkODk3NmM4ZjhiYzQ5ODRiZjk1MWQ1M2ZjOWQ0NjNjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuNSwtMTE3LjMxMjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmNmQzOCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjZkMzgiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmVlZWViNGYwZmNlNDI2N2I1NDkxZTRlMjA4OGRiYjYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWEwODI0NTJmNjFhNDViNmFlM2YyYmIzNzdmMGY2MjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTk5MWQzNGRjNTk4NDc4YjllYWFhNmMyMDlkMzhkZDcgPSAkKCc8ZGl2IGlkPSJodG1sX2E5OTFkMzRkYzU5ODQ3OGI5ZWFhYTZjMjA5ZDM4ZGQ3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZWxzb24gQ2x1c3RlciA3PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYTA4MjQ1MmY2MWE0NWI2YWUzZjJiYjM3N2YwZjYyMi5zZXRDb250ZW50KGh0bWxfYTk5MWQzNGRjNTk4NDc4YjllYWFhNmMyMDlkMzhkZDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2Q4OTc2YzhmOGJjNDk4NGJmOTUxZDUzZmM5ZDQ2M2MuYmluZFBvcHVwKHBvcHVwX2FhMDgyNDUyZjYxYTQ1YjZhZTNmMmJiMzc3ZjBmNjIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E4ODRkMzg0YTViZTQzMWJiN2Q3ZjZhMDg5NDZlYmJjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuMTg3NSwtMTIyLjg3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZWVlZWI0ZjBmY2U0MjY3YjU0OTFlNGUyMDg4ZGJiNik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZGNlNGU0NjA1OGI0YmRjYTBjYTRlMWUyM2Q0YWU0ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZTZhMDNiNGY1YTM0ZjU4OTc4ZDU5YzAyMGUyY2Q3YSA9ICQoJzxkaXYgaWQ9Imh0bWxfMWU2YTAzYjRmNWEzNGY1ODk3OGQ1OWMwMjBlMmNkN2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBXZXN0bWluc3RlciBOb3J0aGVhc3QgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZGNlNGU0NjA1OGI0YmRjYTBjYTRlMWUyM2Q0YWU0Zi5zZXRDb250ZW50KGh0bWxfMWU2YTAzYjRmNWEzNGY1ODk3OGQ1OWMwMjBlMmNkN2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTg4NGQzODRhNWJlNDMxYmI3ZDdmNmEwODk0NmViYmMuYmluZFBvcHVwKHBvcHVwX2ZkY2U0ZTQ2MDU4YjRiZGNhMGNhNGUxZTIzZDRhZTRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUxYjAzNjMwNGU3OTRlNzY5ZDgxOGMyYzc0MTAwNDM4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDguNDM3NSwtMTIzLjMxMjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmVlZWViNGYwZmNlNDI2N2I1NDkxZTRlMjA4OGRiYjYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTczMGExNjAyZjllNDU0Yzg3ZjE0MjkxNTFjNzE3NTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTZkNzlhNWQzNDg2NDM0MGI5NWU1NjBkOWRmYzQxOGYgPSAkKCc8ZGl2IGlkPSJodG1sX2E2ZDc5YTVkMzQ4NjQzNDBiOTVlNTYwZDlkZmM0MThmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PYWsgQmF5IENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTczMGExNjAyZjllNDU0Yzg3ZjE0MjkxNTFjNzE3NTAuc2V0Q29udGVudChodG1sX2E2ZDc5YTVkMzQ4NjQzNDBiOTVlNTYwZDlkZmM0MThmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUxYjAzNjMwNGU3OTRlNzY5ZDgxOGMyYzc0MTAwNDM4LmJpbmRQb3B1cChwb3B1cF81NzMwYTE2MDJmOWU0NTRjODdmMTQyOTE1MWM3MTc1MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NjZiNzE2YjkyODY0MjhhYTliNGI1Nzk5ZDk4OGNmMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjMxMjUsLTEyNC4zMTI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlZWVlYjRmMGZjZTQyNjdiNTQ5MWU0ZTIwODhkYmI2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg0MTEyYmE5Zjg3NDQzMjE5M2E1MTg1YjMyZjdhMTdhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FmNDY5ZWQ5MGJjZTRmMjA5Zjc2ZWNmNzkyZDgwYTg3ID0gJCgnPGRpdiBpZD0iaHRtbF9hZjQ2OWVkOTBiY2U0ZjIwOWY3NmVjZjc5MmQ4MGE4NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFya3N2aWxsZSBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg0MTEyYmE5Zjg3NDQzMjE5M2E1MTg1YjMyZjdhMTdhLnNldENvbnRlbnQoaHRtbF9hZjQ2OWVkOTBiY2U0ZjIwOWY3NmVjZjc5MmQ4MGE4Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NjZiNzE2YjkyODY0MjhhYTliNGI1Nzk5ZDk4OGNmMy5iaW5kUG9wdXAocG9wdXBfODQxMTJiYTlmODc0NDMyMTkzYTUxODViMzJmN2ExN2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmYwYzk3MWJmNDExNDI5ZDgxYmIyYWRlMTdmNWZkNDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS4yMTg3NSwtMTIyLjY4NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmVlZWViNGYwZmNlNDI2N2I1NDkxZTRlMjA4OGRiYjYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzE1MjU4N2I5NDVlNDdmMDg0ZjE1ZDA5ZDI1ZThjNTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDZlYjY2MjgzNTNjNDIzNTk2OTJkNzMwZWM5MDBiOWQgPSAkKCc8ZGl2IGlkPSJodG1sXzA2ZWI2NjI4MzUzYzQyMzU5NjkyZDczMGVjOTAwYjlkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXR0IE1lYWRvd3MgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MTUyNTg3Yjk0NWU0N2YwODRmMTVkMDlkMjVlOGM1MS5zZXRDb250ZW50KGh0bWxfMDZlYjY2MjgzNTNjNDIzNTk2OTJkNzMwZWM5MDBiOWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmYwYzk3MWJmNDExNDI5ZDgxYmIyYWRlMTdmNWZkNDUuYmluZFBvcHVwKHBvcHVwXzcxNTI1ODdiOTQ1ZTQ3ZjA4NGYxNWQwOWQyNWU4YzUxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM0ZmQ5MjcwYjFhYjQ2M2Q4MDE1OGNmMTgzNmJiOGVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuMzQzNzUsLTEyNC40Mzc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlZWVlYjRmMGZjZTQyNjdiNTQ5MWU0ZTIwODhkYmI2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FlNzJkOGM0ZmY3YjRkYjc4YTExMTRjYjRiNmQyNjZkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBhOWI3ZWRiOGI3OTRhZTI4NjBkNTAyODQ3MTM5OGEyID0gJCgnPGRpdiBpZD0iaHRtbF8wYTliN2VkYjhiNzk0YWUyODYwZDUwMjg0NzEzOThhMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVhbGljdW0gQmVhY2ggQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZTcyZDhjNGZmN2I0ZGI3OGExMTE0Y2I0YjZkMjY2ZC5zZXRDb250ZW50KGh0bWxfMGE5YjdlZGI4Yjc5NGFlMjg2MGQ1MDI4NDcxMzk4YTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzRmZDkyNzBiMWFiNDYzZDgwMTU4Y2YxODM2YmI4ZWEuYmluZFBvcHVwKHBvcHVwX2FlNzJkOGM0ZmY3YjRkYjc4YTExMTRjYjRiNmQyNjZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI5YzlhMWMzMDg2MDRkYzViMjZhMjBhYzkwYzM3MjcyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuMTU2MjUsLTEyMy4xMjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmVlZWViNGYwZmNlNDI2N2I1NDkxZTRlMjA4OGRiYjYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDU5NGM1Y2I1NWUyNDNiN2FmN2Y4YjM5ZWVjNjM0YjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDgyODkzOTIyYmFlNDEyNWI0ODQ5YTE2NDkyM2RjZGYgPSAkKCc8ZGl2IGlkPSJodG1sXzA4Mjg5MzkyMmJhZTQxMjViNDg0OWExNjQ5MjNkY2RmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNobW9uZCBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ1OTRjNWNiNTVlMjQzYjdhZjdmOGIzOWVlYzYzNGIxLnNldENvbnRlbnQoaHRtbF8wODI4OTM5MjJiYWU0MTI1YjQ4NDlhMTY0OTIzZGNkZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yOWM5YTFjMzA4NjA0ZGM1YjI2YTIwYWM5MGMzNzI3Mi5iaW5kUG9wdXAocG9wdXBfNDU5NGM1Y2I1NWUyNDNiN2FmN2Y4YjM5ZWVjNjM0YjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDVjNTZmMGJiNGY4NGQ2MmI1YWE5M2I0N2E5NDczMTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OC41LC0xMjMuMzc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNlY2M4NmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZWNjODZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlZWVlYjRmMGZjZTQyNjdiNTQ5MWU0ZTIwODhkYmI2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q1NmE1NGYzYWYyODQyNDc4OWQ1ZGI2MTk1OTdhMWM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk5MjM2NmZkODUzODRiMTA5MDUyMGU0NDIwNmNmZTlmID0gJCgnPGRpdiBpZD0iaHRtbF85OTIzNjZmZDg1Mzg0YjEwOTA1MjBlNDQyMDZjZmU5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2FhbmljaCBDZW50cmFsIENsdXN0ZXIgNjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDU2YTU0ZjNhZjI4NDI0Nzg5ZDVkYjYxOTU5N2ExYzkuc2V0Q29udGVudChodG1sXzk5MjM2NmZkODUzODRiMTA5MDUyMGU0NDIwNmNmZTlmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q1YzU2ZjBiYjRmODRkNjJiNWFhOTNiNDdhOTQ3MzEwLmJpbmRQb3B1cChwb3B1cF9kNTZhNTRmM2FmMjg0MjQ3ODlkNWRiNjE5NTk3YTFjOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YmExNTM2YmY4ZjQ0ZDQ5OTgwM2MwM2FiOTgwMDIxNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjY4NzUsLTExOS4yNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzg2ZGY5IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzM4NmRmOSIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZWVlZWI0ZjBmY2U0MjY3YjU0OTFlNGUyMDg4ZGJiNik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNzdjZTJkMWVlYzU0M2RlYmI5NjY5MDg5NWYwNjM4MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZjZlNDNlMzk3MmY0MTk3YWUxYzQ1NDdmZmRjNDY1YSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGY2ZTQzZTM5NzJmNDE5N2FlMWM0NTQ3ZmZkYzQ2NWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNhbG1vbiBBcm0gQ2x1c3RlciAyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNzdjZTJkMWVlYzU0M2RlYmI5NjY5MDg5NWYwNjM4Mi5zZXRDb250ZW50KGh0bWxfNGY2ZTQzZTM5NzJmNDE5N2FlMWM0NTQ3ZmZkYzQ2NWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWJhMTUzNmJmOGY0NGQ0OTk4MDNjMDNhYjk4MDAyMTYuYmluZFBvcHVwKHBvcHVwX2Y3N2NlMmQxZWVjNTQzZGViYjk2NjkwODk1ZjA2MzgyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc3Y2FiYzJhOWM1NzQzMTFhY2I1ZDk4YTJkMTNmODkyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDguMzc1LC0xMjMuNzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzM4NmRmOSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzODZkZjkiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmVlZWViNGYwZmNlNDI2N2I1NDkxZTRlMjA4OGRiYjYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTFmMTBiMzg0MzA2NDIzZjhlMGQ3MDhkNGUzMGQwMjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTU1ZTFiMjg5NjViNGFmNTg2ODZlNmJlMDM2NDFiNDggPSAkKCc8ZGl2IGlkPSJodG1sXzU1NWUxYjI4OTY1YjRhZjU4Njg2ZTZiZTAzNjQxYjQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb29rZSBDbHVzdGVyIDI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkxZjEwYjM4NDMwNjQyM2Y4ZTBkNzA4ZDRlMzBkMDIwLnNldENvbnRlbnQoaHRtbF81NTVlMWIyODk2NWI0YWY1ODY4NmU2YmUwMzY0MWI0OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83N2NhYmMyYTljNTc0MzExYWNiNWQ5OGEyZDEzZjg5Mi5iaW5kUG9wdXAocG9wdXBfOTFmMTBiMzg0MzA2NDIzZjhlMGQ3MDhkNGUzMGQwMjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmFlM2ZiMWI1YTY5NDIxN2EzMGYxNzhjN2QzYTU2ODMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS40MDYyNSwtMTE5LjBdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzM4NmRmOSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzODZkZjkiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmVlZWViNGYwZmNlNDI2N2I1NDkxZTRlMjA4OGRiYjYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2MzMzA2Nzk2ZTgzNDkyMDhiNzVlMWRkNzg2OGY0OWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2MwMDQyZmYyOWU4NDc4OGE1MjM1MWUxMDU0Mzc1MzkgPSAkKCc8ZGl2IGlkPSJodG1sXzNjMDA0MmZmMjllODQ3ODhhNTIzNTFlMTA1NDM3NTM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb3V0aCBPa2FuYWdhbiBDbHVzdGVyIDI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdjMzMwNjc5NmU4MzQ5MjA4Yjc1ZTFkZDc4NjhmNDljLnNldENvbnRlbnQoaHRtbF8zYzAwNDJmZjI5ZTg0Nzg4YTUyMzUxZTEwNTQzNzUzOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYWUzZmIxYjVhNjk0MjE3YTMwZjE3OGM3ZDNhNTY4My5iaW5kUG9wdXAocG9wdXBfN2MzMzA2Nzk2ZTgzNDkyMDhiNzVlMWRkNzg2OGY0OWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjRiZmUwNzYzMDgxNDhiMzkxMzE3MTVmMmZjMDQ4OTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS4xMjUsLTEyMi44MTI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlZWVlYjRmMGZjZTQyNjdiNTQ5MWU0ZTIwODhkYmI2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IxYjQxMDNkZTk4ZjQ4MDY4NDk2OGNkMTFiNDcyMDY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcwMTRjNTg1OWQ3MjQ3MmZiM2I1NWM1NjkwMWIzNjRkID0gJCgnPGRpdiBpZD0iaHRtbF83MDE0YzU4NTlkNzI0NzJmYjNiNTVjNTY5MDFiMzY0ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3VycmV5IENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjFiNDEwM2RlOThmNDgwNjg0OTY4Y2QxMWI0NzIwNjYuc2V0Q29udGVudChodG1sXzcwMTRjNTg1OWQ3MjQ3MmZiM2I1NWM1NjkwMWIzNjRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY0YmZlMDc2MzA4MTQ4YjM5MTMxNzE1ZjJmYzA0ODkwLmJpbmRQb3B1cChwb3B1cF9iMWI0MTAzZGU5OGY0ODA2ODQ5NjhjZDExYjQ3MjA2Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NzgwZjNjOGQ0Yjk0ODYxODZiY2FkNTE3MzRmYWM2NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU0LjUzMTI1LC0xMjguNjI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzODZkZjkiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzg2ZGY5IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlZWVlYjRmMGZjZTQyNjdiNTQ5MWU0ZTIwODhkYmI2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIzNGI1ZmM2NWVhMjQ5MGQ5MDdjYzAwZTg1NWQ2NDg0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I3N2Y0NzVhZTdhNjRmMmM4NWViM2U5YTRlN2VhMjNmID0gJCgnPGRpdiBpZD0iaHRtbF9iNzdmNDc1YWU3YTY0ZjJjODVlYjNlOWE0ZTdlYTIzZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGVycmFjZSBDbHVzdGVyIDI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIzNGI1ZmM2NWVhMjQ5MGQ5MDdjYzAwZTg1NWQ2NDg0LnNldENvbnRlbnQoaHRtbF9iNzdmNDc1YWU3YTY0ZjJjODVlYjNlOWE0ZTdlYTIzZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NzgwZjNjOGQ0Yjk0ODYxODZiY2FkNTE3MzRmYWM2NS5iaW5kUG9wdXAocG9wdXBfMjM0YjVmYzY1ZWEyNDkwZDkwN2NjMDBlODU1ZDY0ODQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNThiNDcwYTk4ODk0NGU1NjlkZThhMmQ4MGUxMDJlNmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS4wOTM3NSwtMTE3LjY4NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2E0Zjg5ZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNhNGY4OWYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmVlZWViNGYwZmNlNDI2N2I1NDkxZTRlMjA4OGRiYjYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmFjMmI5OTI4MjI2NGYxMWFmMDlkNTM2OTllNTRhNGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzI4OGVjYzZhY2YxNGE2NTg4MzE2MmI0ZmRmYWM5MmIgPSAkKCc8ZGl2IGlkPSJodG1sXzMyODhlY2M2YWNmMTRhNjU4ODMxNjJiNGZkZmFjOTJiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UcmFpbCBDbHVzdGVyIDU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JhYzJiOTkyODIyNjRmMTFhZjA5ZDUzNjk5ZTU0YTRlLnNldENvbnRlbnQoaHRtbF8zMjg4ZWNjNmFjZjE0YTY1ODgzMTYyYjRmZGZhYzkyYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81OGI0NzBhOTg4OTQ0ZTU2OWRlOGEyZDgwZTEwMmU2YS5iaW5kUG9wdXAocG9wdXBfYmFjMmI5OTI4MjI2NGYxMWFmMDlkNTM2OTllNTRhNGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2Q2ZTM4YjY4NzY0NDIxNzliNjUyMzBlOTU5ZTgzMDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS4yNSwtMTIzLjEyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZWVlZWI0ZjBmY2U0MjY3YjU0OTFlNGUyMDg4ZGJiNik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NzQ3MTQ4MThjZDk0MDllOTVkOWEzNzE4NGE5YjUzZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMjk2MzUyYzM2YzY0MTczODE5ZWFiZmY4OWFjYTJkNiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTI5NjM1MmMzNmM2NDE3MzgxOWVhYmZmODlhY2EyZDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZhbmNvdXZlciBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ3NDcxNDgxOGNkOTQwOWU5NWQ5YTM3MTg0YTliNTNkLnNldENvbnRlbnQoaHRtbF8xMjk2MzUyYzM2YzY0MTczODE5ZWFiZmY4OWFjYTJkNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZDZlMzhiNjg3NjQ0MjE3OWI2NTIzMGU5NTllODMwMi5iaW5kUG9wdXAocG9wdXBfNDc0NzE0ODE4Y2Q5NDA5ZTk1ZDlhMzcxODRhOWI1M2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDVmMTA5MDAzY2RjNDhhYThmMDZmNmIzNzJkODQ1OWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OC40Mzc1LC0xMjMuMzc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlZWVlYjRmMGZjZTQyNjdiNTQ5MWU0ZTIwODhkYmI2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NiYmU3ODk1M2RjODQxM2Q4ZWJjZGQ2YTY4MmUxNDk3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY0NzMxZWM4YjllNDRjZmRiNzBhZjA0MGQxZWViZGZmID0gJCgnPGRpdiBpZD0iaHRtbF82NDczMWVjOGI5ZTQ0Y2ZkYjcwYWYwNDBkMWVlYmRmZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VmljdG9yaWEgQ2VudHJhbCBCcml0aXNoIENvbHVtYmlhIFByb3ZpbmNpYWwgR292ZXJubWVudCBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NiYmU3ODk1M2RjODQxM2Q4ZWJjZGQ2YTY4MmUxNDk3LnNldENvbnRlbnQoaHRtbF82NDczMWVjOGI5ZTQ0Y2ZkYjcwYWYwNDBkMWVlYmRmZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNWYxMDkwMDNjZGM0OGFhOGYwNmY2YjM3MmQ4NDU5ZS5iaW5kUG9wdXAocG9wdXBfY2JiZTc4OTUzZGM4NDEzZDhlYmNkZDZhNjgyZTE0OTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzJlZDcyNmUwMjk2NDEyMzkyZTE2NjJhNjQwNjBmNDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4xMjUsLTEyMi45Mzc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlZWVlYjRmMGZjZTQyNjdiNTQ5MWU0ZTIwODhkYmI2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY4ZjJjM2EyNjIyYzRkOTdiOWQyZmRhMDllZDg0NWZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U4NThmZmEwYmQ3MDQ2YzY5NDc1MjViZTE3NzczYjUxID0gJCgnPGRpdiBpZD0iaHRtbF9lODU4ZmZhMGJkNzA0NmM2OTQ3NTI1YmUxNzc3M2I1MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2hpc3RsZXIgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OGYyYzNhMjYyMmM0ZDk3YjlkMmZkYTA5ZWQ4NDVmZi5zZXRDb250ZW50KGh0bWxfZTg1OGZmYTBiZDcwNDZjNjk0NzUyNWJlMTc3NzNiNTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzJlZDcyNmUwMjk2NDEyMzkyZTE2NjJhNjQwNjBmNDMuYmluZFBvcHVwKHBvcHVwXzY4ZjJjM2EyNjIyYzRkOTdiOWQyZmRhMDllZDg0NWZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY0MmI1MjkzOTQ5ODQ4MmY5MjUwZDgxMjhlZWEwOTMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuMDMxMjUsLTEyMi44MTI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlZWVlYjRmMGZjZTQyNjdiNTQ5MWU0ZTIwODhkYmI2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk4NDE5NjAzMTZkYjQwOWI4YThmNDNhOTFmMGEzYTg3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RkMjk4ZmQ5YzgyODRiMWM5OTMyZWVhZjgwYzllZWVjID0gJCgnPGRpdiBpZD0iaHRtbF9kZDI5OGZkOWM4Mjg0YjFjOTkzMmVlYWY4MGM5ZWVlYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2hpdGUgUm9jayBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk4NDE5NjAzMTZkYjQwOWI4YThmNDNhOTFmMGEzYTg3LnNldENvbnRlbnQoaHRtbF9kZDI5OGZkOWM4Mjg0YjFjOTkzMmVlYWY4MGM5ZWVlYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NDJiNTI5Mzk0OTg0ODJmOTI1MGQ4MTI4ZWVhMDkzMy5iaW5kUG9wdXAocG9wdXBfOTg0MTk2MDMxNmRiNDA5YjhhOGY0M2E5MWYwYTNhODcpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg== onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7fef7c7ece48>"
]
},
"execution_count": 204,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"map_bc_neigh = folium.Map(location=[lat,long], zoom_start=5)\n",
"map_bc_neigh\n",
"\n",
"x = np.arange(8)\n",
"ys = [i + x + (i*x)**2 for i in range(8)]\n",
"colors_array = cm.rainbow(np.linspace(0, 1, len(ys)))\n",
"rainbow = [colors.rgb2hex(i) for i in colors_array]\n",
"\n",
"for lati, lon, neigh, cluster in zip(clustered_df['Latitude'], clustered_df['Longitude'], clustered_df['Place'], clustered_df['Cluster Labels']):\n",
" label = folium.Popup(str(neigh) + ' Cluster ' + str(cluster), parse_html=True)\n",
" folium.CircleMarker(\n",
" [lati, lon],\n",
" radius=5,\n",
" popup=label,\n",
" color=rainbow[cluster-1],\n",
" fill=True,\n",
" fill_color=rainbow[cluster-1],\n",
" fill_opacity=0.7).add_to(map_bc_neigh)\n",
" \n",
"map_bc_neigh"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"## Results and Conclusion <a name=\"results\"></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Based on the similarity of neighborhoods based on their nearby venues, we cluster the neighborhoods into 8 different clusters. We examine each cluster and determine the discriminating venue categories that distinguish each cluster.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Cluster 1"
]
},
{
"cell_type": "code",
"execution_count": 205,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(1, 11)\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>Place</th>\n",
" <th>1st Most Common Venue</th>\n",
" <th>2nd Most Common Venue</th>\n",
" <th>3rd Most Common Venue</th>\n",
" <th>4th Most Common Venue</th>\n",
" <th>5th Most Common Venue</th>\n",
" <th>6th Most Common Venue</th>\n",
" <th>7th Most Common Venue</th>\n",
" <th>8th Most Common Venue</th>\n",
" <th>9th Most Common Venue</th>\n",
" <th>10th Most Common Venue</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Langley City</td>\n",
" <td>Baseball Field</td>\n",
" <td>Zoo</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Place 1st Most Common Venue 2nd Most Common Venue \\\n",
"0 Langley City Baseball Field Zoo \n",
"\n",
" 3rd Most Common Venue 4th Most Common Venue 5th Most Common Venue \\\n",
"0 Fish & Chips Shop Convenience Store Dessert Shop \n",
"\n",
" 6th Most Common Venue 7th Most Common Venue 8th Most Common Venue \\\n",
"0 Dim Sum Restaurant Dog Run Elementary School \n",
"\n",
" 9th Most Common Venue 10th Most Common Venue \n",
"0 Falafel Restaurant Fast Food Restaurant "
]
},
"execution_count": 205,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"label0 = clustered_df.loc[clustered_df['Cluster Labels'] == 0,\n",
" clustered_df.columns[[0] + list(range(7, clustered_df.shape[1]))]]\n",
"print(label0.shape)\n",
"label0.head().reset_index(drop=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Cluster 2"
]
},
{
"cell_type": "code",
"execution_count": 206,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(20, 11)\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>Place</th>\n",
" <th>1st Most Common Venue</th>\n",
" <th>2nd Most Common Venue</th>\n",
" <th>3rd Most Common Venue</th>\n",
" <th>4th Most Common Venue</th>\n",
" <th>5th Most Common Venue</th>\n",
" <th>6th Most Common Venue</th>\n",
" <th>7th Most Common Venue</th>\n",
" <th>8th Most Common Venue</th>\n",
" <th>9th Most Common Venue</th>\n",
" <th>10th Most Common Venue</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Abbotsford</td>\n",
" <td>Grocery Store</td>\n",
" <td>Trail</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Burnaby</td>\n",
" <td>Bus Stop</td>\n",
" <td>Bookstore</td>\n",
" <td>Snack Place</td>\n",
" <td>Park</td>\n",
" <td>Bus Station</td>\n",
" <td>Burger Joint</td>\n",
" <td>Sandwich Place</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Falafel Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Comox</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Pharmacy</td>\n",
" <td>Sandwich Place</td>\n",
" <td>Juice Bar</td>\n",
" <td>Elementary School</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Coquitlam</td>\n",
" <td>Asian Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Golf Course</td>\n",
" <td>Gas Station</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Zoo</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Duncan</td>\n",
" <td>Convenience Store</td>\n",
" <td>Gas Station</td>\n",
" <td>Dog Run</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Place 1st Most Common Venue 2nd Most Common Venue \\\n",
"0 Abbotsford Grocery Store Trail \n",
"1 Burnaby Bus Stop Bookstore \n",
"2 Comox Fast Food Restaurant Coffee Shop \n",
"3 Coquitlam Asian Restaurant Convenience Store \n",
"4 Duncan Convenience Store Gas Station \n",
"\n",
" 3rd Most Common Venue 4th Most Common Venue 5th Most Common Venue \\\n",
"0 Falafel Restaurant Coffee Shop Construction & Landscaping \n",
"1 Snack Place Park Bus Station \n",
"2 Pharmacy Sandwich Place Juice Bar \n",
"3 Golf Course Gas Station Coffee Shop \n",
"4 Dog Run Zoo Fast Food Restaurant \n",
"\n",
" 6th Most Common Venue 7th Most Common Venue \\\n",
"0 Convenience Store Dessert Shop \n",
"1 Burger Joint Sandwich Place \n",
"2 Elementary School Construction & Landscaping \n",
"3 Zoo Falafel Restaurant \n",
"4 Construction & Landscaping Dessert Shop \n",
"\n",
" 8th Most Common Venue 9th Most Common Venue 10th Most Common Venue \n",
"0 Dim Sum Restaurant Dog Run Elementary School \n",
"1 Coffee Shop Fast Food Restaurant Falafel Restaurant \n",
"2 Convenience Store Dessert Shop Dim Sum Restaurant \n",
"3 Dessert Shop Dim Sum Restaurant Dog Run \n",
"4 Dim Sum Restaurant Elementary School Falafel Restaurant "
]
},
"execution_count": 206,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"label1 = clustered_df.loc[clustered_df['Cluster Labels'] == 1,\n",
" clustered_df.columns[[0] + list(range(7, clustered_df.shape[1]))]]\n",
"print(label1.shape)\n",
"label1.head().reset_index(drop=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Cluster 3"
]
},
{
"cell_type": "code",
"execution_count": 207,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(5, 11)\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>Place</th>\n",
" <th>1st Most Common Venue</th>\n",
" <th>2nd Most Common Venue</th>\n",
" <th>3rd Most Common Venue</th>\n",
" <th>4th Most Common Venue</th>\n",
" <th>5th Most Common Venue</th>\n",
" <th>6th Most Common Venue</th>\n",
" <th>7th Most Common Venue</th>\n",
" <th>8th Most Common Venue</th>\n",
" <th>9th Most Common Venue</th>\n",
" <th>10th Most Common Venue</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Cranbrook</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Salmon Arm</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Sooke</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>South Okanagan</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Terrace</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Place 1st Most Common Venue 2nd Most Common Venue \\\n",
"0 Cranbrook Construction & Landscaping Zoo \n",
"1 Salmon Arm Construction & Landscaping Zoo \n",
"2 Sooke Construction & Landscaping Zoo \n",
"3 South Okanagan Construction & Landscaping Zoo \n",
"4 Terrace Construction & Landscaping Zoo \n",
"\n",
" 3rd Most Common Venue 4th Most Common Venue 5th Most Common Venue \\\n",
"0 Fast Food Restaurant Convenience Store Dessert Shop \n",
"1 Fast Food Restaurant Convenience Store Dessert Shop \n",
"2 Fast Food Restaurant Convenience Store Dessert Shop \n",
"3 Fast Food Restaurant Convenience Store Dessert Shop \n",
"4 Fast Food Restaurant Convenience Store Dessert Shop \n",
"\n",
" 6th Most Common Venue 7th Most Common Venue 8th Most Common Venue \\\n",
"0 Dim Sum Restaurant Dog Run Elementary School \n",
"1 Dim Sum Restaurant Dog Run Elementary School \n",
"2 Dim Sum Restaurant Dog Run Elementary School \n",
"3 Dim Sum Restaurant Dog Run Elementary School \n",
"4 Dim Sum Restaurant Dog Run Elementary School \n",
"\n",
" 9th Most Common Venue 10th Most Common Venue \n",
"0 Falafel Restaurant Fish & Chips Shop \n",
"1 Falafel Restaurant Fish & Chips Shop \n",
"2 Falafel Restaurant Fish & Chips Shop \n",
"3 Falafel Restaurant Fish & Chips Shop \n",
"4 Falafel Restaurant Fish & Chips Shop "
]
},
"execution_count": 207,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"label2 = clustered_df.loc[clustered_df['Cluster Labels'] == 2,\n",
" clustered_df.columns[[0] + list(range(7, clustered_df.shape[1]))]]\n",
"print(label2.shape)\n",
"label2.head().reset_index(drop=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Cluster 4"
]
},
{
"cell_type": "code",
"execution_count": 208,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(2, 11)\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>Place</th>\n",
" <th>1st Most Common Venue</th>\n",
" <th>2nd Most Common Venue</th>\n",
" <th>3rd Most Common Venue</th>\n",
" <th>4th Most Common Venue</th>\n",
" <th>5th Most Common Venue</th>\n",
" <th>6th Most Common Venue</th>\n",
" <th>7th Most Common Venue</th>\n",
" <th>8th Most Common Venue</th>\n",
" <th>9th Most Common Venue</th>\n",
" <th>10th Most Common Venue</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Esquimalt</td>\n",
" <td>Boat or Ferry</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Zoo</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Highlands</td>\n",
" <td>Zoo</td>\n",
" <td>Theme Park</td>\n",
" <td>Boat or Ferry</td>\n",
" <td>Wine Shop</td>\n",
" <td>Auto Workshop</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Place 1st Most Common Venue 2nd Most Common Venue \\\n",
"0 Esquimalt Boat or Ferry Fish & Chips Shop \n",
"1 Highlands Zoo Theme Park \n",
"\n",
" 3rd Most Common Venue 4th Most Common Venue 5th Most Common Venue \\\n",
"0 Convenience Store Dessert Shop Dim Sum Restaurant \n",
"1 Boat or Ferry Wine Shop Auto Workshop \n",
"\n",
" 6th Most Common Venue 7th Most Common Venue 8th Most Common Venue \\\n",
"0 Dog Run Elementary School Falafel Restaurant \n",
"1 Fish & Chips Shop Dessert Shop Dim Sum Restaurant \n",
"\n",
" 9th Most Common Venue 10th Most Common Venue \n",
"0 Fast Food Restaurant Zoo \n",
"1 Dog Run Elementary School "
]
},
"execution_count": 208,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"label3 = clustered_df.loc[clustered_df['Cluster Labels'] == 3,\n",
" clustered_df.columns[[0] + list(range(7, clustered_df.shape[1]))]]\n",
"print(label3.shape)\n",
"label3.head().reset_index(drop=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Cluster 5"
]
},
{
"cell_type": "code",
"execution_count": 209,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(1, 11)\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>Place</th>\n",
" <th>1st Most Common Venue</th>\n",
" <th>2nd Most Common Venue</th>\n",
" <th>3rd Most Common Venue</th>\n",
" <th>4th Most Common Venue</th>\n",
" <th>5th Most Common Venue</th>\n",
" <th>6th Most Common Venue</th>\n",
" <th>7th Most Common Venue</th>\n",
" <th>8th Most Common Venue</th>\n",
" <th>9th Most Common Venue</th>\n",
" <th>10th Most Common Venue</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Kitimat</td>\n",
" <td>Business Service</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Place 1st Most Common Venue 2nd Most Common Venue 3rd Most Common Venue \\\n",
"0 Kitimat Business Service Zoo Fast Food Restaurant \n",
"\n",
" 4th Most Common Venue 5th Most Common Venue 6th Most Common Venue \\\n",
"0 Convenience Store Dessert Shop Dim Sum Restaurant \n",
"\n",
" 7th Most Common Venue 8th Most Common Venue 9th Most Common Venue \\\n",
"0 Dog Run Elementary School Falafel Restaurant \n",
"\n",
" 10th Most Common Venue \n",
"0 Fish & Chips Shop "
]
},
"execution_count": 209,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"label4 = clustered_df.loc[clustered_df['Cluster Labels'] == 4,\n",
" clustered_df.columns[[0] + list(range(7, clustered_df.shape[1]))]]\n",
"print(label4.shape)\n",
"label4.head().reset_index(drop=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Cluster 6"
]
},
{
"cell_type": "code",
"execution_count": 210,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(1, 11)\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>Place</th>\n",
" <th>1st Most Common Venue</th>\n",
" <th>2nd Most Common Venue</th>\n",
" <th>3rd Most Common Venue</th>\n",
" <th>4th Most Common Venue</th>\n",
" <th>5th Most Common Venue</th>\n",
" <th>6th Most Common Venue</th>\n",
" <th>7th Most Common Venue</th>\n",
" <th>8th Most Common Venue</th>\n",
" <th>9th Most Common Venue</th>\n",
" <th>10th Most Common Venue</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Trail</td>\n",
" <td>Pub</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Zoo</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Place 1st Most Common Venue 2nd Most Common Venue 3rd Most Common Venue \\\n",
"0 Trail Pub Falafel Restaurant Coffee Shop \n",
"\n",
" 4th Most Common Venue 5th Most Common Venue 6th Most Common Venue \\\n",
"0 Construction & Landscaping Convenience Store Dessert Shop \n",
"\n",
" 7th Most Common Venue 8th Most Common Venue 9th Most Common Venue \\\n",
"0 Dim Sum Restaurant Dog Run Elementary School \n",
"\n",
" 10th Most Common Venue \n",
"0 Zoo "
]
},
"execution_count": 210,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"label5 = clustered_df.loc[clustered_df['Cluster Labels'] == 5,\n",
" clustered_df.columns[[0] + list(range(7, clustered_df.shape[1]))]]\n",
"print(label5.shape)\n",
"label5.head().reset_index(drop=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Cluster 7"
]
},
{
"cell_type": "code",
"execution_count": 211,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(1, 11)\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>Place</th>\n",
" <th>1st Most Common Venue</th>\n",
" <th>2nd Most Common Venue</th>\n",
" <th>3rd Most Common Venue</th>\n",
" <th>4th Most Common Venue</th>\n",
" <th>5th Most Common Venue</th>\n",
" <th>6th Most Common Venue</th>\n",
" <th>7th Most Common Venue</th>\n",
" <th>8th Most Common Venue</th>\n",
" <th>9th Most Common Venue</th>\n",
" <th>10th Most Common Venue</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Saanich Central</td>\n",
" <td>Bank</td>\n",
" <td>Zoo</td>\n",
" <td>Fish &amp; Chips Shop</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Place 1st Most Common Venue 2nd Most Common Venue \\\n",
"0 Saanich Central Bank Zoo \n",
"\n",
" 3rd Most Common Venue 4th Most Common Venue 5th Most Common Venue \\\n",
"0 Fish & Chips Shop Convenience Store Dessert Shop \n",
"\n",
" 6th Most Common Venue 7th Most Common Venue 8th Most Common Venue \\\n",
"0 Dim Sum Restaurant Dog Run Elementary School \n",
"\n",
" 9th Most Common Venue 10th Most Common Venue \n",
"0 Falafel Restaurant Fast Food Restaurant "
]
},
"execution_count": 211,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"label6 = clustered_df.loc[clustered_df['Cluster Labels'] == 6,\n",
" clustered_df.columns[[0] + list(range(7, clustered_df.shape[1]))]]\n",
"print(label6.shape)\n",
"label6.head().reset_index(drop=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Cluster 8"
]
},
{
"cell_type": "code",
"execution_count": 212,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(1, 11)\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>Place</th>\n",
" <th>1st Most Common Venue</th>\n",
" <th>2nd Most Common Venue</th>\n",
" <th>3rd Most Common Venue</th>\n",
" <th>4th Most Common Venue</th>\n",
" <th>5th Most Common Venue</th>\n",
" <th>6th Most Common Venue</th>\n",
" <th>7th Most Common Venue</th>\n",
" <th>8th Most Common Venue</th>\n",
" <th>9th Most Common Venue</th>\n",
" <th>10th Most Common Venue</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Nelson</td>\n",
" <td>Trail</td>\n",
" <td>Zoo</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>Construction &amp; Landscaping</td>\n",
" <td>Convenience Store</td>\n",
" <td>Dessert Shop</td>\n",
" <td>Dim Sum Restaurant</td>\n",
" <td>Dog Run</td>\n",
" <td>Elementary School</td>\n",
" <td>Falafel Restaurant</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Place 1st Most Common Venue 2nd Most Common Venue 3rd Most Common Venue \\\n",
"0 Nelson Trail Zoo Fast Food Restaurant \n",
"\n",
" 4th Most Common Venue 5th Most Common Venue 6th Most Common Venue \\\n",
"0 Construction & Landscaping Convenience Store Dessert Shop \n",
"\n",
" 7th Most Common Venue 8th Most Common Venue 9th Most Common Venue \\\n",
"0 Dim Sum Restaurant Dog Run Elementary School \n",
"\n",
" 10th Most Common Venue \n",
"0 Falafel Restaurant "
]
},
"execution_count": 212,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"label7 = clustered_df.loc[clustered_df['Cluster Labels'] == 7,\n",
" clustered_df.columns[[0] + list(range(7, clustered_df.shape[1]))]]\n",
"print(label7.shape)\n",
"label7.head().reset_index(drop=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Thus, these clusters define the type of locality and can be used by different people to choose their preferably area of interest accordingly. For example, the first cluster involves a locality that has baseball fields, zoos in their most popular nearby venues and hence would be ore suitable for a younger generation, preferably kids in their middle schools. On the contrary, the second cluster involves a locality that has grocery shops, fast food shops and convenience stores as their popular nearby locations, and hence these areas would be more suitable for college students, who would need all of these at an almost daily basis."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### This marks the end of the project. Thank you for your time!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python",
"language": "python",
"name": "conda-env-python-py"
},
"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.6.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment