Created
April 3, 2019 22:38
-
-
Save aish2997/b86f4b2527370d47bfab4bbc9b5d7270 to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"<a href=\"https://cognitiveclass.ai\"><img src = \"https://ibm.box.com/shared/static/9gegpsmnsoo25ikkbl4qzlvlyjbgxs5x.png\" width = 400> </a>\n", | |
"\n", | |
"<h1 align=center><font size = 5>Learning FourSquare API with Python</font></h1>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"## Introduction\n", | |
"\n", | |
"In this lab, you will learn in details how to make calls to the Foursquare API for different purposes. You will learn how to construct a URL to send a request to the API to search for a specific type of venues, to explore a particular venue, to explore a Foursquare user, to explore a geographical location, and to get trending venues around a location. Also, you will learn how to use the visualization library, Folium, to visualize the results." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"## Table of Contents\n", | |
"\n", | |
"1. <a href=\"#item1\">Foursquare API Search Function</a>\n", | |
"2. <a href=\"#item2\">Explore a Given Venue</a> \n", | |
"3. <a href=\"#item3\">Explore a User</a> \n", | |
"4. <a href=\"#item4\">Foursquare API Explore Function</a> \n", | |
"5. <a href=\"#item5\">Get Trending Venues</a> " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"### Import necessary Libraries" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Collecting package metadata: done\n", | |
"Solving environment: done\n", | |
"\n", | |
"## Package Plan ##\n", | |
"\n", | |
" environment location: /home/jupyterlab/conda\n", | |
"\n", | |
" added / updated specs:\n", | |
" - geopy\n", | |
"\n", | |
"\n", | |
"The following packages will be downloaded:\n", | |
"\n", | |
" package | build\n", | |
" ---------------------------|-----------------\n", | |
" ca-certificates-2019.3.9 | hecc5488_0 146 KB conda-forge\n", | |
" certifi-2019.3.9 | py36_0 149 KB conda-forge\n", | |
" conda-4.6.10 | py36_0 899 KB conda-forge\n", | |
" geographiclib-1.49 | py_0 32 KB conda-forge\n", | |
" geopy-1.19.0 | py_0 53 KB conda-forge\n", | |
" openssl-1.1.1b | h14c3975_1 4.0 MB conda-forge\n", | |
" ------------------------------------------------------------\n", | |
" Total: 5.2 MB\n", | |
"\n", | |
"The following NEW packages will be INSTALLED:\n", | |
"\n", | |
" geographiclib conda-forge/noarch::geographiclib-1.49-py_0\n", | |
"\n", | |
"The following packages will be UPDATED:\n", | |
"\n", | |
" ca-certificates 2018.11.29-ha4d7672_0 --> 2019.3.9-hecc5488_0\n", | |
" certifi 2018.11.29-py36_1000 --> 2019.3.9-py36_0\n", | |
" conda 4.6.4-py36_0 --> 4.6.10-py36_0\n", | |
" geopy conda-forge/linux-64::geopy-1.11.0-py~ --> conda-forge/noarch::geopy-1.19.0-py_0\n", | |
" openssl 1.1.1a-h14c3975_1000 --> 1.1.1b-h14c3975_1\n", | |
"\n", | |
"\n", | |
"\n", | |
"Downloading and Extracting Packages\n", | |
"conda-4.6.10 | 899 KB | ##################################### | 100% \n", | |
"ca-certificates-2019 | 146 KB | ##################################### | 100% \n", | |
"openssl-1.1.1b | 4.0 MB | ##################################### | 100% \n", | |
"geopy-1.19.0 | 53 KB | ##################################### | 100% \n", | |
"certifi-2019.3.9 | 149 KB | ##################################### | 100% \n", | |
"geographiclib-1.49 | 32 KB | ##################################### | 100% \n", | |
"Preparing transaction: done\n", | |
"Verifying transaction: done\n", | |
"Executing transaction: done\n", | |
"Collecting package metadata: done\n", | |
"Solving environment: \\ \n", | |
"The environment is inconsistent, please check the package plan carefully\n", | |
"The following packages are causing the inconsistency:\n", | |
"\n", | |
" - defaults/linux-64::anaconda==5.3.1=py37_0\n", | |
" - defaults/linux-64::astropy==3.0.4=py37h14c3975_0\n", | |
" - defaults/linux-64::bkcharts==0.2=py37_0\n", | |
" - defaults/linux-64::blaze==0.11.3=py37_0\n", | |
" - defaults/linux-64::bokeh==0.13.0=py37_0\n", | |
" - defaults/linux-64::bottleneck==1.2.1=py37h035aef0_1\n", | |
" - defaults/linux-64::dask==0.19.1=py37_0\n", | |
" - defaults/linux-64::datashape==0.5.4=py37_1\n", | |
" - defaults/linux-64::mkl-service==1.1.2=py37h90e4bf4_5\n", | |
" - defaults/linux-64::numba==0.39.0=py37h04863e7_0\n", | |
" - defaults/linux-64::numexpr==2.6.8=py37hd89afb7_0\n", | |
" - defaults/linux-64::odo==0.5.1=py37_0\n", | |
" - defaults/linux-64::pytables==3.4.4=py37ha205bf6_0\n", | |
" - defaults/linux-64::pytest-arraydiff==0.2=py37h39e3cac_0\n", | |
" - defaults/linux-64::pytest-astropy==0.4.0=py37_0\n", | |
" - defaults/linux-64::pytest-doctestplus==0.1.3=py37_0\n", | |
" - defaults/linux-64::pywavelets==1.0.0=py37hdd07704_0\n", | |
" - defaults/linux-64::scikit-image==0.14.0=py37hf484d3e_1\n", | |
"done\n", | |
"\n", | |
"# All requested packages already installed.\n", | |
"\n", | |
"Folium installed\n", | |
"Libraries imported.\n" | |
] | |
} | |
], | |
"source": [ | |
"import requests # library to handle requests\n", | |
"import pandas as pd # library for data analsysis\n", | |
"import numpy as np # library to handle data in a vectorized manner\n", | |
"import random # library for random number generation\n", | |
"\n", | |
"!conda install -c conda-forge geopy --yes \n", | |
"from geopy.geocoders import Nominatim # module to convert an address into latitude and longitude values\n", | |
"\n", | |
"# libraries for displaying images\n", | |
"from IPython.display import Image \n", | |
"from IPython.core.display import HTML \n", | |
" \n", | |
"# tranforming json file into a pandas dataframe library\n", | |
"from pandas.io.json import json_normalize\n", | |
"\n", | |
"!conda install -c conda-forge folium=0.5.0 --yes\n", | |
"import folium # plotting library\n", | |
"\n", | |
"print('Folium installed')\n", | |
"print('Libraries imported.')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"### Define Foursquare Credentials and Version" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"##### Make sure that you have created a Foursquare developer account and have your credentials handy" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Your credentails:\n", | |
"CLIENT_ID: H235M5TQJXWJJ20H3HGHH4SOESGQYPRIF2YUZ45NW24EBALB\n", | |
"CLIENT_SECRET:5MVYOVO0FYTUR2LQFUUEGW5FNTLFGBYQWUPRLCCPEJ2O3RRB\n" | |
] | |
} | |
], | |
"source": [ | |
"CLIENT_ID = 'H235M5TQJXWJJ20H3HGHH4SOESGQYPRIF2YUZ45NW24EBALB' # your Foursquare ID\n", | |
"CLIENT_SECRET = '5MVYOVO0FYTUR2LQFUUEGW5FNTLFGBYQWUPRLCCPEJ2O3RRB' # your Foursquare Secret\n", | |
"VERSION = '20180604'\n", | |
"LIMIT = 30\n", | |
"print('Your credentails:')\n", | |
"print('CLIENT_ID: ' + CLIENT_ID)\n", | |
"print('CLIENT_SECRET:' + CLIENT_SECRET)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
" " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Let's again assume that you are staying at the Conrad hotel. So let's start by converting the Contrad Hotel's address to its latitude and longitude coordinates." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"In order to define an instance of the geocoder, we need to define a user_agent. We will name our agent <em>foursquare_agent</em>, as shown below." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"40.7149555 -74.0153365\n" | |
] | |
} | |
], | |
"source": [ | |
"address = '102 North End Ave, New York, NY'\n", | |
"\n", | |
"geolocator = Nominatim(user_agent=\"foursquare_agent\")\n", | |
"location = geolocator.geocode(address)\n", | |
"latitude = location.latitude\n", | |
"longitude = location.longitude\n", | |
"print(latitude, longitude)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
" " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"<a id=\"item1\"></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"## 1. Search for a specific venue category\n", | |
"> `https://api.foursquare.com/v2/venues/`**search**`?client_id=`**CLIENT_ID**`&client_secret=`**CLIENT_SECRET**`&ll=`**LATITUDE**`,`**LONGITUDE**`&v=`**VERSION**`&query=`**QUERY**`&radius=`**RADIUS**`&limit=`**LIMIT**" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Now, let's assume that it is lunch time, and you are craving Italian food. So, let's define a query to search for Italian food that is within 500 metres from the Conrad Hotel. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Italian .... OK!\n" | |
] | |
} | |
], | |
"source": [ | |
"search_query = 'Italian'\n", | |
"radius = 500\n", | |
"print(search_query + ' .... OK!')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Define the corresponding URL" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'https://api.foursquare.com/v2/venues/search?client_id=H235M5TQJXWJJ20H3HGHH4SOESGQYPRIF2YUZ45NW24EBALB&client_secret=5MVYOVO0FYTUR2LQFUUEGW5FNTLFGBYQWUPRLCCPEJ2O3RRB&ll=40.7149555,-74.0153365&v=20180604&query=Italian&radius=500&limit=30'" | |
] | |
}, | |
"execution_count": 6, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"url = 'https://api.foursquare.com/v2/venues/search?client_id={}&client_secret={}&ll={},{}&v={}&query={}&radius={}&limit={}'.format(CLIENT_ID, CLIENT_SECRET, latitude, longitude, VERSION, search_query, radius, LIMIT)\n", | |
"url" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Send the GET Request and examine the results" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'meta': {'code': 200, 'requestId': '5ca531dddd57977ccc5c4d23'},\n", | |
" 'response': {'venues': [{'id': '4fa862b3e4b0ebff2f749f06',\n", | |
" 'name': \"Harry's Italian Pizza Bar\",\n", | |
" 'location': {'address': '225 Murray St',\n", | |
" 'lat': 40.71521779064671,\n", | |
" 'lng': -74.01473940209351,\n", | |
" 'labeledLatLngs': [{'label': 'display',\n", | |
" 'lat': 40.71521779064671,\n", | |
" 'lng': -74.01473940209351}],\n", | |
" 'distance': 58,\n", | |
" 'postalCode': '10282',\n", | |
" 'cc': 'US',\n", | |
" 'city': 'New York',\n", | |
" 'state': 'NY',\n", | |
" 'country': 'United States',\n", | |
" 'formattedAddress': ['225 Murray St',\n", | |
" 'New York, NY 10282',\n", | |
" 'United States']},\n", | |
" 'categories': [{'id': '4bf58dd8d48988d1ca941735',\n", | |
" 'name': 'Pizza Place',\n", | |
" 'pluralName': 'Pizza Places',\n", | |
" 'shortName': 'Pizza',\n", | |
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/pizza_',\n", | |
" 'suffix': '.png'},\n", | |
" 'primary': True}],\n", | |
" 'delivery': {'id': '294544',\n", | |
" 'url': 'https://www.seamless.com/menu/harrys-italian-pizza-bar-225-murray-st-new-york/294544?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=294544',\n", | |
" 'provider': {'name': 'seamless',\n", | |
" 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n", | |
" 'sizes': [40, 50],\n", | |
" 'name': '/delivery_provider_seamless_20180129.png'}}},\n", | |
" 'referralId': 'v-1554330077',\n", | |
" 'hasPerk': False},\n", | |
" {'id': '4f3232e219836c91c7bfde94',\n", | |
" 'name': 'Conca Cucina Italian Restaurant',\n", | |
" 'location': {'address': '63 W Broadway',\n", | |
" 'lat': 40.71446,\n", | |
" 'lng': -74.010086,\n", | |
" 'labeledLatLngs': [{'label': 'display',\n", | |
" 'lat': 40.71446,\n", | |
" 'lng': -74.010086}],\n", | |
" 'distance': 446,\n", | |
" 'postalCode': '10007',\n", | |
" 'cc': 'US',\n", | |
" 'city': 'New York',\n", | |
" 'state': 'NY',\n", | |
" 'country': 'United States',\n", | |
" 'formattedAddress': ['63 W Broadway',\n", | |
" 'New York, NY 10007',\n", | |
" 'United States']},\n", | |
" 'categories': [{'id': '4d4b7105d754a06374d81259',\n", | |
" 'name': 'Food',\n", | |
" 'pluralName': 'Food',\n", | |
" 'shortName': 'Food',\n", | |
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/default_',\n", | |
" 'suffix': '.png'},\n", | |
" 'primary': True}],\n", | |
" 'referralId': 'v-1554330077',\n", | |
" 'hasPerk': False},\n", | |
" {'id': '3fd66200f964a520f4e41ee3',\n", | |
" 'name': 'Ecco',\n", | |
" 'location': {'address': '124 Chambers St',\n", | |
" 'crossStreet': 'btwn Church St & W Broadway',\n", | |
" 'lat': 40.71533713859952,\n", | |
" 'lng': -74.00884766217825,\n", | |
" 'labeledLatLngs': [{'label': 'display',\n", | |
" 'lat': 40.71533713859952,\n", | |
" 'lng': -74.00884766217825}],\n", | |
" 'distance': 549,\n", | |
" 'postalCode': '10007',\n", | |
" 'cc': 'US',\n", | |
" 'city': 'New York',\n", | |
" 'state': 'NY',\n", | |
" 'country': 'United States',\n", | |
" 'formattedAddress': ['124 Chambers St (btwn Church St & W Broadway)',\n", | |
" 'New York, NY 10007',\n", | |
" 'United States']},\n", | |
" 'categories': [{'id': '4bf58dd8d48988d110941735',\n", | |
" 'name': 'Italian Restaurant',\n", | |
" 'pluralName': 'Italian Restaurants',\n", | |
" 'shortName': 'Italian',\n", | |
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/italian_',\n", | |
" 'suffix': '.png'},\n", | |
" 'primary': True}],\n", | |
" 'referralId': 'v-1554330077',\n", | |
" 'hasPerk': False}]}}" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"results = requests.get(url).json()\n", | |
"results" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Get relevant part of JSON and transform it into a *pandas* dataframe" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"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>categories</th>\n", | |
" <th>delivery.id</th>\n", | |
" <th>delivery.provider.icon.name</th>\n", | |
" <th>delivery.provider.icon.prefix</th>\n", | |
" <th>delivery.provider.icon.sizes</th>\n", | |
" <th>delivery.provider.name</th>\n", | |
" <th>delivery.url</th>\n", | |
" <th>hasPerk</th>\n", | |
" <th>id</th>\n", | |
" <th>location.address</th>\n", | |
" <th>...</th>\n", | |
" <th>location.crossStreet</th>\n", | |
" <th>location.distance</th>\n", | |
" <th>location.formattedAddress</th>\n", | |
" <th>location.labeledLatLngs</th>\n", | |
" <th>location.lat</th>\n", | |
" <th>location.lng</th>\n", | |
" <th>location.postalCode</th>\n", | |
" <th>location.state</th>\n", | |
" <th>name</th>\n", | |
" <th>referralId</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>[{'id': '4bf58dd8d48988d1ca941735', 'name': 'P...</td>\n", | |
" <td>294544</td>\n", | |
" <td>/delivery_provider_seamless_20180129.png</td>\n", | |
" <td>https://fastly.4sqi.net/img/general/cap/</td>\n", | |
" <td>[40, 50]</td>\n", | |
" <td>seamless</td>\n", | |
" <td>https://www.seamless.com/menu/harrys-italian-p...</td>\n", | |
" <td>False</td>\n", | |
" <td>4fa862b3e4b0ebff2f749f06</td>\n", | |
" <td>225 Murray St</td>\n", | |
" <td>...</td>\n", | |
" <td>NaN</td>\n", | |
" <td>58</td>\n", | |
" <td>[225 Murray St, New York, NY 10282, United Sta...</td>\n", | |
" <td>[{'label': 'display', 'lat': 40.71521779064671...</td>\n", | |
" <td>40.715218</td>\n", | |
" <td>-74.014739</td>\n", | |
" <td>10282</td>\n", | |
" <td>NY</td>\n", | |
" <td>Harry's Italian Pizza Bar</td>\n", | |
" <td>v-1554330077</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>[{'id': '4d4b7105d754a06374d81259', 'name': 'F...</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>False</td>\n", | |
" <td>4f3232e219836c91c7bfde94</td>\n", | |
" <td>63 W Broadway</td>\n", | |
" <td>...</td>\n", | |
" <td>NaN</td>\n", | |
" <td>446</td>\n", | |
" <td>[63 W Broadway, New York, NY 10007, United Sta...</td>\n", | |
" <td>[{'label': 'display', 'lat': 40.71446, 'lng': ...</td>\n", | |
" <td>40.714460</td>\n", | |
" <td>-74.010086</td>\n", | |
" <td>10007</td>\n", | |
" <td>NY</td>\n", | |
" <td>Conca Cucina Italian Restaurant</td>\n", | |
" <td>v-1554330077</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>[{'id': '4bf58dd8d48988d110941735', 'name': 'I...</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>False</td>\n", | |
" <td>3fd66200f964a520f4e41ee3</td>\n", | |
" <td>124 Chambers St</td>\n", | |
" <td>...</td>\n", | |
" <td>btwn Church St & W Broadway</td>\n", | |
" <td>549</td>\n", | |
" <td>[124 Chambers St (btwn Church St & W Broadway)...</td>\n", | |
" <td>[{'label': 'display', 'lat': 40.71533713859952...</td>\n", | |
" <td>40.715337</td>\n", | |
" <td>-74.008848</td>\n", | |
" <td>10007</td>\n", | |
" <td>NY</td>\n", | |
" <td>Ecco</td>\n", | |
" <td>v-1554330077</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"<p>3 rows × 23 columns</p>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" categories delivery.id \\\n", | |
"0 [{'id': '4bf58dd8d48988d1ca941735', 'name': 'P... 294544 \n", | |
"1 [{'id': '4d4b7105d754a06374d81259', 'name': 'F... NaN \n", | |
"2 [{'id': '4bf58dd8d48988d110941735', 'name': 'I... NaN \n", | |
"\n", | |
" delivery.provider.icon.name \\\n", | |
"0 /delivery_provider_seamless_20180129.png \n", | |
"1 NaN \n", | |
"2 NaN \n", | |
"\n", | |
" delivery.provider.icon.prefix delivery.provider.icon.sizes \\\n", | |
"0 https://fastly.4sqi.net/img/general/cap/ [40, 50] \n", | |
"1 NaN NaN \n", | |
"2 NaN NaN \n", | |
"\n", | |
" delivery.provider.name delivery.url \\\n", | |
"0 seamless https://www.seamless.com/menu/harrys-italian-p... \n", | |
"1 NaN NaN \n", | |
"2 NaN NaN \n", | |
"\n", | |
" hasPerk id location.address ... \\\n", | |
"0 False 4fa862b3e4b0ebff2f749f06 225 Murray St ... \n", | |
"1 False 4f3232e219836c91c7bfde94 63 W Broadway ... \n", | |
"2 False 3fd66200f964a520f4e41ee3 124 Chambers St ... \n", | |
"\n", | |
" location.crossStreet location.distance \\\n", | |
"0 NaN 58 \n", | |
"1 NaN 446 \n", | |
"2 btwn Church St & W Broadway 549 \n", | |
"\n", | |
" location.formattedAddress \\\n", | |
"0 [225 Murray St, New York, NY 10282, United Sta... \n", | |
"1 [63 W Broadway, New York, NY 10007, United Sta... \n", | |
"2 [124 Chambers St (btwn Church St & W Broadway)... \n", | |
"\n", | |
" location.labeledLatLngs location.lat \\\n", | |
"0 [{'label': 'display', 'lat': 40.71521779064671... 40.715218 \n", | |
"1 [{'label': 'display', 'lat': 40.71446, 'lng': ... 40.714460 \n", | |
"2 [{'label': 'display', 'lat': 40.71533713859952... 40.715337 \n", | |
"\n", | |
" location.lng location.postalCode location.state \\\n", | |
"0 -74.014739 10282 NY \n", | |
"1 -74.010086 10007 NY \n", | |
"2 -74.008848 10007 NY \n", | |
"\n", | |
" name referralId \n", | |
"0 Harry's Italian Pizza Bar v-1554330077 \n", | |
"1 Conca Cucina Italian Restaurant v-1554330077 \n", | |
"2 Ecco v-1554330077 \n", | |
"\n", | |
"[3 rows x 23 columns]" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# assign relevant part of JSON to venues\n", | |
"venues = results['response']['venues']\n", | |
"\n", | |
"# tranform venues into a dataframe\n", | |
"dataframe = json_normalize(venues)\n", | |
"dataframe.head()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Define information of interest and filter dataframe" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>name</th>\n", | |
" <th>categories</th>\n", | |
" <th>address</th>\n", | |
" <th>cc</th>\n", | |
" <th>city</th>\n", | |
" <th>country</th>\n", | |
" <th>crossStreet</th>\n", | |
" <th>distance</th>\n", | |
" <th>formattedAddress</th>\n", | |
" <th>labeledLatLngs</th>\n", | |
" <th>lat</th>\n", | |
" <th>lng</th>\n", | |
" <th>postalCode</th>\n", | |
" <th>state</th>\n", | |
" <th>id</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>Harry's Italian Pizza Bar</td>\n", | |
" <td>Pizza Place</td>\n", | |
" <td>225 Murray St</td>\n", | |
" <td>US</td>\n", | |
" <td>New York</td>\n", | |
" <td>United States</td>\n", | |
" <td>NaN</td>\n", | |
" <td>58</td>\n", | |
" <td>[225 Murray St, New York, NY 10282, United Sta...</td>\n", | |
" <td>[{'label': 'display', 'lat': 40.71521779064671...</td>\n", | |
" <td>40.715218</td>\n", | |
" <td>-74.014739</td>\n", | |
" <td>10282</td>\n", | |
" <td>NY</td>\n", | |
" <td>4fa862b3e4b0ebff2f749f06</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>Conca Cucina Italian Restaurant</td>\n", | |
" <td>Food</td>\n", | |
" <td>63 W Broadway</td>\n", | |
" <td>US</td>\n", | |
" <td>New York</td>\n", | |
" <td>United States</td>\n", | |
" <td>NaN</td>\n", | |
" <td>446</td>\n", | |
" <td>[63 W Broadway, New York, NY 10007, United Sta...</td>\n", | |
" <td>[{'label': 'display', 'lat': 40.71446, 'lng': ...</td>\n", | |
" <td>40.714460</td>\n", | |
" <td>-74.010086</td>\n", | |
" <td>10007</td>\n", | |
" <td>NY</td>\n", | |
" <td>4f3232e219836c91c7bfde94</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>Ecco</td>\n", | |
" <td>Italian Restaurant</td>\n", | |
" <td>124 Chambers St</td>\n", | |
" <td>US</td>\n", | |
" <td>New York</td>\n", | |
" <td>United States</td>\n", | |
" <td>btwn Church St & W Broadway</td>\n", | |
" <td>549</td>\n", | |
" <td>[124 Chambers St (btwn Church St & W Broadway)...</td>\n", | |
" <td>[{'label': 'display', 'lat': 40.71533713859952...</td>\n", | |
" <td>40.715337</td>\n", | |
" <td>-74.008848</td>\n", | |
" <td>10007</td>\n", | |
" <td>NY</td>\n", | |
" <td>3fd66200f964a520f4e41ee3</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" name categories address cc \\\n", | |
"0 Harry's Italian Pizza Bar Pizza Place 225 Murray St US \n", | |
"1 Conca Cucina Italian Restaurant Food 63 W Broadway US \n", | |
"2 Ecco Italian Restaurant 124 Chambers St US \n", | |
"\n", | |
" city country crossStreet distance \\\n", | |
"0 New York United States NaN 58 \n", | |
"1 New York United States NaN 446 \n", | |
"2 New York United States btwn Church St & W Broadway 549 \n", | |
"\n", | |
" formattedAddress \\\n", | |
"0 [225 Murray St, New York, NY 10282, United Sta... \n", | |
"1 [63 W Broadway, New York, NY 10007, United Sta... \n", | |
"2 [124 Chambers St (btwn Church St & W Broadway)... \n", | |
"\n", | |
" labeledLatLngs lat lng \\\n", | |
"0 [{'label': 'display', 'lat': 40.71521779064671... 40.715218 -74.014739 \n", | |
"1 [{'label': 'display', 'lat': 40.71446, 'lng': ... 40.714460 -74.010086 \n", | |
"2 [{'label': 'display', 'lat': 40.71533713859952... 40.715337 -74.008848 \n", | |
"\n", | |
" postalCode state id \n", | |
"0 10282 NY 4fa862b3e4b0ebff2f749f06 \n", | |
"1 10007 NY 4f3232e219836c91c7bfde94 \n", | |
"2 10007 NY 3fd66200f964a520f4e41ee3 " | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# keep only columns that include venue name, and anything that is associated with location\n", | |
"filtered_columns = ['name', 'categories'] + [col for col in dataframe.columns if col.startswith('location.')] + ['id']\n", | |
"dataframe_filtered = dataframe.loc[:, filtered_columns]\n", | |
"\n", | |
"# function that extracts the category of the venue\n", | |
"def get_category_type(row):\n", | |
" try:\n", | |
" categories_list = row['categories']\n", | |
" except:\n", | |
" categories_list = row['venue.categories']\n", | |
" \n", | |
" if len(categories_list) == 0:\n", | |
" return None\n", | |
" else:\n", | |
" return categories_list[0]['name']\n", | |
"\n", | |
"# filter the category for each row\n", | |
"dataframe_filtered['categories'] = dataframe_filtered.apply(get_category_type, axis=1)\n", | |
"\n", | |
"# clean column names by keeping only last term\n", | |
"dataframe_filtered.columns = [column.split('.')[-1] for column in dataframe_filtered.columns]\n", | |
"\n", | |
"dataframe_filtered" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Let's visualize the Italian restaurants that are nearby" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"0 Harry's Italian Pizza Bar\n", | |
"1 Conca Cucina Italian Restaurant\n", | |
"2 Ecco\n", | |
"Name: name, dtype: object" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"dataframe_filtered.name" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMzkwZTljMGMwODhiNDgwNTljYTg4MzM1ZmMxOWU1Y2YgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzM5MGU5YzBjMDg4YjQ4MDU5Y2E4ODMzNWZjMTllNWNmIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8zOTBlOWMwYzA4OGI0ODA1OWNhODgzMzVmYzE5ZTVjZiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8zOTBlOWMwYzA4OGI0ODA1OWNhODgzMzVmYzE5ZTVjZicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzE0OTU1NSwtNzQuMDE1MzM2NV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfNGY5NzNiNDNhZDZmNDVmZmExYmE5ZDZmZmI2Y2RmOWMgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzkwZTljMGMwODhiNDgwNTljYTg4MzM1ZmMxOWU1Y2YpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M1YjQ2YTBkZGVmNTRiZjZhZGM5YjY0MDFhODVkOTllID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE0OTU1NSwtNzQuMDE1MzM2NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM5MGU5YzBjMDg4YjQ4MDU5Y2E4ODMzNWZjMTllNWNmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc0MzlkN2I0ZjE5ZDQyOGRiOTllM2ViOTYxNzEwNjk0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY4MjkyNDA3MjYyYjQyYzlhMjcwOTgxMmQ3MTJmOWRiID0gJCgnPGRpdiBpZD0iaHRtbF82ODI5MjQwNzI2MmI0MmM5YTI3MDk4MTJkNzEyZjlkYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29ucmFkIEhvdGVsPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NDM5ZDdiNGYxOWQ0MjhkYjk5ZTNlYjk2MTcxMDY5NC5zZXRDb250ZW50KGh0bWxfNjgyOTI0MDcyNjJiNDJjOWEyNzA5ODEyZDcxMmY5ZGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzViNDZhMGRkZWY1NGJmNmFkYzliNjQwMWE4NWQ5OWUuYmluZFBvcHVwKHBvcHVwXzc0MzlkN2I0ZjE5ZDQyOGRiOTllM2ViOTYxNzEwNjk0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdkMjkwYTcyZDhhMjRmNDc4ODFmYTAxYjJkZjMxZDgwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1MjE3NzkwNjQ2NzEsLTc0LjAxNDczOTQwMjA5MzUxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM5MGU5YzBjMDg4YjQ4MDU5Y2E4ODMzNWZjMTllNWNmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkyYzU4ZjRmMjc0ODQ1OGE4OGQxZjhlZTcxMWM3NzlhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VkYjhkODgyZTU3MTQxMjY5ZDY3NDA3NWUxYTNiNzViID0gJCgnPGRpdiBpZD0iaHRtbF9lZGI4ZDg4MmU1NzE0MTI2OWQ2NzQwNzVlMWEzYjc1YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGl6emEgUGxhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkyYzU4ZjRmMjc0ODQ1OGE4OGQxZjhlZTcxMWM3NzlhLnNldENvbnRlbnQoaHRtbF9lZGI4ZDg4MmU1NzE0MTI2OWQ2NzQwNzVlMWEzYjc1Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZDI5MGE3MmQ4YTI0ZjQ3ODgxZmEwMWIyZGYzMWQ4MC5iaW5kUG9wdXAocG9wdXBfOTJjNThmNGYyNzQ4NDU4YTg4ZDFmOGVlNzExYzc3OWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjQ1NGM1ODkyODVkNDU5ZjhkMDRmMzMwN2Y3YjBjODQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTQ0NiwtNzQuMDEwMDg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM5MGU5YzBjMDg4YjQ4MDU5Y2E4ODMzNWZjMTllNWNmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M3MzQ3NmQ0ZDY1ZjQwMjJhYTZlZGMwNzJkN2Y1YmJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E1ODAyYTU3MTM3NjQ2MDQ5Zjk0ZDQzYzVkNmQwYmQ5ID0gJCgnPGRpdiBpZD0iaHRtbF9hNTgwMmE1NzEzNzY0NjA0OWY5NGQ0M2M1ZDZkMGJkOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9vZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzczNDc2ZDRkNjVmNDAyMmFhNmVkYzA3MmQ3ZjViYmEuc2V0Q29udGVudChodG1sX2E1ODAyYTU3MTM3NjQ2MDQ5Zjk0ZDQzYzVkNmQwYmQ5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y0NTRjNTg5Mjg1ZDQ1OWY4ZDA0ZjMzMDdmN2IwYzg0LmJpbmRQb3B1cChwb3B1cF9jNzM0NzZkNGQ2NWY0MDIyYWE2ZWRjMDcyZDdmNWJiYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82M2U1NGI3ZDliMWI0YWQwYTcwOTY5MzNmN2JkNWE5YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxNTMzNzEzODU5OTUyLC03NC4wMDg4NDc2NjIxNzgyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zOTBlOWMwYzA4OGI0ODA1OWNhODgzMzVmYzE5ZTVjZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNDNhNmFiMjBmMDA0MGEyYTdlYjBiMDAzNTRjZDZmYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MDY1NjgxM2Q4MTE0ODc4OWNmZmE5NTBjNzIyYjc4MyA9ICQoJzxkaXYgaWQ9Imh0bWxfOTA2NTY4MTNkODExNDg3ODljZmZhOTUwYzcyMmI3ODMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkl0YWxpYW4gUmVzdGF1cmFudDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDQzYTZhYjIwZjAwNDBhMmE3ZWIwYjAwMzU0Y2Q2ZmEuc2V0Q29udGVudChodG1sXzkwNjU2ODEzZDgxMTQ4Nzg5Y2ZmYTk1MGM3MjJiNzgzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYzZTU0YjdkOWIxYjRhZDBhNzA5NjkzM2Y3YmQ1YTliLmJpbmRQb3B1cChwb3B1cF8wNDNhNmFiMjBmMDA0MGEyYTdlYjBiMDAzNTRjZDZmYSk7CgogICAgICAgICAgICAKICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
], | |
"text/plain": [ | |
"<folium.folium.Map at 0x7febc80db240>" | |
] | |
}, | |
"execution_count": 10, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"venues_map = folium.Map(location=[latitude, longitude], zoom_start=13) # generate map centred around the Conrad Hotel\n", | |
"\n", | |
"# add a red circle marker to represent the Conrad Hotel\n", | |
"folium.features.CircleMarker(\n", | |
" [latitude, longitude],\n", | |
" radius=10,\n", | |
" color='red',\n", | |
" popup='Conrad Hotel',\n", | |
" fill = True,\n", | |
" fill_color = 'red',\n", | |
" fill_opacity = 0.6\n", | |
").add_to(venues_map)\n", | |
"\n", | |
"# add the Italian restaurants as blue circle markers\n", | |
"for lat, lng, label in zip(dataframe_filtered.lat, dataframe_filtered.lng, dataframe_filtered.categories):\n", | |
" folium.features.CircleMarker(\n", | |
" [lat, lng],\n", | |
" radius=5,\n", | |
" color='blue',\n", | |
" popup=label,\n", | |
" fill = True,\n", | |
" fill_color='blue',\n", | |
" fill_opacity=0.6\n", | |
" ).add_to(venues_map)\n", | |
"\n", | |
"# display map\n", | |
"venues_map" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
" " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"<a id=\"item2\"></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"## 2. Explore a Given Venue\n", | |
"> `https://api.foursquare.com/v2/venues/`**VENUE_ID**`?client_id=`**CLIENT_ID**`&client_secret=`**CLIENT_SECRET**`&v=`**VERSION**" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"### A. Let's explore the closest Italian restaurant -- _Harry's Italian Pizza Bar_" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'https://api.foursquare.com/v2/venues/4fa862b3e4b0ebff2f749f06?client_id=H235M5TQJXWJJ20H3HGHH4SOESGQYPRIF2YUZ45NW24EBALB&client_secret=5MVYOVO0FYTUR2LQFUUEGW5FNTLFGBYQWUPRLCCPEJ2O3RRB&v=20180604'" | |
] | |
}, | |
"execution_count": 11, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"venue_id = '4fa862b3e4b0ebff2f749f06' # ID of Harry's Italian Pizza Bar\n", | |
"url = 'https://api.foursquare.com/v2/venues/{}?client_id={}&client_secret={}&v={}'.format(venue_id, CLIENT_ID, CLIENT_SECRET, VERSION)\n", | |
"url" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Send GET request for result" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"dict_keys(['id', 'name', 'contact', 'location', 'canonicalUrl', 'categories', 'verified', 'stats', 'url', 'price', 'hasMenu', 'likes', 'dislike', 'ok', 'rating', 'ratingColor', 'ratingSignals', 'delivery', 'menu', 'allowMenuUrlEdit', 'beenHere', 'specials', 'photos', 'reasons', 'hereNow', 'createdAt', 'tips', 'shortUrl', 'timeZone', 'listed', 'hours', 'popular', 'pageUpdates', 'inbox', 'attributes', 'bestPhoto', 'colors'])\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"{'id': '4fa862b3e4b0ebff2f749f06',\n", | |
" 'name': \"Harry's Italian Pizza Bar\",\n", | |
" 'contact': {'phone': '2126081007', 'formattedPhone': '(212) 608-1007'},\n", | |
" 'location': {'address': '225 Murray St',\n", | |
" 'lat': 40.71521779064671,\n", | |
" 'lng': -74.01473940209351,\n", | |
" 'labeledLatLngs': [{'label': 'display',\n", | |
" 'lat': 40.71521779064671,\n", | |
" 'lng': -74.01473940209351}],\n", | |
" 'postalCode': '10282',\n", | |
" 'cc': 'US',\n", | |
" 'city': 'New York',\n", | |
" 'state': 'NY',\n", | |
" 'country': 'United States',\n", | |
" 'formattedAddress': ['225 Murray St',\n", | |
" 'New York, NY 10282',\n", | |
" 'United States']},\n", | |
" 'canonicalUrl': 'https://foursquare.com/v/harrys-italian-pizza-bar/4fa862b3e4b0ebff2f749f06',\n", | |
" 'categories': [{'id': '4bf58dd8d48988d1ca941735',\n", | |
" 'name': 'Pizza Place',\n", | |
" 'pluralName': 'Pizza Places',\n", | |
" 'shortName': 'Pizza',\n", | |
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/pizza_',\n", | |
" 'suffix': '.png'},\n", | |
" 'primary': True},\n", | |
" {'id': '4bf58dd8d48988d110941735',\n", | |
" 'name': 'Italian Restaurant',\n", | |
" 'pluralName': 'Italian Restaurants',\n", | |
" 'shortName': 'Italian',\n", | |
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/italian_',\n", | |
" 'suffix': '.png'}}],\n", | |
" 'verified': False,\n", | |
" 'stats': {'tipCount': 56},\n", | |
" 'url': 'http://harrysitalian.com',\n", | |
" 'price': {'tier': 2, 'message': 'Moderate', 'currency': '$'},\n", | |
" 'hasMenu': True,\n", | |
" 'likes': {'count': 119,\n", | |
" 'groups': [{'type': 'others', 'count': 119, 'items': []}],\n", | |
" 'summary': '119 Likes'},\n", | |
" 'dislike': False,\n", | |
" 'ok': False,\n", | |
" 'rating': 7.1,\n", | |
" 'ratingColor': 'C5DE35',\n", | |
" 'ratingSignals': 211,\n", | |
" 'delivery': {'id': '294544',\n", | |
" 'url': 'https://www.seamless.com/menu/harrys-italian-pizza-bar-225-murray-st-new-york/294544?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=294544',\n", | |
" 'provider': {'name': 'seamless',\n", | |
" 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n", | |
" 'sizes': [40, 50],\n", | |
" 'name': '/delivery_provider_seamless_20180129.png'}}},\n", | |
" 'menu': {'type': 'Menu',\n", | |
" 'label': 'Menu',\n", | |
" 'anchor': 'View Menu',\n", | |
" 'url': 'https://foursquare.com/v/harrys-italian-pizza-bar/4fa862b3e4b0ebff2f749f06/menu',\n", | |
" 'mobileUrl': 'https://foursquare.com/v/4fa862b3e4b0ebff2f749f06/device_menu'},\n", | |
" 'allowMenuUrlEdit': True,\n", | |
" 'beenHere': {'count': 0,\n", | |
" 'unconfirmedCount': 0,\n", | |
" 'marked': False,\n", | |
" 'lastCheckinExpiredAt': 0},\n", | |
" 'specials': {'count': 0, 'items': []},\n", | |
" 'photos': {'count': 147,\n", | |
" 'groups': [{'type': 'checkin',\n", | |
" 'name': \"Friends' check-in photos\",\n", | |
" 'count': 0,\n", | |
" 'items': []},\n", | |
" {'type': 'venue',\n", | |
" 'name': 'Venue photos',\n", | |
" 'count': 147,\n", | |
" 'items': [{'id': '4fad980de4b091b4626c3633',\n", | |
" 'createdAt': 1336776717,\n", | |
" 'source': {'name': 'Foursquare for Android',\n", | |
" 'url': 'https://foursquare.com/download/#/android'},\n", | |
" 'prefix': 'https://fastly.4sqi.net/img/general/',\n", | |
" 'suffix': '/ya1iQFI7pLjuIJp1PGDKlrZS3OJdHCF7tpILMmjv_2w.jpg',\n", | |
" 'width': 480,\n", | |
" 'height': 640,\n", | |
" 'user': {'id': '13676709',\n", | |
" 'firstName': 'Leony',\n", | |
" 'lastName': 'Naciri',\n", | |
" 'gender': 'none',\n", | |
" 'photo': {'prefix': 'https://fastly.4sqi.net/img/user/',\n", | |
" 'suffix': '/T0ANFNGNMCHUDEUE.jpg'}},\n", | |
" 'visibility': 'public'}]}],\n", | |
" 'summary': '0 photos'},\n", | |
" 'reasons': {'count': 1,\n", | |
" 'items': [{'summary': 'Lots of people like this place',\n", | |
" 'type': 'general',\n", | |
" 'reasonName': 'rawLikesReason'}]},\n", | |
" 'hereNow': {'count': 1,\n", | |
" 'summary': 'One other person is here',\n", | |
" 'groups': [{'type': 'others',\n", | |
" 'name': 'Other people here',\n", | |
" 'count': 1,\n", | |
" 'items': []}]},\n", | |
" 'createdAt': 1336435379,\n", | |
" 'tips': {'count': 56,\n", | |
" 'groups': [{'type': 'others',\n", | |
" 'name': 'All tips',\n", | |
" 'count': 56,\n", | |
" 'items': [{'id': '53d27909498e0523841340b6',\n", | |
" 'createdAt': 1406302473,\n", | |
" 'text': \"Harry's Italian Pizza bar is known for it's amazing pizza, but did you know that the brunches here are amazing too? Try the Nutella French toast and we know you'll be sold.\",\n", | |
" 'type': 'user',\n", | |
" 'canonicalUrl': 'https://foursquare.com/item/53d27909498e0523841340b6',\n", | |
" 'lang': 'en',\n", | |
" 'likes': {'count': 4,\n", | |
" 'groups': [{'type': 'others',\n", | |
" 'count': 4,\n", | |
" 'items': [{'id': '369426',\n", | |
" 'firstName': 'P.',\n", | |
" 'lastName': 'M.',\n", | |
" 'gender': 'male',\n", | |
" 'photo': {'prefix': 'https://fastly.4sqi.net/img/user/',\n", | |
" 'suffix': '/JPQYUWJKUT0H2OO4.jpg'}},\n", | |
" {'id': '87587879',\n", | |
" 'firstName': 'Diane',\n", | |
" 'lastName': 'Danneels',\n", | |
" 'gender': 'female',\n", | |
" 'photo': {'prefix': 'https://fastly.4sqi.net/img/user/',\n", | |
" 'suffix': '/87587879-ESLRSZLQ2CBE2P4W.jpg'}},\n", | |
" {'id': '87591341',\n", | |
" 'firstName': 'Tim',\n", | |
" 'lastName': 'Sheehan',\n", | |
" 'gender': 'male',\n", | |
" 'photo': {'prefix': 'https://fastly.4sqi.net/img/user/',\n", | |
" 'suffix': '/-Z4YK4VKE0JSVXIY1.jpg'}},\n", | |
" {'id': '87473404',\n", | |
" 'firstName': 'TenantKing.com',\n", | |
" 'gender': 'none',\n", | |
" 'photo': {'prefix': 'https://fastly.4sqi.net/img/user/',\n", | |
" 'suffix': '/87473404-HI5DTBTK0HX401CA.png'},\n", | |
" 'type': 'page'}]}],\n", | |
" 'summary': '4 likes'},\n", | |
" 'logView': True,\n", | |
" 'agreeCount': 4,\n", | |
" 'disagreeCount': 0,\n", | |
" 'todo': {'count': 0},\n", | |
" 'user': {'id': '87473404',\n", | |
" 'firstName': 'TenantKing.com',\n", | |
" 'gender': 'none',\n", | |
" 'photo': {'prefix': 'https://fastly.4sqi.net/img/user/',\n", | |
" 'suffix': '/87473404-HI5DTBTK0HX401CA.png'},\n", | |
" 'type': 'page'}}]}]},\n", | |
" 'shortUrl': 'http://4sq.com/JNblHV',\n", | |
" 'timeZone': 'America/New_York',\n", | |
" 'listed': {'count': 51,\n", | |
" 'groups': [{'type': 'others',\n", | |
" 'name': 'Lists from other people',\n", | |
" 'count': 51,\n", | |
" 'items': [{'id': '4fa32fd0e4b04193744746b1',\n", | |
" 'name': 'Manhattan Haunts',\n", | |
" 'description': '',\n", | |
" 'type': 'others',\n", | |
" 'user': {'id': '24592223',\n", | |
" 'firstName': 'Becca',\n", | |
" 'lastName': 'McArthur',\n", | |
" 'gender': 'female',\n", | |
" 'photo': {'prefix': 'https://fastly.4sqi.net/img/user/',\n", | |
" 'suffix': '/24592223-RAW2UYM0GIB1U40K.jpg'}},\n", | |
" 'editable': False,\n", | |
" 'public': True,\n", | |
" 'collaborative': False,\n", | |
" 'url': '/becca_mcarthur/list/manhattan-haunts',\n", | |
" 'canonicalUrl': 'https://foursquare.com/becca_mcarthur/list/manhattan-haunts',\n", | |
" 'createdAt': 1336094672,\n", | |
" 'updatedAt': 1380845377,\n", | |
" 'photo': {'id': '4e8cc9461081e3b3544e12e5',\n", | |
" 'createdAt': 1317849414,\n", | |
" 'prefix': 'https://fastly.4sqi.net/img/general/',\n", | |
" 'suffix': '/0NLVU2HC1JF4DXIMKWUFW3QBUT31DC11EFNYYHMJG3NDWAPS.jpg',\n", | |
" 'width': 492,\n", | |
" 'height': 330,\n", | |
" 'user': {'id': '742542',\n", | |
" 'firstName': 'Time Out New York',\n", | |
" 'gender': 'none',\n", | |
" 'photo': {'prefix': 'https://fastly.4sqi.net/img/user/',\n", | |
" 'suffix': '/XXHKCBSQHBORZNSR.jpg'},\n", | |
" 'type': 'page'},\n", | |
" 'visibility': 'public'},\n", | |
" 'followers': {'count': 22},\n", | |
" 'listItems': {'count': 187,\n", | |
" 'items': [{'id': 'v4fa862b3e4b0ebff2f749f06',\n", | |
" 'createdAt': 1342934485}]}},\n", | |
" {'id': '4fae817be4b085f6b2a74d19',\n", | |
" 'name': 'USA NYC MAN FiDi',\n", | |
" 'description': 'Where to go for decent eats in the restaurant wasteland of Downtown NYC aka FiDi, along with Tribeca & Battery Park City.',\n", | |
" 'type': 'others',\n", | |
" 'user': {'id': '12113441',\n", | |
" 'firstName': 'Kino',\n", | |
" 'gender': 'male',\n", | |
" 'photo': {'prefix': 'https://fastly.4sqi.net/img/user/',\n", | |
" 'suffix': '/12113441-K5HTHFLU2MUCM0CM.jpg'}},\n", | |
" 'editable': False,\n", | |
" 'public': True,\n", | |
" 'collaborative': False,\n", | |
" 'url': '/kinosfault/list/usa-nyc-man-fidi',\n", | |
" 'canonicalUrl': 'https://foursquare.com/kinosfault/list/usa-nyc-man-fidi',\n", | |
" 'createdAt': 1336836475,\n", | |
" 'updatedAt': 1536019882,\n", | |
" 'photo': {'id': '55984992498e13ba75e353bb',\n", | |
" 'createdAt': 1436043666,\n", | |
" 'prefix': 'https://fastly.4sqi.net/img/general/',\n", | |
" 'suffix': '/12113441_iOa6Uh-Xi8bhj2-gpzkkw8MKiAIs7RmOcz_RM7m8ink.jpg',\n", | |
" 'width': 540,\n", | |
" 'height': 960,\n", | |
" 'user': {'id': '12113441',\n", | |
" 'firstName': 'Kino',\n", | |
" 'gender': 'male',\n", | |
" 'photo': {'prefix': 'https://fastly.4sqi.net/img/user/',\n", | |
" 'suffix': '/12113441-K5HTHFLU2MUCM0CM.jpg'}},\n", | |
" 'visibility': 'public'},\n", | |
" 'followers': {'count': 20},\n", | |
" 'listItems': {'count': 272,\n", | |
" 'items': [{'id': 'v4fa862b3e4b0ebff2f749f06',\n", | |
" 'createdAt': 1373909433}]}},\n", | |
" {'id': '4fddeff0e4b0e078037ac0d3',\n", | |
" 'name': 'NYC Resturants',\n", | |
" 'description': '',\n", | |
" 'type': 'others',\n", | |
" 'user': {'id': '21563126',\n", | |
" 'firstName': 'Richard',\n", | |
" 'lastName': 'Revilla',\n", | |
" 'gender': 'male',\n", | |
" 'photo': {'prefix': 'https://fastly.4sqi.net/img/user/',\n", | |
" 'suffix': '/21563126_v05J1KPw_SVj6Ehq9g8B9jeAGjFUMsU5QGl-NZ8inUQ7pKQm5bKplW37EmR7jS2A7GYPBBAtl.jpg'}},\n", | |
" 'editable': False,\n", | |
" 'public': True,\n", | |
" 'collaborative': True,\n", | |
" 'url': '/rickr7/list/nyc-resturants',\n", | |
" 'canonicalUrl': 'https://foursquare.com/rickr7/list/nyc-resturants',\n", | |
" 'createdAt': 1339944944,\n", | |
" 'updatedAt': 1552516108,\n", | |
" 'photo': {'id': '5072dd13e4b09145cdf782d1',\n", | |
" 'createdAt': 1349704979,\n", | |
" 'prefix': 'https://fastly.4sqi.net/img/general/',\n", | |
" 'suffix': '/208205_fGh2OuAZ9qJ4agbAA5wMVNOSIm9kNUlRtNwj1N-adqg.jpg',\n", | |
" 'width': 800,\n", | |
" 'height': 800,\n", | |
" 'user': {'id': '208205',\n", | |
" 'firstName': 'Thalia',\n", | |
" 'lastName': 'K',\n", | |
" 'gender': 'female',\n", | |
" 'photo': {'prefix': 'https://fastly.4sqi.net/img/user/',\n", | |
" 'suffix': '/SNOOLCAW2AG04ZKD.jpg'}},\n", | |
" 'visibility': 'public'},\n", | |
" 'followers': {'count': 12},\n", | |
" 'listItems': {'count': 193,\n", | |
" 'items': [{'id': 't54ed3b13498e857fd7dbb6fc',\n", | |
" 'createdAt': 1514680908}]}},\n", | |
" {'id': '5266c68a498e7c667807fe09',\n", | |
" 'name': 'Foodie Love in NY - 02',\n", | |
" 'description': '',\n", | |
" 'type': 'others',\n", | |
" 'user': {'id': '547977',\n", | |
" 'firstName': 'WiLL',\n", | |
" 'gender': 'male',\n", | |
" 'photo': {'prefix': 'https://fastly.4sqi.net/img/user/',\n", | |
" 'suffix': '/-Q5NYGDMFDMOITQRR.jpg'}},\n", | |
" 'editable': False,\n", | |
" 'public': True,\n", | |
" 'collaborative': False,\n", | |
" 'url': '/sweetiewill/list/foodie-love-in-ny--02',\n", | |
" 'canonicalUrl': 'https://foursquare.com/sweetiewill/list/foodie-love-in-ny--02',\n", | |
" 'createdAt': 1382467210,\n", | |
" 'updatedAt': 1391995585,\n", | |
" 'followers': {'count': 7},\n", | |
" 'listItems': {'count': 200,\n", | |
" 'items': [{'id': 'v4fa862b3e4b0ebff2f749f06',\n", | |
" 'createdAt': 1386809936}]}}]}]},\n", | |
" 'hours': {'status': 'Open until 11:00 PM',\n", | |
" 'richStatus': {'entities': [], 'text': 'Open until 11:00 PM'},\n", | |
" 'isOpen': True,\n", | |
" 'isLocalHoliday': False,\n", | |
" 'dayData': [],\n", | |
" 'timeframes': [{'days': 'Mon–Wed, Sun',\n", | |
" 'includesToday': True,\n", | |
" 'open': [{'renderedTime': '11:30 AM–11:00 PM'}],\n", | |
" 'segments': []},\n", | |
" {'days': 'Thu–Sat',\n", | |
" 'open': [{'renderedTime': '11:30 AM–Midnight'}],\n", | |
" 'segments': []}]},\n", | |
" 'popular': {'status': 'Likely open',\n", | |
" 'richStatus': {'entities': [], 'text': 'Likely open'},\n", | |
" 'isOpen': True,\n", | |
" 'isLocalHoliday': False,\n", | |
" 'timeframes': [{'days': 'Today',\n", | |
" 'includesToday': True,\n", | |
" 'open': [{'renderedTime': 'Noon–2:00 PM'},\n", | |
" {'renderedTime': '5:00 PM–10:00 PM'}],\n", | |
" 'segments': []},\n", | |
" {'days': 'Wed–Thu',\n", | |
" 'open': [{'renderedTime': 'Noon–2:00 PM'},\n", | |
" {'renderedTime': '5:00 PM–10:00 PM'}],\n", | |
" 'segments': []},\n", | |
" {'days': 'Fri',\n", | |
" 'open': [{'renderedTime': 'Noon–3:00 PM'},\n", | |
" {'renderedTime': '5:00 PM–11:00 PM'}],\n", | |
" 'segments': []},\n", | |
" {'days': 'Sat',\n", | |
" 'open': [{'renderedTime': 'Noon–11:00 PM'}],\n", | |
" 'segments': []},\n", | |
" {'days': 'Sun',\n", | |
" 'open': [{'renderedTime': 'Noon–3:00 PM'},\n", | |
" {'renderedTime': '5:00 PM–8:00 PM'}],\n", | |
" 'segments': []},\n", | |
" {'days': 'Mon',\n", | |
" 'open': [{'renderedTime': 'Noon–2:00 PM'},\n", | |
" {'renderedTime': '6:00 PM–8:00 PM'}],\n", | |
" 'segments': []}]},\n", | |
" 'pageUpdates': {'count': 0, 'items': []},\n", | |
" 'inbox': {'count': 0, 'items': []},\n", | |
" 'attributes': {'groups': [{'type': 'price',\n", | |
" 'name': 'Price',\n", | |
" 'summary': '$$',\n", | |
" 'count': 1,\n", | |
" 'items': [{'displayName': 'Price', 'displayValue': '$$', 'priceTier': 2}]},\n", | |
" {'type': 'payments',\n", | |
" 'name': 'Credit Cards',\n", | |
" 'summary': 'Credit Cards',\n", | |
" 'count': 7,\n", | |
" 'items': [{'displayName': 'Credit Cards',\n", | |
" 'displayValue': 'Yes (incl. American Express)'}]},\n", | |
" {'type': 'outdoorSeating',\n", | |
" 'name': 'Outdoor Seating',\n", | |
" 'summary': 'Outdoor Seating',\n", | |
" 'count': 1,\n", | |
" 'items': [{'displayName': 'Outdoor Seating', 'displayValue': 'Yes'}]},\n", | |
" {'type': 'serves',\n", | |
" 'name': 'Menus',\n", | |
" 'summary': 'Happy Hour, Brunch & more',\n", | |
" 'count': 8,\n", | |
" 'items': [{'displayName': 'Brunch', 'displayValue': 'Brunch'},\n", | |
" {'displayName': 'Lunch', 'displayValue': 'Lunch'},\n", | |
" {'displayName': 'Dinner', 'displayValue': 'Dinner'},\n", | |
" {'displayName': 'Happy Hour', 'displayValue': 'Happy Hour'}]},\n", | |
" {'type': 'drinks',\n", | |
" 'name': 'Drinks',\n", | |
" 'summary': 'Beer, Wine & Cocktails',\n", | |
" 'count': 5,\n", | |
" 'items': [{'displayName': 'Beer', 'displayValue': 'Beer'},\n", | |
" {'displayName': 'Wine', 'displayValue': 'Wine'},\n", | |
" {'displayName': 'Cocktails', 'displayValue': 'Cocktails'}]},\n", | |
" {'type': 'diningOptions',\n", | |
" 'name': 'Dining Options',\n", | |
" 'summary': 'Delivery',\n", | |
" 'count': 5,\n", | |
" 'items': [{'displayName': 'Delivery', 'displayValue': 'Delivery'}]}]},\n", | |
" 'bestPhoto': {'id': '4fad980de4b091b4626c3633',\n", | |
" 'createdAt': 1336776717,\n", | |
" 'source': {'name': 'Foursquare for Android',\n", | |
" 'url': 'https://foursquare.com/download/#/android'},\n", | |
" 'prefix': 'https://fastly.4sqi.net/img/general/',\n", | |
" 'suffix': '/ya1iQFI7pLjuIJp1PGDKlrZS3OJdHCF7tpILMmjv_2w.jpg',\n", | |
" 'width': 480,\n", | |
" 'height': 640,\n", | |
" 'visibility': 'public'},\n", | |
" 'colors': {'highlightColor': {'photoId': '4fad980de4b091b4626c3633',\n", | |
" 'value': -13619152},\n", | |
" 'highlightTextColor': {'photoId': '4fad980de4b091b4626c3633', 'value': -1},\n", | |
" 'algoVersion': 3}}" | |
] | |
}, | |
"execution_count": 12, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"result = requests.get(url).json()\n", | |
"print(result['response']['venue'].keys())\n", | |
"result['response']['venue']" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"### B. Get the venue's overall rating" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"7.1\n" | |
] | |
} | |
], | |
"source": [ | |
"try:\n", | |
" print(result['response']['venue']['rating'])\n", | |
"except:\n", | |
" print('This venue has not been rated yet.')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"That is not a very good rating. Let's check the rating of the second closest Italian restaurant." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"This venue has not been rated yet.\n" | |
] | |
} | |
], | |
"source": [ | |
"venue_id = '4f3232e219836c91c7bfde94' # ID of Conca Cucina Italian Restaurant\n", | |
"url = 'https://api.foursquare.com/v2/venues/{}?client_id={}&client_secret={}&v={}'.format(venue_id, CLIENT_ID, CLIENT_SECRET, VERSION)\n", | |
"\n", | |
"result = requests.get(url).json()\n", | |
"try:\n", | |
" print(result['response']['venue']['rating'])\n", | |
"except:\n", | |
" print('This venue has not been rated yet.')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Since this restaurant has no ratings, let's check the third restaurant." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"7.7\n" | |
] | |
} | |
], | |
"source": [ | |
"venue_id = '3fd66200f964a520f4e41ee3' # ID of Ecco\n", | |
"url = 'https://api.foursquare.com/v2/venues/{}?client_id={}&client_secret={}&v={}'.format(venue_id, CLIENT_ID, CLIENT_SECRET, VERSION)\n", | |
"\n", | |
"result = requests.get(url).json()\n", | |
"try:\n", | |
" print(result['response']['venue']['rating'])\n", | |
"except:\n", | |
" print('This venue has not been rated yet.')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Since this restaurant has a slightly better rating, let's explore it further." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"### C. Get the number of tips" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"16" | |
] | |
}, | |
"execution_count": 16, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"result['response']['venue']['tips']['count']" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"### D. Get the venue's tips\n", | |
"> `https://api.foursquare.com/v2/venues/`**VENUE_ID**`/tips?client_id=`**CLIENT_ID**`&client_secret=`**CLIENT_SECRET**`&v=`**VERSION**`&limit=`**LIMIT**" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Create URL and send GET request. Make sure to set limit to get all tips" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'meta': {'code': 200, 'requestId': '5ca3ed8df594df2403c469e1'},\n", | |
" 'response': {'tips': {'count': 16,\n", | |
" 'items': [{'id': '5ab1cb46c9a517174651d3fe',\n", | |
" 'createdAt': 1521601350,\n", | |
" 'text': 'A+ Italian food! Trust me on this: my mom’s side of the family is 100% Italian. I was born and bred to know good pasta when I see it, and Ecco is one of my all-time NYC favorites',\n", | |
" 'type': 'user',\n", | |
" 'canonicalUrl': 'https://foursquare.com/item/5ab1cb46c9a517174651d3fe',\n", | |
" 'lang': 'en',\n", | |
" 'likes': {'count': 0, 'groups': []},\n", | |
" 'logView': True,\n", | |
" 'agreeCount': 2,\n", | |
" 'disagreeCount': 0,\n", | |
" 'todo': {'count': 0},\n", | |
" 'user': {'id': '484542633',\n", | |
" 'firstName': 'Nick',\n", | |
" 'lastName': 'El-Tawil',\n", | |
" 'gender': 'male',\n", | |
" 'photo': {'prefix': 'https://fastly.4sqi.net/img/user/',\n", | |
" 'suffix': '/484542633_mK2Yum7T_7Tn9fWpndidJsmw2Hof_6T5vJBKCHPLMK5OL-U5ZiJGj51iwBstcpDLYa3Zvhvis.jpg'}},\n", | |
" 'authorInteractionType': 'liked'}]}}}" | |
] | |
}, | |
"execution_count": 17, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"## Ecco Tips\n", | |
"limit = 15 # set limit to be greater than or equal to the total number of tips\n", | |
"url = 'https://api.foursquare.com/v2/venues/{}/tips?client_id={}&client_secret={}&v={}&limit={}'.format(venue_id, CLIENT_ID, CLIENT_SECRET, VERSION, limit)\n", | |
"\n", | |
"results = requests.get(url).json()\n", | |
"results" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Get tips and list of associated features" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"dict_keys(['id', 'createdAt', 'text', 'type', 'canonicalUrl', 'lang', 'likes', 'logView', 'agreeCount', 'disagreeCount', 'todo', 'user', 'authorInteractionType'])" | |
] | |
}, | |
"execution_count": 18, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"tips = results['response']['tips']['items']\n", | |
"\n", | |
"tip = results['response']['tips']['items'][0]\n", | |
"tip.keys()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Format column width and display all tips" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": false | |
}, | |
"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>text</th>\n", | |
" <th>agreeCount</th>\n", | |
" <th>disagreeCount</th>\n", | |
" <th>id</th>\n", | |
" <th>user.firstName</th>\n", | |
" <th>user.lastName</th>\n", | |
" <th>user.gender</th>\n", | |
" <th>user.id</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>A+ Italian food! Trust me on this: my mom’s side of the family is 100% Italian. I was born and bred to know good pasta when I see it, and Ecco is one of my all-time NYC favorites</td>\n", | |
" <td>2</td>\n", | |
" <td>0</td>\n", | |
" <td>5ab1cb46c9a517174651d3fe</td>\n", | |
" <td>Nick</td>\n", | |
" <td>El-Tawil</td>\n", | |
" <td>male</td>\n", | |
" <td>484542633</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" text \\\n", | |
"0 A+ Italian food! Trust me on this: my mom’s side of the family is 100% Italian. I was born and bred to know good pasta when I see it, and Ecco is one of my all-time NYC favorites \n", | |
"\n", | |
" agreeCount disagreeCount id user.firstName \\\n", | |
"0 2 0 5ab1cb46c9a517174651d3fe Nick \n", | |
"\n", | |
" user.lastName user.gender user.id \n", | |
"0 El-Tawil male 484542633 " | |
] | |
}, | |
"execution_count": 19, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"pd.set_option('display.max_colwidth', -1)\n", | |
"\n", | |
"tips_df = json_normalize(tips) # json normalize tips\n", | |
"\n", | |
"# columns to keep\n", | |
"filtered_columns = ['text', 'agreeCount', 'disagreeCount', 'id', 'user.firstName', 'user.lastName', 'user.gender', 'user.id']\n", | |
"tips_filtered = tips_df.loc[:, filtered_columns]\n", | |
"\n", | |
"# display tips\n", | |
"tips_filtered" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Now remember that because we are using a personal developer account, then we can access only 2 of the restaurant's tips, instead of all 15 tips." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
" " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"<a id=\"item3\"></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"## 3. Search a Foursquare User\n", | |
"> `https://api.foursquare.com/v2/users/`**USER_ID**`?client_id=`**CLIENT_ID**`&client_secret=`**CLIENT_SECRET**`&v=`**VERSION**" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"### Define URL, send GET request and display features associated with user" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"dict_keys(['id', 'firstName', 'lastName', 'gender', 'canonicalUrl', 'photo', 'friends', 'tips', 'homeCity', 'bio', 'contact', 'photos', 'type', 'mayorships', 'checkins', 'lists', 'lenses'])" | |
] | |
}, | |
"execution_count": 20, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"user_id = '484542633' # user ID with most agree counts and complete profile\n", | |
"\n", | |
"url = 'https://api.foursquare.com/v2/users/{}?client_id={}&client_secret={}&v={}'.format(user_id, CLIENT_ID, CLIENT_SECRET, VERSION) # define URL\n", | |
"\n", | |
"# send GET request\n", | |
"results = requests.get(url).json()\n", | |
"user_data = results['response']['user']\n", | |
"\n", | |
"# display features associated with user\n", | |
"user_data.keys()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"First Name: Nick\n", | |
"Last Name: El-Tawil\n", | |
"Home City: New York, NY\n" | |
] | |
} | |
], | |
"source": [ | |
"print('First Name: ' + user_data['firstName'])\n", | |
"print('Last Name: ' + user_data['lastName'])\n", | |
"print('Home City: ' + user_data['homeCity'])" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### How many tips has this user submitted?" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'count': 240}" | |
] | |
}, | |
"execution_count": 22, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"user_data['tips']" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Wow! So it turns out that Nick is a very active Foursquare user, with more than 250 tips." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"### Get User's tips" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": false | |
}, | |
"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>text</th>\n", | |
" <th>agreeCount</th>\n", | |
" <th>disagreeCount</th>\n", | |
" <th>id</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>The best! I’m especially fond of the salmon burger, but I’ve had half of the menu and never been disappointed. There’s a reason this place is well known even outside of the Village!</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>5aec594b1f7440002c138612</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>I used to down a pint of chocolate like it was nothing back when I was bulking. Highly recommended!</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>5accc9f66fa81f196724807b</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>They serve coffee!!!!!!</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>5accc98c0313204c9d7ec157</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>I’m a fan. In fact, I’m such a big fan, I want Taim to hire me to be their spokesman. Kind of like the Arabic Jared Fogle - but without the kid stuff.</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>5accbf033abcaf09a24612a0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>The linguine with clams is on point 👌</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>5accbe3a911fc423730f3ed3</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>Great for a quick, cheap lunch! Shorter lines than Chipotle too👌</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>5acbecb86fa81f1967e019b0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>Quick, cheap lunch that tastes good! Way shorter line than Chipotle, too.</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>5acbec70a0215b732e264fe8</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>7</th>\n", | |
" <td>You’re not a real New Yorker until you’ve shame-ordered Insomnia Cookies for delivery at 3am</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>5acbbd4eb1538e45373b07f5</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>8</th>\n", | |
" <td>Good for you yet still tasty! Clean green protein is my go-to after I hit the gym 💪</td>\n", | |
" <td>2</td>\n", | |
" <td>0</td>\n", | |
" <td>5acbbcda01235808d5d6dc75</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>9</th>\n", | |
" <td>Coffee game on point</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>5acbbb1501235808d5d6525e</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>10</th>\n", | |
" <td>This is the dive bar to end all other dive bars. Go here if you like cheap drinks! 🥃</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>5ab576abea1e444f2abb051e</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>11</th>\n", | |
" <td>Burger game strong 💪</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>5ab575fb6bdee65f759da8c1</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>12</th>\n", | |
" <td>Great burgers & fries! Also, this place is exactly what it’s like when you go to a bar in the Southwest. Source: I’m from Arizona.</td>\n", | |
" <td>2</td>\n", | |
" <td>0</td>\n", | |
" <td>5ab5575d73fe2516ad8f363b</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>13</th>\n", | |
" <td>That guy looks familiar...</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>5ab5299635f98312029a53b7</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>14</th>\n", | |
" <td>Açaí bowl + peanut butter + whey protein = 💪💪💪</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>5ab42db53c858d64af2688a4</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" text \\\n", | |
"0 The best! I’m especially fond of the salmon burger, but I’ve had half of the menu and never been disappointed. There’s a reason this place is well known even outside of the Village! \n", | |
"1 I used to down a pint of chocolate like it was nothing back when I was bulking. Highly recommended! \n", | |
"2 They serve coffee!!!!!! \n", | |
"3 I’m a fan. In fact, I’m such a big fan, I want Taim to hire me to be their spokesman. Kind of like the Arabic Jared Fogle - but without the kid stuff. \n", | |
"4 The linguine with clams is on point 👌 \n", | |
"5 Great for a quick, cheap lunch! Shorter lines than Chipotle too👌 \n", | |
"6 Quick, cheap lunch that tastes good! Way shorter line than Chipotle, too. \n", | |
"7 You’re not a real New Yorker until you’ve shame-ordered Insomnia Cookies for delivery at 3am \n", | |
"8 Good for you yet still tasty! Clean green protein is my go-to after I hit the gym 💪 \n", | |
"9 Coffee game on point \n", | |
"10 This is the dive bar to end all other dive bars. Go here if you like cheap drinks! 🥃 \n", | |
"11 Burger game strong 💪 \n", | |
"12 Great burgers & fries! Also, this place is exactly what it’s like when you go to a bar in the Southwest. Source: I’m from Arizona. \n", | |
"13 That guy looks familiar... \n", | |
"14 Açaí bowl + peanut butter + whey protein = 💪💪💪 \n", | |
"\n", | |
" agreeCount disagreeCount id \n", | |
"0 1 0 5aec594b1f7440002c138612 \n", | |
"1 1 0 5accc9f66fa81f196724807b \n", | |
"2 1 0 5accc98c0313204c9d7ec157 \n", | |
"3 1 0 5accbf033abcaf09a24612a0 \n", | |
"4 1 0 5accbe3a911fc423730f3ed3 \n", | |
"5 1 0 5acbecb86fa81f1967e019b0 \n", | |
"6 1 0 5acbec70a0215b732e264fe8 \n", | |
"7 1 0 5acbbd4eb1538e45373b07f5 \n", | |
"8 2 0 5acbbcda01235808d5d6dc75 \n", | |
"9 1 0 5acbbb1501235808d5d6525e \n", | |
"10 1 0 5ab576abea1e444f2abb051e \n", | |
"11 1 0 5ab575fb6bdee65f759da8c1 \n", | |
"12 2 0 5ab5575d73fe2516ad8f363b \n", | |
"13 1 0 5ab5299635f98312029a53b7 \n", | |
"14 1 0 5ab42db53c858d64af2688a4 " | |
] | |
}, | |
"execution_count": 23, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# define tips URL\n", | |
"url = 'https://api.foursquare.com/v2/users/{}/tips?client_id={}&client_secret={}&v={}&limit={}'.format(user_id, CLIENT_ID, CLIENT_SECRET, VERSION, limit)\n", | |
"\n", | |
"# send GET request and get user's tips\n", | |
"results = requests.get(url).json()\n", | |
"tips = results['response']['tips']['items']\n", | |
"\n", | |
"# format column width\n", | |
"pd.set_option('display.max_colwidth', -1)\n", | |
"\n", | |
"tips_df = json_normalize(tips)\n", | |
"\n", | |
"# filter columns\n", | |
"filtered_columns = ['text', 'agreeCount', 'disagreeCount', 'id']\n", | |
"tips_filtered = tips_df.loc[:, filtered_columns]\n", | |
"\n", | |
"# display user's tips\n", | |
"tips_filtered" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Let's get the venue for the tip with the greatest number of agree counts" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 25, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Cowgirl\n", | |
"{'address': '519 Hudson St', 'crossStreet': 'at W 10th St', 'lat': 40.73373338282062, 'lng': -74.0062998849649, 'labeledLatLngs': [{'label': 'display', 'lat': 40.73373338282062, 'lng': -74.0062998849649}], 'postalCode': '10014', 'cc': 'US', 'city': 'New York', 'state': 'NY', 'country': 'United States', 'formattedAddress': ['519 Hudson St (at W 10th St)', 'New York, NY 10014', 'United States']}\n" | |
] | |
} | |
], | |
"source": [ | |
"tip_id = '5ab5575d73fe2516ad8f363b' # tip id\n", | |
"\n", | |
"# define URL\n", | |
"url = 'http://api.foursquare.com/v2/tips/{}?client_id={}&client_secret={}&v={}'.format(tip_id, CLIENT_ID, CLIENT_SECRET, VERSION)\n", | |
"\n", | |
"# send GET Request and examine results\n", | |
"result = requests.get(url).json()\n", | |
"print(result['response']['tip']['venue']['name'])\n", | |
"print(result['response']['tip']['venue']['location'])" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"### Get User's friends" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": false | |
}, | |
"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", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
"Empty DataFrame\n", | |
"Columns: []\n", | |
"Index: []" | |
] | |
}, | |
"execution_count": 26, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"user_friends = json_normalize(user_data['friends']['groups'][0]['items'])\n", | |
"user_friends" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Interesting. Despite being very active, it turns out that Nick does not have any friends on Foursquare. This might definitely change in the future." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"### Retrieve the User's Profile Image" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 27, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'id': '484542633',\n", | |
" 'firstName': 'Nick',\n", | |
" 'lastName': 'El-Tawil',\n", | |
" 'gender': 'male',\n", | |
" 'canonicalUrl': 'https://foursquare.com/nickeltawil',\n", | |
" 'photo': {'prefix': 'https://fastly.4sqi.net/img/user/',\n", | |
" 'suffix': '/484542633_mK2Yum7T_7Tn9fWpndidJsmw2Hof_6T5vJBKCHPLMK5OL-U5ZiJGj51iwBstcpDLYa3Zvhvis.jpg'},\n", | |
" 'friends': {'count': 0,\n", | |
" 'groups': [{'type': 'others',\n", | |
" 'name': 'Other friends',\n", | |
" 'count': 0,\n", | |
" 'items': []}]},\n", | |
" 'tips': {'count': 240},\n", | |
" 'homeCity': 'New York, NY',\n", | |
" 'bio': 'https://www.tawil.team/nick-el-tawil/',\n", | |
" 'contact': {},\n", | |
" 'photos': {'count': 0, 'items': []},\n", | |
" 'type': 'user',\n", | |
" 'mayorships': {'count': 0, 'items': []},\n", | |
" 'checkins': {'count': 1, 'items': []},\n", | |
" 'lists': {'count': 2,\n", | |
" 'groups': [{'type': 'created', 'count': 0, 'items': []},\n", | |
" {'type': 'followed', 'count': 0, 'items': []},\n", | |
" {'type': 'yours',\n", | |
" 'count': 2,\n", | |
" 'items': [{'id': '484542633/todos',\n", | |
" 'name': \"Nick's Saved Places\",\n", | |
" 'description': '',\n", | |
" 'type': 'todos',\n", | |
" 'editable': False,\n", | |
" 'public': True,\n", | |
" 'collaborative': False,\n", | |
" 'url': '/nickeltawil/list/todos',\n", | |
" 'canonicalUrl': 'https://foursquare.com/nickeltawil/list/todos',\n", | |
" 'listItems': {'count': 0}},\n", | |
" {'id': '484542633/venuelikes',\n", | |
" 'name': 'Nick’s Liked Places',\n", | |
" 'description': '',\n", | |
" 'type': 'likes',\n", | |
" 'editable': False,\n", | |
" 'public': True,\n", | |
" 'collaborative': False,\n", | |
" 'url': '/nickeltawil/list/venuelikes',\n", | |
" 'canonicalUrl': 'https://foursquare.com/nickeltawil/list/venuelikes',\n", | |
" 'listItems': {'count': 0}}]}]},\n", | |
" 'lenses': []}" | |
] | |
}, | |
"execution_count": 27, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"user_data" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 28, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<img src=\"https://igx.4sqi.net/img/user/300x300/484542633_mK2Yum7T_7Tn9fWpndidJsmw2Hof_6T5vJBKCHPLMK5OL-U5ZiJGj51iwBstcpDLYa3Zvhvis.jpg\"/>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Image object>" | |
] | |
}, | |
"execution_count": 28, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# 1. grab prefix of photo\n", | |
"# 2. grab suffix of photo\n", | |
"# 3. concatenate them using the image size \n", | |
"Image(url='https://igx.4sqi.net/img/user/300x300/484542633_mK2Yum7T_7Tn9fWpndidJsmw2Hof_6T5vJBKCHPLMK5OL-U5ZiJGj51iwBstcpDLYa3Zvhvis.jpg')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
" " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"<a id=\"item4\"></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"## 4. Explore a location\n", | |
"> `https://api.foursquare.com/v2/venues/`**explore**`?client_id=`**CLIENT_ID**`&client_secret=`**CLIENT_SECRET**`&ll=`**LATITUDE**`,`**LONGITUDE**`&v=`**VERSION**`&limit=`**LIMIT**" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### So, you just finished your gourmet dish at Ecco, and are just curious about the popular spots around the restaurant. In order to explore the area, let's start by getting the latitude and longitude values of Ecco Restaurant." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 29, | |
"metadata": { | |
"button": false, | |
"collapsed": true, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"latitude = 40.715337\n", | |
"longitude = -74.008848" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Define URL" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 30, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'https://api.foursquare.com/v2/venues/explore?client_id=H235M5TQJXWJJ20H3HGHH4SOESGQYPRIF2YUZ45NW24EBALB&client_secret=5MVYOVO0FYTUR2LQFUUEGW5FNTLFGBYQWUPRLCCPEJ2O3RRB&ll=40.715337,-74.008848&v=20180604&radius=500&limit=30'" | |
] | |
}, | |
"execution_count": 30, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"url = 'https://api.foursquare.com/v2/venues/explore?client_id={}&client_secret={}&ll={},{}&v={}&radius={}&limit={}'.format(CLIENT_ID, CLIENT_SECRET, latitude, longitude, VERSION, radius, LIMIT)\n", | |
"url" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Send GET request and examine results" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"metadata": { | |
"button": false, | |
"collapsed": true, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"import requests" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 32, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'There are 30 around Ecco restaurant.'" | |
] | |
}, | |
"execution_count": 32, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"results = requests.get(url).json()\n", | |
"'There are {} around Ecco restaurant.'.format(len(results['response']['groups'][0]['items']))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Get relevant part of JSON" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 33, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'reasons': {'count': 0,\n", | |
" 'items': [{'summary': 'This spot is popular',\n", | |
" 'type': 'general',\n", | |
" 'reasonName': 'globalInteractionReason'}]},\n", | |
" 'venue': {'id': '4af5d65ff964a52091fd21e3',\n", | |
" 'name': 'Korin',\n", | |
" 'location': {'address': '57 Warren St',\n", | |
" 'crossStreet': 'Church St',\n", | |
" 'lat': 40.71482437714839,\n", | |
" 'lng': -74.00940425461492,\n", | |
" 'labeledLatLngs': [{'label': 'display',\n", | |
" 'lat': 40.71482437714839,\n", | |
" 'lng': -74.00940425461492}],\n", | |
" 'distance': 73,\n", | |
" 'postalCode': '10007',\n", | |
" 'cc': 'US',\n", | |
" 'neighborhood': 'Tribeca',\n", | |
" 'city': 'New York',\n", | |
" 'state': 'NY',\n", | |
" 'country': 'United States',\n", | |
" 'formattedAddress': ['57 Warren St (Church St)',\n", | |
" 'New York, NY 10007',\n", | |
" 'United States']},\n", | |
" 'categories': [{'id': '4bf58dd8d48988d1f8941735',\n", | |
" 'name': 'Furniture / Home Store',\n", | |
" 'pluralName': 'Furniture / Home Stores',\n", | |
" 'shortName': 'Furniture / Home',\n", | |
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/furniture_',\n", | |
" 'suffix': '.png'},\n", | |
" 'primary': True}],\n", | |
" 'photos': {'count': 0, 'groups': []},\n", | |
" 'venuePage': {'id': '33104775'}},\n", | |
" 'referralId': 'e-0-4af5d65ff964a52091fd21e3-0'}" | |
] | |
}, | |
"execution_count": 33, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"items = results['response']['groups'][0]['items']\n", | |
"items[0]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Process JSON and convert it to a clean dataframe" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 34, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>name</th>\n", | |
" <th>categories</th>\n", | |
" <th>address</th>\n", | |
" <th>cc</th>\n", | |
" <th>city</th>\n", | |
" <th>country</th>\n", | |
" <th>crossStreet</th>\n", | |
" <th>distance</th>\n", | |
" <th>formattedAddress</th>\n", | |
" <th>labeledLatLngs</th>\n", | |
" <th>lat</th>\n", | |
" <th>lng</th>\n", | |
" <th>neighborhood</th>\n", | |
" <th>postalCode</th>\n", | |
" <th>state</th>\n", | |
" <th>id</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>Korin</td>\n", | |
" <td>Furniture / Home Store</td>\n", | |
" <td>57 Warren St</td>\n", | |
" <td>US</td>\n", | |
" <td>New York</td>\n", | |
" <td>United States</td>\n", | |
" <td>Church St</td>\n", | |
" <td>73</td>\n", | |
" <td>[57 Warren St (Church St), New York, NY 10007, United States]</td>\n", | |
" <td>[{'label': 'display', 'lat': 40.71482437714839, 'lng': -74.00940425461492}]</td>\n", | |
" <td>40.714824</td>\n", | |
" <td>-74.009404</td>\n", | |
" <td>Tribeca</td>\n", | |
" <td>10007</td>\n", | |
" <td>NY</td>\n", | |
" <td>4af5d65ff964a52091fd21e3</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>Chambers Street Wines</td>\n", | |
" <td>Wine Shop</td>\n", | |
" <td>148 Chambers St</td>\n", | |
" <td>US</td>\n", | |
" <td>New York</td>\n", | |
" <td>United States</td>\n", | |
" <td>btwn West Broadway & Hudson St</td>\n", | |
" <td>88</td>\n", | |
" <td>[148 Chambers St (btwn West Broadway & Hudson St), New York, NY 10007, United States]</td>\n", | |
" <td>[{'label': 'display', 'lat': 40.715773063928374, 'lng': -74.00971823312332}]</td>\n", | |
" <td>40.715773</td>\n", | |
" <td>-74.009718</td>\n", | |
" <td>NaN</td>\n", | |
" <td>10007</td>\n", | |
" <td>NY</td>\n", | |
" <td>4adcf23cf964a520cc6221e3</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>Takahachi Bakery</td>\n", | |
" <td>Bakery</td>\n", | |
" <td>25 Murray St</td>\n", | |
" <td>US</td>\n", | |
" <td>New York</td>\n", | |
" <td>United States</td>\n", | |
" <td>at Church St</td>\n", | |
" <td>187</td>\n", | |
" <td>[25 Murray St (at Church St), New York, NY 10007, United States]</td>\n", | |
" <td>[{'label': 'display', 'lat': 40.713652845301894, 'lng': -74.0088038953017}]</td>\n", | |
" <td>40.713653</td>\n", | |
" <td>-74.008804</td>\n", | |
" <td>NaN</td>\n", | |
" <td>10007</td>\n", | |
" <td>NY</td>\n", | |
" <td>4c154c9a77cea593c401d260</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>Takahachi</td>\n", | |
" <td>Sushi Restaurant</td>\n", | |
" <td>145 Duane St</td>\n", | |
" <td>US</td>\n", | |
" <td>New York</td>\n", | |
" <td>United States</td>\n", | |
" <td>btwn W Broadway & Church St</td>\n", | |
" <td>146</td>\n", | |
" <td>[145 Duane St (btwn W Broadway & Church St), New York, NY 10013, United States]</td>\n", | |
" <td>[{'label': 'display', 'lat': 40.71652647412374, 'lng': -74.00810108466207}]</td>\n", | |
" <td>40.716526</td>\n", | |
" <td>-74.008101</td>\n", | |
" <td>NaN</td>\n", | |
" <td>10013</td>\n", | |
" <td>NY</td>\n", | |
" <td>4a8f2f39f964a520471420e3</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>Juice Press</td>\n", | |
" <td>Vegetarian / Vegan Restaurant</td>\n", | |
" <td>83 Murray St</td>\n", | |
" <td>US</td>\n", | |
" <td>New York</td>\n", | |
" <td>United States</td>\n", | |
" <td>btwn Greenwich St & W Broadway</td>\n", | |
" <td>202</td>\n", | |
" <td>[83 Murray St (btwn Greenwich St & W Broadway), New York, NY 10007, United States]</td>\n", | |
" <td>[{'label': 'display', 'lat': 40.71478769908051, 'lng': -74.0111317502157}]</td>\n", | |
" <td>40.714788</td>\n", | |
" <td>-74.011132</td>\n", | |
" <td>NaN</td>\n", | |
" <td>10007</td>\n", | |
" <td>NY</td>\n", | |
" <td>54148bc6498ea7bb8c05b70a</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>Nish Nūsh</td>\n", | |
" <td>Falafel Restaurant</td>\n", | |
" <td>88 Reade St</td>\n", | |
" <td>US</td>\n", | |
" <td>New York</td>\n", | |
" <td>United States</td>\n", | |
" <td>at Church St</td>\n", | |
" <td>97</td>\n", | |
" <td>[88 Reade St (at Church St), New York, NY 10013, United States]</td>\n", | |
" <td>[{'label': 'display', 'lat': 40.71553710116416, 'lng': -74.00772452925565}]</td>\n", | |
" <td>40.715537</td>\n", | |
" <td>-74.007725</td>\n", | |
" <td>NaN</td>\n", | |
" <td>10013</td>\n", | |
" <td>NY</td>\n", | |
" <td>50ba9119e4b071a4bae6dc10</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>Mulberry & Vine</td>\n", | |
" <td>Café</td>\n", | |
" <td>73 Warren St</td>\n", | |
" <td>US</td>\n", | |
" <td>New York</td>\n", | |
" <td>United States</td>\n", | |
" <td>btwn W Broadway & Greenwich St</td>\n", | |
" <td>117</td>\n", | |
" <td>[73 Warren St (btwn W Broadway & Greenwich St), New York, NY 10007, United States]</td>\n", | |
" <td>[{'label': 'display', 'lat': 40.71517693966315, 'lng': -74.01022747778285}]</td>\n", | |
" <td>40.715177</td>\n", | |
" <td>-74.010227</td>\n", | |
" <td>NaN</td>\n", | |
" <td>10007</td>\n", | |
" <td>NY</td>\n", | |
" <td>5171b5cc011cef9833bbb787</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>7</th>\n", | |
" <td>Equinox Tribeca</td>\n", | |
" <td>Gym</td>\n", | |
" <td>54 Murray Street</td>\n", | |
" <td>US</td>\n", | |
" <td>New York</td>\n", | |
" <td>United States</td>\n", | |
" <td>at W Broadway</td>\n", | |
" <td>154</td>\n", | |
" <td>[54 Murray Street (at W Broadway), New York, NY 10007, United States]</td>\n", | |
" <td>[{'label': 'display', 'lat': 40.71409860726041, 'lng': -74.0096857179283}]</td>\n", | |
" <td>40.714099</td>\n", | |
" <td>-74.009686</td>\n", | |
" <td>NaN</td>\n", | |
" <td>10007</td>\n", | |
" <td>NY</td>\n", | |
" <td>4a6e331af964a52031d41fe3</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>8</th>\n", | |
" <td>Philip Williams Posters</td>\n", | |
" <td>Antique Shop</td>\n", | |
" <td>122 Chambers St</td>\n", | |
" <td>US</td>\n", | |
" <td>New York</td>\n", | |
" <td>United States</td>\n", | |
" <td>NaN</td>\n", | |
" <td>8</td>\n", | |
" <td>[122 Chambers St, New York, NY 10007, United States]</td>\n", | |
" <td>[{'label': 'display', 'lat': 40.71528423132827, 'lng': -74.00878093952018}]</td>\n", | |
" <td>40.715284</td>\n", | |
" <td>-74.008781</td>\n", | |
" <td>NaN</td>\n", | |
" <td>10007</td>\n", | |
" <td>NY</td>\n", | |
" <td>4b747291f964a52042dd2de3</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>9</th>\n", | |
" <td>Whole Foods Market</td>\n", | |
" <td>Grocery Store</td>\n", | |
" <td>270 Greenwich Street</td>\n", | |
" <td>US</td>\n", | |
" <td>New York</td>\n", | |
" <td>United States</td>\n", | |
" <td>at Warren St</td>\n", | |
" <td>214</td>\n", | |
" <td>[270 Greenwich Street (at Warren St), New York, NY 10007, United States]</td>\n", | |
" <td>[{'label': 'display', 'lat': 40.715579155420606, 'lng': -74.01136823958119}]</td>\n", | |
" <td>40.715579</td>\n", | |
" <td>-74.011368</td>\n", | |
" <td>Tribeca</td>\n", | |
" <td>10007</td>\n", | |
" <td>NY</td>\n", | |
" <td>49bc3b0af964a52020541fe3</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" name categories \\\n", | |
"0 Korin Furniture / Home Store \n", | |
"1 Chambers Street Wines Wine Shop \n", | |
"2 Takahachi Bakery Bakery \n", | |
"3 Takahachi Sushi Restaurant \n", | |
"4 Juice Press Vegetarian / Vegan Restaurant \n", | |
"5 Nish Nūsh Falafel Restaurant \n", | |
"6 Mulberry & Vine Café \n", | |
"7 Equinox Tribeca Gym \n", | |
"8 Philip Williams Posters Antique Shop \n", | |
"9 Whole Foods Market Grocery Store \n", | |
"\n", | |
" address cc city country \\\n", | |
"0 57 Warren St US New York United States \n", | |
"1 148 Chambers St US New York United States \n", | |
"2 25 Murray St US New York United States \n", | |
"3 145 Duane St US New York United States \n", | |
"4 83 Murray St US New York United States \n", | |
"5 88 Reade St US New York United States \n", | |
"6 73 Warren St US New York United States \n", | |
"7 54 Murray Street US New York United States \n", | |
"8 122 Chambers St US New York United States \n", | |
"9 270 Greenwich Street US New York United States \n", | |
"\n", | |
" crossStreet distance \\\n", | |
"0 Church St 73 \n", | |
"1 btwn West Broadway & Hudson St 88 \n", | |
"2 at Church St 187 \n", | |
"3 btwn W Broadway & Church St 146 \n", | |
"4 btwn Greenwich St & W Broadway 202 \n", | |
"5 at Church St 97 \n", | |
"6 btwn W Broadway & Greenwich St 117 \n", | |
"7 at W Broadway 154 \n", | |
"8 NaN 8 \n", | |
"9 at Warren St 214 \n", | |
"\n", | |
" formattedAddress \\\n", | |
"0 [57 Warren St (Church St), New York, NY 10007, United States] \n", | |
"1 [148 Chambers St (btwn West Broadway & Hudson St), New York, NY 10007, United States] \n", | |
"2 [25 Murray St (at Church St), New York, NY 10007, United States] \n", | |
"3 [145 Duane St (btwn W Broadway & Church St), New York, NY 10013, United States] \n", | |
"4 [83 Murray St (btwn Greenwich St & W Broadway), New York, NY 10007, United States] \n", | |
"5 [88 Reade St (at Church St), New York, NY 10013, United States] \n", | |
"6 [73 Warren St (btwn W Broadway & Greenwich St), New York, NY 10007, United States] \n", | |
"7 [54 Murray Street (at W Broadway), New York, NY 10007, United States] \n", | |
"8 [122 Chambers St, New York, NY 10007, United States] \n", | |
"9 [270 Greenwich Street (at Warren St), New York, NY 10007, United States] \n", | |
"\n", | |
" labeledLatLngs \\\n", | |
"0 [{'label': 'display', 'lat': 40.71482437714839, 'lng': -74.00940425461492}] \n", | |
"1 [{'label': 'display', 'lat': 40.715773063928374, 'lng': -74.00971823312332}] \n", | |
"2 [{'label': 'display', 'lat': 40.713652845301894, 'lng': -74.0088038953017}] \n", | |
"3 [{'label': 'display', 'lat': 40.71652647412374, 'lng': -74.00810108466207}] \n", | |
"4 [{'label': 'display', 'lat': 40.71478769908051, 'lng': -74.0111317502157}] \n", | |
"5 [{'label': 'display', 'lat': 40.71553710116416, 'lng': -74.00772452925565}] \n", | |
"6 [{'label': 'display', 'lat': 40.71517693966315, 'lng': -74.01022747778285}] \n", | |
"7 [{'label': 'display', 'lat': 40.71409860726041, 'lng': -74.0096857179283}] \n", | |
"8 [{'label': 'display', 'lat': 40.71528423132827, 'lng': -74.00878093952018}] \n", | |
"9 [{'label': 'display', 'lat': 40.715579155420606, 'lng': -74.01136823958119}] \n", | |
"\n", | |
" lat lng neighborhood postalCode state \\\n", | |
"0 40.714824 -74.009404 Tribeca 10007 NY \n", | |
"1 40.715773 -74.009718 NaN 10007 NY \n", | |
"2 40.713653 -74.008804 NaN 10007 NY \n", | |
"3 40.716526 -74.008101 NaN 10013 NY \n", | |
"4 40.714788 -74.011132 NaN 10007 NY \n", | |
"5 40.715537 -74.007725 NaN 10013 NY \n", | |
"6 40.715177 -74.010227 NaN 10007 NY \n", | |
"7 40.714099 -74.009686 NaN 10007 NY \n", | |
"8 40.715284 -74.008781 NaN 10007 NY \n", | |
"9 40.715579 -74.011368 Tribeca 10007 NY \n", | |
"\n", | |
" id \n", | |
"0 4af5d65ff964a52091fd21e3 \n", | |
"1 4adcf23cf964a520cc6221e3 \n", | |
"2 4c154c9a77cea593c401d260 \n", | |
"3 4a8f2f39f964a520471420e3 \n", | |
"4 54148bc6498ea7bb8c05b70a \n", | |
"5 50ba9119e4b071a4bae6dc10 \n", | |
"6 5171b5cc011cef9833bbb787 \n", | |
"7 4a6e331af964a52031d41fe3 \n", | |
"8 4b747291f964a52042dd2de3 \n", | |
"9 49bc3b0af964a52020541fe3 " | |
] | |
}, | |
"execution_count": 34, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"dataframe = json_normalize(items) # flatten JSON\n", | |
"\n", | |
"# filter columns\n", | |
"filtered_columns = ['venue.name', 'venue.categories'] + [col for col in dataframe.columns if col.startswith('venue.location.')] + ['venue.id']\n", | |
"dataframe_filtered = dataframe.loc[:, filtered_columns]\n", | |
"\n", | |
"# filter the category for each row\n", | |
"dataframe_filtered['venue.categories'] = dataframe_filtered.apply(get_category_type, axis=1)\n", | |
"\n", | |
"# clean columns\n", | |
"dataframe_filtered.columns = [col.split('.')[-1] for col in dataframe_filtered.columns]\n", | |
"\n", | |
"dataframe_filtered.head(10)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Let's visualize these items on the map around our location" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 35, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzBmMDE1NDVlMGJlYTQyZWNiNjhiNzBkMmU4ZDQzZTgzIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8wZjAxNTQ1ZTBiZWE0MmVjYjY4YjcwZDJlOGQ0M2U4MyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8wZjAxNTQ1ZTBiZWE0MmVjYjY4YjcwZDJlOGQ0M2U4MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzE1MzM3LC03NC4wMDg4NDhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzY4YWYyZDcwOGNjNzRhMmViNDNhN2U4YzVkZGNmYTU1ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzBmMDE1NDVlMGJlYTQyZWNiNjhiNzBkMmU4ZDQzZTgzKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMDM0NWE1ZTViMmM0ZjdkYWU4MjU5ZmZjOTMxNWZjMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxNTMzNywtNzQuMDA4ODQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTBiZjA3YWQ3MDU4NDk0YWI2NTFkMDAxYjhhZTA4NzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTE2ZDk2ODAxZGZlNDExMjg2NjVjODI1ZjVlMzg5NjAgPSAkKCc8ZGl2IGlkPSJodG1sX2UxNmQ5NjgwMWRmZTQxMTI4NjY1YzgyNWY1ZTM4OTYwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FY2NvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMGJmMDdhZDcwNTg0OTRhYjY1MWQwMDFiOGFlMDg3Mi5zZXRDb250ZW50KGh0bWxfZTE2ZDk2ODAxZGZlNDExMjg2NjVjODI1ZjVlMzg5NjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTAzNDVhNWU1YjJjNGY3ZGFlODI1OWZmYzkzMTVmYzAuYmluZFBvcHVwKHBvcHVwX2EwYmYwN2FkNzA1ODQ5NGFiNjUxZDAwMWI4YWUwODcyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U4OWQ2Yjc2NjY0MzRmNGZiMmY4MjQ0ODUzMzkyMDU2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE0ODI0Mzc3MTQ4MzksLTc0LjAwOTQwNDI1NDYxNDkyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzBmMDE1NDVlMGJlYTQyZWNiNjhiNzBkMmU4ZDQzZTgzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y3ZDk3ODE5MjlkZjQxMWE5YzEwMTRjOGE1ZjQwYzg4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE5NDc3YzVkYjgxYzRmMmJhMzZhNDQ2NzAxYjk1YjZhID0gJCgnPGRpdiBpZD0iaHRtbF8xOTQ3N2M1ZGI4MWM0ZjJiYTM2YTQ0NjcwMWI5NWI2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnVybml0dXJlIC8gSG9tZSBTdG9yZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjdkOTc4MTkyOWRmNDExYTljMTAxNGM4YTVmNDBjODguc2V0Q29udGVudChodG1sXzE5NDc3YzVkYjgxYzRmMmJhMzZhNDQ2NzAxYjk1YjZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U4OWQ2Yjc2NjY0MzRmNGZiMmY4MjQ0ODUzMzkyMDU2LmJpbmRQb3B1cChwb3B1cF9mN2Q5NzgxOTI5ZGY0MTFhOWMxMDE0YzhhNWY0MGM4OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMDBkNDNhNmI0ZDA0YjM4YmU3OWJiZTBlZTVjNDgwMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxNTc3MzA2MzkyODM3NCwtNzQuMDA5NzE4MjMzMTIzMzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTM5YjhjODk0OTQxNGQxNjllMGM0YzcyMzhhZDY1NzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2M1ZmYzNGFiOWU5NDI1NzkwNTg4NDI3N2MzMzUyODUgPSAkKCc8ZGl2IGlkPSJodG1sXzdjNWZmMzRhYjllOTQyNTc5MDU4ODQyNzdjMzM1Mjg1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaW5lIFNob3A8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EzOWI4Yzg5NDk0MTRkMTY5ZTBjNGM3MjM4YWQ2NTcwLnNldENvbnRlbnQoaHRtbF83YzVmZjM0YWI5ZTk0MjU3OTA1ODg0Mjc3YzMzNTI4NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMDBkNDNhNmI0ZDA0YjM4YmU3OWJiZTBlZTVjNDgwMS5iaW5kUG9wdXAocG9wdXBfYTM5YjhjODk0OTQxNGQxNjllMGM0YzcyMzhhZDY1NzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2I1YTkxN2MxOGI3NDY3NThhNjE2Y2Q1MzI1M2IzY2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTM2NTI4NDUzMDE4OTQsLTc0LjAwODgwMzg5NTMwMTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzhmNDE4M2FjZTg4NGJmM2E1MDk2MGYzNjQxYjdlYjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzVlYzFkMTFjNGNhNGVhZjhiYmJhMDg1OWM0ODEwOGUgPSAkKCc8ZGl2IGlkPSJodG1sX2M1ZWMxZDExYzRjYTRlYWY4YmJiYTA4NTljNDgxMDhlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYWtlcnk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc4ZjQxODNhY2U4ODRiZjNhNTA5NjBmMzY0MWI3ZWI5LnNldENvbnRlbnQoaHRtbF9jNWVjMWQxMWM0Y2E0ZWFmOGJiYmEwODU5YzQ4MTA4ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYjVhOTE3YzE4Yjc0Njc1OGE2MTZjZDUzMjUzYjNjZS5iaW5kUG9wdXAocG9wdXBfNzhmNDE4M2FjZTg4NGJmM2E1MDk2MGYzNjQxYjdlYjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTVjMGUxNDgwNDNhNGMwZWEzOGJmN2U4YTM0MzUyNmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTY1MjY0NzQxMjM3NCwtNzQuMDA4MTAxMDg0NjYyMDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmExYTBmYjRiZGY4NGYzNjljYzdjYTc1MTllMmE3MGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjczMjAwYTUyODQyNDFhN2I0MjE3M2U2NTQ4OTcyMjkgPSAkKCc8ZGl2IGlkPSJodG1sX2Y3MzIwMGE1Mjg0MjQxYTdiNDIxNzNlNjU0ODk3MjI5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdXNoaSBSZXN0YXVyYW50PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yYTFhMGZiNGJkZjg0ZjM2OWNjN2NhNzUxOWUyYTcwZS5zZXRDb250ZW50KGh0bWxfZjczMjAwYTUyODQyNDFhN2I0MjE3M2U2NTQ4OTcyMjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTVjMGUxNDgwNDNhNGMwZWEzOGJmN2U4YTM0MzUyNmEuYmluZFBvcHVwKHBvcHVwXzJhMWEwZmI0YmRmODRmMzY5Y2M3Y2E3NTE5ZTJhNzBlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBiNjFiYjQyOGYyMDRhZmNhMzgxYjA5MjNkMzAyNGYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE0Nzg3Njk5MDgwNTEsLTc0LjAxMTEzMTc1MDIxNTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODAxMjY1NTg5Mjc5NGZiOWFmMjI3MTYyNjcxMDVjNWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGI4ZjU5ZWFiMTkyNGVhZThlMzBkMGU0NDZmNDZkYmEgPSAkKCc8ZGl2IGlkPSJodG1sXzBiOGY1OWVhYjE5MjRlYWU4ZTMwZDBlNDQ2ZjQ2ZGJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WZWdldGFyaWFuIC8gVmVnYW4gUmVzdGF1cmFudDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODAxMjY1NTg5Mjc5NGZiOWFmMjI3MTYyNjcxMDVjNWYuc2V0Q29udGVudChodG1sXzBiOGY1OWVhYjE5MjRlYWU4ZTMwZDBlNDQ2ZjQ2ZGJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBiNjFiYjQyOGYyMDRhZmNhMzgxYjA5MjNkMzAyNGYzLmJpbmRQb3B1cChwb3B1cF84MDEyNjU1ODkyNzk0ZmI5YWYyMjcxNjI2NzEwNWM1Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZTNiNzQ0MDljMWU0M2I2YTc2YzNjYjgwZmQzNjQxMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxNTUzNzEwMTE2NDE2LC03NC4wMDc3MjQ1MjkyNTU2NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8wZjAxNTQ1ZTBiZWE0MmVjYjY4YjcwZDJlOGQ0M2U4Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YjVlM2NjZGRlZTA0MDY4OGE2OGZlMDRmNGQzYWFhZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jOGQ0N2FlNzY2ZWQ0NjM5YmVmM2ZiNzAyMDhkMzRlZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzhkNDdhZTc2NmVkNDYzOWJlZjNmYjcwMjA4ZDM0ZWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZhbGFmZWwgUmVzdGF1cmFudDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmI1ZTNjY2RkZWUwNDA2ODhhNjhmZTA0ZjRkM2FhYWYuc2V0Q29udGVudChodG1sX2M4ZDQ3YWU3NjZlZDQ2MzliZWYzZmI3MDIwOGQzNGVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZlM2I3NDQwOWMxZTQzYjZhNzZjM2NiODBmZDM2NDEyLmJpbmRQb3B1cChwb3B1cF82YjVlM2NjZGRlZTA0MDY4OGE2OGZlMDRmNGQzYWFhZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNzAzOTFjOGY2Zjk0NmZlYjViYTNkMjFiZDY4ZTRjNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxNTE3NjkzOTY2MzE1LC03NC4wMTAyMjc0Nzc3ODI4NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8wZjAxNTQ1ZTBiZWE0MmVjYjY4YjcwZDJlOGQ0M2U4Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNjI0ZTBlYTI3NTE0YmNhOGE4NmUzM2I4MDA5ZWI5MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85N2UwYTQ4N2ZkMGI0ZTZhYWU4MDZiYTU0YzE5MjU4ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfOTdlMGE0ODdmZDBiNGU2YWFlODA2YmE1NGMxOTI1OGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhZsOpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNjI0ZTBlYTI3NTE0YmNhOGE4NmUzM2I4MDA5ZWI5MC5zZXRDb250ZW50KGh0bWxfOTdlMGE0ODdmZDBiNGU2YWFlODA2YmE1NGMxOTI1OGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzcwMzkxYzhmNmY5NDZmZWI1YmEzZDIxYmQ2OGU0YzUuYmluZFBvcHVwKHBvcHVwXzA2MjRlMGVhMjc1MTRiY2E4YTg2ZTMzYjgwMDllYjkwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQyNzU3MTE5ZWI2ZDQ1YTk5OTFiNjM0NzI2NDQ5OWNhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE0MDk4NjA3MjYwNDEsLTc0LjAwOTY4NTcxNzkyODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTU0ODNhYjk1NDhhNGY0YzhiM2FmOTdkYWM2YThiMmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzRhNGRiZTBlOWQzNDJlY2JmZWQ0MDk3NmFjMWJiNDQgPSAkKCc8ZGl2IGlkPSJodG1sX2M0YTRkYmUwZTlkMzQyZWNiZmVkNDA5NzZhYzFiYjQ0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HeW08L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E1NDgzYWI5NTQ4YTRmNGM4YjNhZjk3ZGFjNmE4YjJiLnNldENvbnRlbnQoaHRtbF9jNGE0ZGJlMGU5ZDM0MmVjYmZlZDQwOTc2YWMxYmI0NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80Mjc1NzExOWViNmQ0NWE5OTkxYjYzNDcyNjQ0OTljYS5iaW5kUG9wdXAocG9wdXBfYTU0ODNhYjk1NDhhNGY0YzhiM2FmOTdkYWM2YThiMmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2UyM2Y3MTZkNzdkNGQxNWFlMmU0NDg1MTZmMGQzYzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTUyODQyMzEzMjgyNywtNzQuMDA4NzgwOTM5NTIwMThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmNlODE0NmFmMGE4NDRiNjkzZTFjMzdhYTIxMGU0MjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTMzNGE2YWJjMDQwNDQyOGJkNzgyZDQyNGY0NzAxMGEgPSAkKCc8ZGl2IGlkPSJodG1sXzkzMzRhNmFiYzA0MDQ0MjhiZDc4MmQ0MjRmNDcwMTBhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BbnRpcXVlIFNob3A8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JjZTgxNDZhZjBhODQ0YjY5M2UxYzM3YWEyMTBlNDI2LnNldENvbnRlbnQoaHRtbF85MzM0YTZhYmMwNDA0NDI4YmQ3ODJkNDI0ZjQ3MDEwYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZTIzZjcxNmQ3N2Q0ZDE1YWUyZTQ0ODUxNmYwZDNjNC5iaW5kUG9wdXAocG9wdXBfYmNlODE0NmFmMGE4NDRiNjkzZTFjMzdhYTIxMGU0MjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmU4YjdhM2FkNjMzNGMwMTgzYTQ4MTJmYzEzYzZiNGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTU1NzkxNTU0MjA2MDYsLTc0LjAxMTM2ODIzOTU4MTE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzBmMDE1NDVlMGJlYTQyZWNiNjhiNzBkMmU4ZDQzZTgzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI2MDhiZWI3NDI1YTRhY2E4ZGQxNDdlZTQ2NjY2MGQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRjMDAyOGExY2I4NDQyOTViNGQ2YTE5ZGM2MWI3MjhlID0gJCgnPGRpdiBpZD0iaHRtbF80YzAwMjhhMWNiODQ0Mjk1YjRkNmExOWRjNjFiNzI4ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3JvY2VyeSBTdG9yZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjYwOGJlYjc0MjVhNGFjYThkZDE0N2VlNDY2NjYwZDIuc2V0Q29udGVudChodG1sXzRjMDAyOGExY2I4NDQyOTViNGQ2YTE5ZGM2MWI3MjhlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZlOGI3YTNhZDYzMzRjMDE4M2E0ODEyZmMxM2M2YjRjLmJpbmRQb3B1cChwb3B1cF8yNjA4YmViNzQyNWE0YWNhOGRkMTQ3ZWU0NjY2NjBkMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YzJkN2Q4NjlhM2E0OTIxOWYzY2EyYzFiMDkyYzRlOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxNTQ4NjU4NTI0OTczNSwtNzQuMDA5MTMzMTM1MTA4MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmYyMDk4MmE2YjAyNGY3Y2EyM2Y5YTdhY2RkZDE3OWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzhjMTE4YjNiNjA0NDk2NGE1ZDRjZTNiOWIyZmEzNTQgPSAkKCc8ZGl2IGlkPSJodG1sXzM4YzExOGIzYjYwNDQ5NjRhNWQ0Y2UzYjliMmZhMzU0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BbWVyaWNhbiBSZXN0YXVyYW50PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZjIwOTgyYTZiMDI0ZjdjYTIzZjlhN2FjZGRkMTc5ZC5zZXRDb250ZW50KGh0bWxfMzhjMTE4YjNiNjA0NDk2NGE1ZDRjZTNiOWIyZmEzNTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmMyZDdkODY5YTNhNDkyMTlmM2NhMmMxYjA5MmM0ZTguYmluZFBvcHVwKHBvcHVwXzJmMjA5ODJhNmIwMjRmN2NhMjNmOWE3YWNkZGQxNzlkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhhMmJlMTUwYmEwYjQ0OGFhZmVlNzY0YTM4NDMyOGU2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE2NzUyODE2ODc2NjM1LC03NC4wMDg1ODM3NjI5NTIyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8wZjAxNTQ1ZTBiZWE0MmVjYjY4YjcwZDJlOGQ0M2U4Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NDYxZWEyYzg0OTY0OTExYThiNDc1MGRiOTQ5MjRkNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYzc2MGM1NjE4YzE0NzE2YjliMTBjYWI4OGE5N2NmYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmM3NjBjNTYxOGMxNDcxNmI5YjEwY2FiODhhOTdjZmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFzaWFuIFJlc3RhdXJhbnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU0NjFlYTJjODQ5NjQ5MTFhOGI0NzUwZGI5NDkyNGQ3LnNldENvbnRlbnQoaHRtbF8yYzc2MGM1NjE4YzE0NzE2YjliMTBjYWI4OGE5N2NmYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YTJiZTE1MGJhMGI0NDhhYWZlZTc2NGEzODQzMjhlNi5iaW5kUG9wdXAocG9wdXBfNTQ2MWVhMmM4NDk2NDkxMWE4YjQ3NTBkYjk0OTI0ZDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGQ5YmZhMzgxMThhNDllYmI2MjcwYjY4ZjM4ZTQxZWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTU5NDEyNTU2NjkzMSwtNzQuMDA4NzIwNTM1NjQ0OTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzg4OGE5YTZmYTM4NDkzNzg1NzQ1OTRhN2RiZjRiY2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzI5YjMxNzE1NTljNGFlNmI0Y2VmODIyYjI2ZThhOGUgPSAkKCc8ZGl2IGlkPSJodG1sXzMyOWIzMTcxNTU5YzRhZTZiNGNlZjgyMmIyNmU4YThlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OYWlsIFNhbG9uPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zODg4YTlhNmZhMzg0OTM3ODU3NDU5NGE3ZGJmNGJjZS5zZXRDb250ZW50KGh0bWxfMzI5YjMxNzE1NTljNGFlNmI0Y2VmODIyYjI2ZThhOGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGQ5YmZhMzgxMThhNDllYmI2MjcwYjY4ZjM4ZTQxZWYuYmluZFBvcHVwKHBvcHVwXzM4ODhhOWE2ZmEzODQ5Mzc4NTc0NTk0YTdkYmY0YmNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVlOWFiMjkxMDgzOTQxM2RhOGE2YWYyZmE0MTE3NDc2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE2NzQwODQxNjMzNjksLTc0LjAwODY2NjQ0Mzg4OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTIzNjJmN2I1MDcwNDZlY2I1OTFhNGI0NjI5NGNmOGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzEwMDg1NGFiODY3NDUzMTg5NjU3ZGJlNGUwZDA1YzkgPSAkKCc8ZGl2IGlkPSJodG1sXzcxMDA4NTRhYjg2NzQ1MzE4OTY1N2RiZTRlMGQwNWM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db2NrdGFpbCBCYXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EyMzYyZjdiNTA3MDQ2ZWNiNTkxYTRiNDYyOTRjZjhlLnNldENvbnRlbnQoaHRtbF83MTAwODU0YWI4Njc0NTMxODk2NTdkYmU0ZTBkMDVjOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZTlhYjI5MTA4Mzk0MTNkYThhNmFmMmZhNDExNzQ3Ni5iaW5kUG9wdXAocG9wdXBfYTIzNjJmN2I1MDcwNDZlY2I1OTFhNGI0NjI5NGNmOGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTQ0M2RhYjY3OWM2NDRkMzhmNzZiZDE2MTg3ZWY0NTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTY3OTMwNDg1NTgwOCwtNzQuMDA4MjE5OTg4Nzg0NTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZThhM2Q1MzhmOWQ4NDEzMzhiMTM5MGM0Yzk4NDAxMWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTJiMTI0NTZhNjA0NGQ5ZWI2MDA5NDM2MjA4YjA0ZTUgPSAkKCc8ZGl2IGlkPSJodG1sXzUyYjEyNDU2YTYwNDRkOWViNjAwOTQzNjIwOGIwNGU1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BbWVyaWNhbiBSZXN0YXVyYW50PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lOGEzZDUzOGY5ZDg0MTMzOGIxMzkwYzRjOTg0MDExZi5zZXRDb250ZW50KGh0bWxfNTJiMTI0NTZhNjA0NGQ5ZWI2MDA5NDM2MjA4YjA0ZTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTQ0M2RhYjY3OWM2NDRkMzhmNzZiZDE2MTg3ZWY0NTAuYmluZFBvcHVwKHBvcHVwX2U4YTNkNTM4ZjlkODQxMzM4YjEzOTBjNGM5ODQwMTFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQwOTljMDIxZTliMDRkYzY5OTRkMjJhOTgyY2MyMjY4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE3MDEwMTE0MDk5MDYsLTc0LjAwODA0MjQ0NTYyMjI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzBmMDE1NDVlMGJlYTQyZWNiNjhiNzBkMmU4ZDQzZTgzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk5ZWVkOTAwNmFiODQ0MmI4YzFiYmMyNTA0ZWM4MzY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY4NWRhNWIwZmY1ZjRmN2RhMGU5MzhjMGQ3MjVkM2JiID0gJCgnPGRpdiBpZD0iaHRtbF82ODVkYTViMGZmNWY0ZjdkYTBlOTM4YzBkNzI1ZDNiYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnJlbmNoIFJlc3RhdXJhbnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5ZWVkOTAwNmFiODQ0MmI4YzFiYmMyNTA0ZWM4MzY0LnNldENvbnRlbnQoaHRtbF82ODVkYTViMGZmNWY0ZjdkYTBlOTM4YzBkNzI1ZDNiYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MDk5YzAyMWU5YjA0ZGM2OTk0ZDIyYTk4MmNjMjI2OC5iaW5kUG9wdXAocG9wdXBfOTllZWQ5MDA2YWI4NDQyYjhjMWJiYzI1MDRlYzgzNjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2ZlNzY1OTFjM2Q3NDRkYWJjNWEwN2E4ZDA1MjFmMzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTQ5MDk1MDE1Mzk4MiwtNzQuMDA5NDgwMjcwMTE5MDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjY5ZGY2ODRmZWY1NDgwMDk2NmY1MmI5ZTYwNTgwMWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDdjYTg0YWY0MThlNDVjMzlkYTg3MTcwODQyZGRjNTYgPSAkKCc8ZGl2IGlkPSJodG1sXzA3Y2E4NGFmNDE4ZTQ1YzM5ZGE4NzE3MDg0MmRkYzU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Cb29rc3RvcmU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY2OWRmNjg0ZmVmNTQ4MDA5NjZmNTJiOWU2MDU4MDFiLnNldENvbnRlbnQoaHRtbF8wN2NhODRhZjQxOGU0NWMzOWRhODcxNzA4NDJkZGM1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZmU3NjU5MWMzZDc0NGRhYmM1YTA3YThkMDUyMWYzMy5iaW5kUG9wdXAocG9wdXBfNjY5ZGY2ODRmZWY1NDgwMDk2NmY1MmI5ZTYwNTgwMWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzU2OGUyZjIzOGZlNDRiNGJkZTc0N2ZkZjNkMzg2OTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTYzNzk4NDMxNzA3MSwtNzQuMDA5NjI5MzM0NTM0MjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWRiZTVjNDE0MTViNDgzYmI2MDNmNmFlNDgyNjhiNGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDhjODQ4MTVkZjU4NDlmNWI4Nzk4MjQ2YTI5M2M4OTYgPSAkKCc8ZGl2IGlkPSJodG1sX2Q4Yzg0ODE1ZGY1ODQ5ZjViODc5ODI0NmEyOTNjODk2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgQW1lcmljYW4gUmVzdGF1cmFudDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWRiZTVjNDE0MTViNDgzYmI2MDNmNmFlNDgyNjhiNGYuc2V0Q29udGVudChodG1sX2Q4Yzg0ODE1ZGY1ODQ5ZjViODc5ODI0NmEyOTNjODk2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M1NjhlMmYyMzhmZTQ0YjRiZGU3NDdmZGYzZDM4NjkyLmJpbmRQb3B1cChwb3B1cF9hZGJlNWM0MTQxNWI0ODNiYjYwM2Y2YWU0ODI2OGI0Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZjI2MWYwMDg3Y2I0YzFlODIwYzM3YmNhNWZkYjk4OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxNTU5ODQ4NjY4NzY3NSwtNzQuMDA3ODgyMjc1MTEyODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmQ3MjU0NTk5OWVlNGFiOWJjNTI2M2FiMmJhYjhmZDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTNlN2QxMTI0YzIyNGY4MTliNjljN2E1ZTAzMTk4MDUgPSAkKCc8ZGl2IGlkPSJodG1sX2UzZTdkMTEyNGMyMjRmODE5YjY5YzdhNWUwMzE5ODA1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcGE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZkNzI1NDU5OTllZTRhYjliYzUyNjNhYjJiYWI4ZmQwLnNldENvbnRlbnQoaHRtbF9lM2U3ZDExMjRjMjI0ZjgxOWI2OWM3YTVlMDMxOTgwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZjI2MWYwMDg3Y2I0YzFlODIwYzM3YmNhNWZkYjk4OS5iaW5kUG9wdXAocG9wdXBfZmQ3MjU0NTk5OWVlNGFiOWJjNTI2M2FiMmJhYjhmZDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODE0Y2YwNzEzZjhmNDhiOWFkNTZhYjUwY2E3NjNhMjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTQ5NjMxOTc5MTgxMSwtNzQuMDA5ODM4NzM4MzUxMjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTk0OWQ1NzljNjE5NGIyYWE4NmEyZGU5MWNmN2IzZDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODU5MWZkODdiMmJmNDQ1ZGI3OWQ5NTQzZTY4MTc5NTkgPSAkKCc8ZGl2IGlkPSJodG1sXzg1OTFmZDg3YjJiZjQ0NWRiNzlkOTU0M2U2ODE3OTU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LaWRzIFN0b3JlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85OTQ5ZDU3OWM2MTk0YjJhYTg2YTJkZTkxY2Y3YjNkOS5zZXRDb250ZW50KGh0bWxfODU5MWZkODdiMmJmNDQ1ZGI3OWQ5NTQzZTY4MTc5NTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODE0Y2YwNzEzZjhmNDhiOWFkNTZhYjUwY2E3NjNhMjQuYmluZFBvcHVwKHBvcHVwXzk5NDlkNTc5YzYxOTRiMmFhODZhMmRlOTFjZjdiM2Q5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IwNmQxMzQ4ZTc3ZjQ2MTg5OWQyMTM1M2E2MTZmNTg3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1NjI4NjIwMDI1NiwtNzQuMDA3OTkyMjU4Mzg1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8wZjAxNTQ1ZTBiZWE0MmVjYjY4YjcwZDJlOGQ0M2U4Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NTA1NTA0Mzc5ZWE0MDVlYjdkMDM4MGM2ODg5NDJmZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MDg1OTllZDZmYmI0MWZlYWQ0ZDYxNTJkZDk4NzllMCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDA4NTk5ZWQ2ZmJiNDFmZWFkNGQ2MTUyZGQ5ODc5ZTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkd5bSAvIEZpdG5lc3MgQ2VudGVyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NTA1NTA0Mzc5ZWE0MDVlYjdkMDM4MGM2ODg5NDJmZC5zZXRDb250ZW50KGh0bWxfNDA4NTk5ZWQ2ZmJiNDFmZWFkNGQ2MTUyZGQ5ODc5ZTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjA2ZDEzNDhlNzdmNDYxODk5ZDIxMzUzYTYxNmY1ODcuYmluZFBvcHVwKHBvcHVwXzk1MDU1MDQzNzllYTQwNWViN2QwMzgwYzY4ODk0MmZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IxZTdkMjZlZGI2MjRmZDc4MTVmNjUyMTRkNmVjNDFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1ODg1MTI2MDg2MDE1LC03NC4wMDg3MTM2MTkwMjQxOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8wZjAxNTQ1ZTBiZWE0MmVjYjY4YjcwZDJlOGQ0M2U4Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYTEzZjFjMTM0NGM0MjI1OTBmNjNhMjFiNGU3YmJhZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZDYzZTg4NGFkNzM0MWQ2ODkzMGJiOTM2MmM4YTg5YiA9ICQoJzxkaXYgaWQ9Imh0bWxfMmQ2M2U4ODRhZDczNDFkNjg5MzBiYjkzNjJjOGE4OWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvY2t0YWlsIEJhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmExM2YxYzEzNDRjNDIyNTkwZjYzYTIxYjRlN2JiYWYuc2V0Q29udGVudChodG1sXzJkNjNlODg0YWQ3MzQxZDY4OTMwYmI5MzYyYzhhODliKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IxZTdkMjZlZGI2MjRmZDc4MTVmNjUyMTRkNmVjNDFhLmJpbmRQb3B1cChwb3B1cF9mYTEzZjFjMTM0NGM0MjI1OTBmNjNhMjFiNGU3YmJhZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZGRlOTkzM2QwZmI0MzMzYWI4ZWJjOTFmZDcwZGIxZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxNDM1LC03NC4wMDk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzBmMDE1NDVlMGJlYTQyZWNiNjhiNzBkMmU4ZDQzZTgzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMyMzNiZGU2N2JhYTRhZmFiOTNhZWNmN2VkYzgwODk3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZhZjE3OGUxYzc2YjQwOGI5YmI2Y2NjYzg3MzVlNGQ3ID0gJCgnPGRpdiBpZD0iaHRtbF9mYWYxNzhlMWM3NmI0MDhiOWJiNmNjY2M4NzM1ZTRkNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RyaXAgQ2x1YjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzIzM2JkZTY3YmFhNGFmYWI5M2FlY2Y3ZWRjODA4OTcuc2V0Q29udGVudChodG1sX2ZhZjE3OGUxYzc2YjQwOGI5YmI2Y2NjYzg3MzVlNGQ3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhkZGU5OTMzZDBmYjQzMzNhYjhlYmM5MWZkNzBkYjFmLmJpbmRQb3B1cChwb3B1cF8zMjMzYmRlNjdiYWE0YWZhYjkzYWVjZjdlZGM4MDg5Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MDg2MTJlZWY2MjI0YzEwYmRkNDMwMjJkZmExYjUzOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxNjY4NDM5MjI3ODIyLC03NC4wMDgzNDM0Mjg2OTIzOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8wZjAxNTQ1ZTBiZWE0MmVjYjY4YjcwZDJlOGQ0M2U4Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMDQxYTY4ZjBjYmU0ODk5YjBkZWY1MDA2ZDNjMzk5NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMzMxNmVmNTMyZjY0OTFhYjc4NTk5ODJiNDA3NjJlYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjMzMTZlZjUzMmY2NDkxYWI3ODU5OTgyYjQwNzYyZWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1c2hpIFJlc3RhdXJhbnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YwNDFhNjhmMGNiZTQ4OTliMGRlZjUwMDZkM2MzOTk0LnNldENvbnRlbnQoaHRtbF9mMzMxNmVmNTMyZjY0OTFhYjc4NTk5ODJiNDA3NjJlYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MDg2MTJlZWY2MjI0YzEwYmRkNDMwMjJkZmExYjUzOC5iaW5kUG9wdXAocG9wdXBfZjA0MWE2OGYwY2JlNDg5OWIwZGVmNTAwNmQzYzM5OTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTNmNjUxMjYxOGE2NDRhMGI4YWZmYzVkMTFmMWY2N2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTQzNDIyOTAxNTgwODYsLTc0LjAwODA5MzU2ODQwMDA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzBmMDE1NDVlMGJlYTQyZWNiNjhiNzBkMmU4ZDQzZTgzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M0ZTJkNDQyMzg4MzRmMTQ4ZWFiN2UyYjUwOGIwMjZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA4MTlhZTQ5OTI3MTQ0NThhZDk1YWQyMDg1YzFmODIxID0gJCgnPGRpdiBpZD0iaHRtbF8wODE5YWU0OTkyNzE0NDU4YWQ5NWFkMjA4NWMxZjgyMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WW9nYSBTdHVkaW88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M0ZTJkNDQyMzg4MzRmMTQ4ZWFiN2UyYjUwOGIwMjZjLnNldENvbnRlbnQoaHRtbF8wODE5YWU0OTkyNzE0NDU4YWQ5NWFkMjA4NWMxZjgyMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xM2Y2NTEyNjE4YTY0NGEwYjhhZmZjNWQxMWYxZjY3ZS5iaW5kUG9wdXAocG9wdXBfYzRlMmQ0NDIzODgzNGYxNDhlYWI3ZTJiNTA4YjAyNmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTUzNGU1ZDYxMzM0NDE3NDgzZDI1OTZiYjBiNGI4NGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTU1OCwtNzQuMDA5ODVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODExYjk0NDE3ODUzNDJiMDlmZGM4YThhMTUxNzMxYjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDQ0ZTdlOWE3MjAwNDE4Zjk1ZDJmMDRlMjdiZDMyOGIgPSAkKCc8ZGl2IGlkPSJodG1sXzQ0NGU3ZTlhNzIwMDQxOGY5NWQyZjA0ZTI3YmQzMjhiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYWdlbCBTaG9wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MTFiOTQ0MTc4NTM0MmIwOWZkYzhhOGExNTE3MzFiNy5zZXRDb250ZW50KGh0bWxfNDQ0ZTdlOWE3MjAwNDE4Zjk1ZDJmMDRlMjdiZDMyOGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTUzNGU1ZDYxMzM0NDE3NDgzZDI1OTZiYjBiNGI4NGQuYmluZFBvcHVwKHBvcHVwXzgxMWI5NDQxNzg1MzQyYjA5ZmRjOGE4YTE1MTczMWI3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA2ZTVkMWY1ZGIxMTRjZGRiNzIyMmZkZWJkZDE0YmNjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE0NzU0MTUxNDYxMjM2LC03NC4wMDc1ODA2MDAyMDM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzBmMDE1NDVlMGJlYTQyZWNiNjhiNzBkMmU4ZDQzZTgzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU4OTU3ZjU3ZTdkMDQ0YmVhMWNkY2Y3NDAxNWRlMzQzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MzZDMxZDNlM2Q4YjQ5Yzc5YTZiOTU2MzMyMTdlODNiID0gJCgnPGRpdiBpZD0iaHRtbF9jM2QzMWQzZTNkOGI0OWM3OWE2Yjk1NjMzMjE3ZTgzYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnJlbmNoIFJlc3RhdXJhbnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU4OTU3ZjU3ZTdkMDQ0YmVhMWNkY2Y3NDAxNWRlMzQzLnNldENvbnRlbnQoaHRtbF9jM2QzMWQzZTNkOGI0OWM3OWE2Yjk1NjMzMjE3ZTgzYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNmU1ZDFmNWRiMTE0Y2RkYjcyMjJmZGViZGQxNGJjYy5iaW5kUG9wdXAocG9wdXBfNTg5NTdmNTdlN2QwNDRiZWExY2RjZjc0MDE1ZGUzNDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGNjOTg4Nzc2ODA5NGQ4ZTk1OGM5YTU2ZjcyZDBhNmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTUwNDUxMjU1ODk5NiwtNzQuMDExNTA4NzEwMjgyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8wZjAxNTQ1ZTBiZWE0MmVjYjY4YjcwZDJlOGQ0M2U4Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNGIwNDkyNDE2OTA0NzYxYTAxMDZlNjE4MGRhMWI1YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMzgyY2YyNjczN2E0MjczYmM0MTE2YjU0MGU3YThlOCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTM4MmNmMjY3MzdhNDI3M2JjNDExNmI1NDBlN2E4ZTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvZmZlZSBTaG9wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNGIwNDkyNDE2OTA0NzYxYTAxMDZlNjE4MGRhMWI1Yy5zZXRDb250ZW50KGh0bWxfMTM4MmNmMjY3MzdhNDI3M2JjNDExNmI1NDBlN2E4ZTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGNjOTg4Nzc2ODA5NGQ4ZTk1OGM5YTU2ZjcyZDBhNmMuYmluZFBvcHVwKHBvcHVwX2M0YjA0OTI0MTY5MDQ3NjFhMDEwNmU2MTgwZGExYjVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M5Nzg0MGU3NWE4NjRjMjI5YmViNTZhNWQ3N2ZlZTRjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE0NzIxMTY3OTY4MzksLTc0LjAwOTgzMTgxOTY2NjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGYwMTU0NWUwYmVhNDJlY2I2OGI3MGQyZThkNDNlODMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWU4YzIyMjlkYjkzNDNiMWIwNTY2NTM4MThkNzRkZWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjcwMmVkMTk4M2JhNGRkNDgxMDE0ZTUwMGJhMThhNWUgPSAkKCc8ZGl2IGlkPSJodG1sXzY3MDJlZDE5ODNiYTRkZDQ4MTAxNGU1MDBiYTE4YTVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaW5lIEJhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWU4YzIyMjlkYjkzNDNiMWIwNTY2NTM4MThkNzRkZWIuc2V0Q29udGVudChodG1sXzY3MDJlZDE5ODNiYTRkZDQ4MTAxNGU1MDBiYTE4YTVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M5Nzg0MGU3NWE4NjRjMjI5YmViNTZhNWQ3N2ZlZTRjLmJpbmRQb3B1cChwb3B1cF9lZThjMjIyOWRiOTM0M2IxYjA1NjY1MzgxOGQ3NGRlYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YmI3ODQ3ZDdiOTg0OTEzOGM2ZWQ5OWI3MWEzMDkyMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxNDgwMjk1ODk0NDY3LC03NC4wMDc2NTY0MjA2MzQ1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8wZjAxNTQ1ZTBiZWE0MmVjYjY4YjcwZDJlOGQ0M2U4Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYWRjMzE2YTI3Zjc0NjM0YWFjOGVjNmNiN2ViZTBhOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYjBhMGM0NGNkY2Q0NGQ5OTVhZjBkMGQ1OTZhN2JiYiA9ICQoJzxkaXYgaWQ9Imh0bWxfYmIwYTBjNDRjZGNkNDRkOTk1YWYwZDBkNTk2YTdiYmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkN1YmFuIFJlc3RhdXJhbnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VhZGMzMTZhMjdmNzQ2MzRhYWM4ZWM2Y2I3ZWJlMGE4LnNldENvbnRlbnQoaHRtbF9iYjBhMGM0NGNkY2Q0NGQ5OTVhZjBkMGQ1OTZhN2JiYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YmI3ODQ3ZDdiOTg0OTEzOGM2ZWQ5OWI3MWEzMDkyMi5iaW5kUG9wdXAocG9wdXBfZWFkYzMxNmEyN2Y3NDYzNGFhYzhlYzZjYjdlYmUwYTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
], | |
"text/plain": [ | |
"<folium.folium.Map at 0x7febc806ca58>" | |
] | |
}, | |
"execution_count": 35, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"venues_map = folium.Map(location=[latitude, longitude], zoom_start=15) # generate map centred around Ecco\n", | |
"\n", | |
"\n", | |
"# add Ecco as a red circle mark\n", | |
"folium.features.CircleMarker(\n", | |
" [latitude, longitude],\n", | |
" radius=10,\n", | |
" popup='Ecco',\n", | |
" fill=True,\n", | |
" color='red',\n", | |
" fill_color='red',\n", | |
" fill_opacity=0.6\n", | |
" ).add_to(venues_map)\n", | |
"\n", | |
"\n", | |
"# add popular spots to the map as blue circle markers\n", | |
"for lat, lng, label in zip(dataframe_filtered.lat, dataframe_filtered.lng, dataframe_filtered.categories):\n", | |
" folium.features.CircleMarker(\n", | |
" [lat, lng],\n", | |
" radius=5,\n", | |
" popup=label,\n", | |
" fill=True,\n", | |
" color='blue',\n", | |
" fill_color='blue',\n", | |
" fill_opacity=0.6\n", | |
" ).add_to(venues_map)\n", | |
"\n", | |
"# display map\n", | |
"venues_map" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
" " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"<a id=\"item5\"></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"## 5. Explore Trending Venues\n", | |
"> `https://api.foursquare.com/v2/venues/`**trending**`?client_id=`**CLIENT_ID**`&client_secret=`**CLIENT_SECRET**`&ll=`**LATITUDE**`,`**LONGITUDE**`&v=`**VERSION**" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Now, instead of simply exploring the area around Ecco, you are interested in knowing the venues that are trending at the time you are done with your lunch, meaning the places with the highest foot traffic. So let's do that and get the trending venues around Ecco." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 36, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'meta': {'code': 200, 'requestId': '5ca3edc2dd57977cb3d2cc88'},\n", | |
" 'response': {'venues': [{'id': '4ad1fd63f964a520b2de20e3',\n", | |
" 'name': 'Tanahey Playground',\n", | |
" 'location': {'address': '20 Catherine Slip',\n", | |
" 'crossStreet': 'Water St',\n", | |
" 'lat': 40.70979085603332,\n", | |
" 'lng': -73.99735772348454,\n", | |
" 'labeledLatLngs': [{'label': 'display',\n", | |
" 'lat': 40.70979085603332,\n", | |
" 'lng': -73.99735772348454}],\n", | |
" 'distance': 1149,\n", | |
" 'postalCode': '10038',\n", | |
" 'cc': 'US',\n", | |
" 'city': 'New York',\n", | |
" 'state': 'NY',\n", | |
" 'country': 'United States',\n", | |
" 'formattedAddress': ['20 Catherine Slip (Water St)',\n", | |
" 'New York, NY 10038',\n", | |
" 'United States']},\n", | |
" 'categories': [{'id': '4bf58dd8d48988d1e7941735',\n", | |
" 'name': 'Playground',\n", | |
" 'pluralName': 'Playgrounds',\n", | |
" 'shortName': 'Playground',\n", | |
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/parks_outdoors/playground_',\n", | |
" 'suffix': '.png'},\n", | |
" 'primary': True}]},\n", | |
" {'id': '4a854ca7f964a52029fe1fe3',\n", | |
" 'name': 'New York Sports Clubs',\n", | |
" 'location': {'address': '232 Mercer St',\n", | |
" 'crossStreet': 'at 3rd St',\n", | |
" 'lat': 40.727556,\n", | |
" 'lng': -73.9959131,\n", | |
" 'labeledLatLngs': [{'label': 'display',\n", | |
" 'lat': 40.727556,\n", | |
" 'lng': -73.9959131}],\n", | |
" 'distance': 1743,\n", | |
" 'postalCode': '10012',\n", | |
" 'cc': 'US',\n", | |
" 'city': 'New York',\n", | |
" 'state': 'NY',\n", | |
" 'country': 'United States',\n", | |
" 'formattedAddress': ['232 Mercer St (at 3rd St)',\n", | |
" 'New York, NY 10012',\n", | |
" 'United States']},\n", | |
" 'categories': [{'id': '4bf58dd8d48988d175941735',\n", | |
" 'name': 'Gym / Fitness Center',\n", | |
" 'pluralName': 'Gyms or Fitness Centers',\n", | |
" 'shortName': 'Gym / Fitness',\n", | |
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/gym_',\n", | |
" 'suffix': '.png'},\n", | |
" 'primary': True}]},\n", | |
" {'id': '5bb55e10c0af57002c80d3f0',\n", | |
" 'name': 'Woo Soho',\n", | |
" 'location': {'address': '206 Spring St, New York, NY 10012',\n", | |
" 'lat': 40.725330505169744,\n", | |
" 'lng': -74.00383020299347,\n", | |
" 'labeledLatLngs': [{'label': 'display',\n", | |
" 'lat': 40.725330505169744,\n", | |
" 'lng': -74.00383020299347}],\n", | |
" 'distance': 1190,\n", | |
" 'postalCode': '10012',\n", | |
" 'cc': 'US',\n", | |
" 'city': 'New York',\n", | |
" 'state': 'NY',\n", | |
" 'country': 'United States',\n", | |
" 'formattedAddress': ['206 Spring St, New York, NY 10012',\n", | |
" 'New York, NY 10012',\n", | |
" 'United States']},\n", | |
" 'categories': [{'id': '4bf58dd8d48988d113941735',\n", | |
" 'name': 'Korean Restaurant',\n", | |
" 'pluralName': 'Korean Restaurants',\n", | |
" 'shortName': 'Korean',\n", | |
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/korean_',\n", | |
" 'suffix': '.png'},\n", | |
" 'primary': True}],\n", | |
" 'delivery': {'id': '1124745',\n", | |
" 'url': 'https://www.seamless.com/menu/the-woo-206-spring-st-new-york/1124745?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=1124745',\n", | |
" 'provider': {'name': 'seamless',\n", | |
" 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n", | |
" 'sizes': [40, 50],\n", | |
" 'name': '/delivery_provider_seamless_20180129.png'}}}}]}}" | |
] | |
}, | |
"execution_count": 36, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# define URL\n", | |
"url = 'https://api.foursquare.com/v2/venues/trending?client_id={}&client_secret={}&ll={},{}&v={}'.format(CLIENT_ID, CLIENT_SECRET, latitude, longitude, VERSION)\n", | |
"\n", | |
"# send GET request and get trending venues\n", | |
"results = requests.get(url).json()\n", | |
"results" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"### Check if any venues are trending at this time" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 38, | |
"metadata": { | |
"button": false, | |
"collapsed": true, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"if len(results['response']['venues']) == 0:\n", | |
" trending_venues_df = 'No trending venues are available at the moment!'\n", | |
" \n", | |
"else:\n", | |
" trending_venues = results['response']['venues']\n", | |
" trending_venues_df = json_normalize(trending_venues)\n", | |
"\n", | |
" # filter columns\n", | |
" columns_filtered = ['name', 'categories'] + ['location.distance', 'location.city', 'location.postalCode', 'location.state', 'location.country', 'location.lat', 'location.lng']\n", | |
" trending_venues_df = trending_venues_df.loc[:, columns_filtered]\n", | |
"\n", | |
" # filter the category for each row\n", | |
" trending_venues_df['categories'] = trending_venues_df.apply(get_category_type, axis=1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 39, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>name</th>\n", | |
" <th>categories</th>\n", | |
" <th>location.distance</th>\n", | |
" <th>location.city</th>\n", | |
" <th>location.postalCode</th>\n", | |
" <th>location.state</th>\n", | |
" <th>location.country</th>\n", | |
" <th>location.lat</th>\n", | |
" <th>location.lng</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>Tanahey Playground</td>\n", | |
" <td>Playground</td>\n", | |
" <td>1149</td>\n", | |
" <td>New York</td>\n", | |
" <td>10038</td>\n", | |
" <td>NY</td>\n", | |
" <td>United States</td>\n", | |
" <td>40.709791</td>\n", | |
" <td>-73.997358</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>New York Sports Clubs</td>\n", | |
" <td>Gym / Fitness Center</td>\n", | |
" <td>1743</td>\n", | |
" <td>New York</td>\n", | |
" <td>10012</td>\n", | |
" <td>NY</td>\n", | |
" <td>United States</td>\n", | |
" <td>40.727556</td>\n", | |
" <td>-73.995913</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>Woo Soho</td>\n", | |
" <td>Korean Restaurant</td>\n", | |
" <td>1190</td>\n", | |
" <td>New York</td>\n", | |
" <td>10012</td>\n", | |
" <td>NY</td>\n", | |
" <td>United States</td>\n", | |
" <td>40.725331</td>\n", | |
" <td>-74.003830</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" name categories location.distance \\\n", | |
"0 Tanahey Playground Playground 1149 \n", | |
"1 New York Sports Clubs Gym / Fitness Center 1743 \n", | |
"2 Woo Soho Korean Restaurant 1190 \n", | |
"\n", | |
" location.city location.postalCode location.state location.country \\\n", | |
"0 New York 10038 NY United States \n", | |
"1 New York 10012 NY United States \n", | |
"2 New York 10012 NY United States \n", | |
"\n", | |
" location.lat location.lng \n", | |
"0 40.709791 -73.997358 \n", | |
"1 40.727556 -73.995913 \n", | |
"2 40.725331 -74.003830 " | |
] | |
}, | |
"execution_count": 39, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# display trending venues\n", | |
"trending_venues_df" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Now, depending on when you run the above code, you might get different venues since the venues with the highest foot traffic are fetched live. " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"### Visualize trending venues" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 40, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"if len(results['response']['venues']) == 0:\n", | |
" venues_map = 'Cannot generate visual as no trending venues are available at the moment!'\n", | |
"\n", | |
"else:\n", | |
" venues_map = folium.Map(location=[latitude, longitude], zoom_start=15) # generate map centred around Ecco\n", | |
"\n", | |
"\n", | |
" # add Ecco as a red circle mark\n", | |
" folium.features.CircleMarker(\n", | |
" [latitude, longitude],\n", | |
" radius=10,\n", | |
" popup='Ecco',\n", | |
" fill=True,\n", | |
" color='red',\n", | |
" fill_color='red',\n", | |
" fill_opacity=0.6\n", | |
" ).add_to(venues_map)\n", | |
"\n", | |
"\n", | |
" # add the trending venues as blue circle markers\n", | |
" for lat, lng, label in zip(trending_venues_df['location.lat'], trending_venues_df['location.lng'], trending_venues_df['name']):\n", | |
" folium.features.CircleMarker(\n", | |
" [lat, lng],\n", | |
" radius=5,\n", | |
" poup=label,\n", | |
" fill=True,\n", | |
" color='blue',\n", | |
" fill_color='blue',\n", | |
" fill_opacity=0.6\n", | |
" ).add_to(venues_map)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 41, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfOTc1OGI0YWYwMWEyNDAzY2IxZjk5OTIwY2MwODgyNDYgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzk3NThiNGFmMDFhMjQwM2NiMWY5OTkyMGNjMDg4MjQ2IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF85NzU4YjRhZjAxYTI0MDNjYjFmOTk5MjBjYzA4ODI0NiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF85NzU4YjRhZjAxYTI0MDNjYjFmOTk5MjBjYzA4ODI0NicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzE1MzM3LC03NC4wMDg4NDhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2Q4NzBhNzczOGRiZjQ1NWI5MWFmOTA4NTVmYWM4NjlkID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk3NThiNGFmMDFhMjQwM2NiMWY5OTkyMGNjMDg4MjQ2KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMzU5NGIxMWUyOTc0MWE3YWY1MzE0MmQ1Y2NmODc3YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxNTMzNywtNzQuMDA4ODQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTc1OGI0YWYwMWEyNDAzY2IxZjk5OTIwY2MwODgyNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmQ5YmE0ODI2MzRlNGU0YmE5MmI5OTI5MjIwMmM2ODMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTIxNzA4NzdlNjJhNDcyZjhjNjY3NTgxY2MzZDNkNDIgPSAkKCc8ZGl2IGlkPSJodG1sX2UyMTcwODc3ZTYyYTQ3MmY4YzY2NzU4MWNjM2QzZDQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FY2NvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZDliYTQ4MjYzNGU0ZTRiYTkyYjk5MjkyMjAyYzY4My5zZXRDb250ZW50KGh0bWxfZTIxNzA4NzdlNjJhNDcyZjhjNjY3NTgxY2MzZDNkNDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjM1OTRiMTFlMjk3NDFhN2FmNTMxNDJkNWNjZjg3N2IuYmluZFBvcHVwKHBvcHVwXzZkOWJhNDgyNjM0ZTRlNGJhOTJiOTkyOTIyMDJjNjgzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZkOTQ0MTZhZWJkNjRjZmFhODY4YzM4YjBiZGVjMTg2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA5NzkwODU2MDMzMzIsLTczLjk5NzM1NzcyMzQ4NDU0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk3NThiNGFmMDFhMjQwM2NiMWY5OTkyMGNjMDg4MjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzg1ZTMzZDljMjUxNGU3NjljZjYzMTY3NGI5MzQ3OTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43Mjc1NTYsLTczLjk5NTkxMzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTc1OGI0YWYwMWEyNDAzY2IxZjk5OTIwY2MwODgyNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iODU1NTE2M2ZiZTM0MDcyOWQxNzZkZWJjN2YwYjhkNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcyNTMzMDUwNTE2OTc0NCwtNzQuMDAzODMwMjAyOTkzNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTc1OGI0YWYwMWEyNDAzY2IxZjk5OTIwY2MwODgyNDYpOwogICAgICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
], | |
"text/plain": [ | |
"<folium.folium.Map at 0x7febc3f09e10>" | |
] | |
}, | |
"execution_count": 41, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# display map\n", | |
"venues_map" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"<a id=\"item6\"></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
" " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"### Thank you for completing this lab!\n", | |
"\n", | |
"This notebook was created by [Alex Aklson](https://www.linkedin.com/in/aklson/). I hope you found this lab interesting and educational. Feel free to contact me if you have any questions!" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"This notebook is part of a course on **Coursera** called *Applied Data Science Capstone*. If you accessed this notebook outside the course, you can take this course online by clicking [here](http://cocl.us/DP0701EN_Coursera_Week2_LAB1)." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"<hr>\n", | |
"Copyright © 2018 [Cognitive Class](https://cognitiveclass.ai/?utm_source=bducopyrightlink&utm_medium=dswb&utm_campaign=bdu). This notebook and its source code are released under the terms of the [MIT License](https://bigdatauniversity.com/mit-license/)." | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.8" | |
}, | |
"widgets": { | |
"state": {}, | |
"version": "1.1.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment