first commit

This commit is contained in:
H.T. Kruitbosch committed 2018-09-28 10:41:09 +02:00
commit 6968a587ba
136 files changed
+1411596

No files matched your search

File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+430
View File
@@ -0,0 +1,430 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"with open('martijn_format/Dutch613-coordinates.txt') as f:\n",
" coordinates = list(f)\n",
" \n",
"with open('martijn_format/Nederlands-ipa.utxt') as f:\n",
" table = list(f)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['Aalsmeer NH', '4.76163', '52.2693\\n']"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"coordinates[1].split('\\t')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['',\n",
" 'kippen',\n",
" 'mijn',\n",
" 'vriend',\n",
" 'bloemen',\n",
" 'spinnen',\n",
" 'machines',\n",
" 'werk',\n",
" 'op',\n",
" 'schip',\n",
" 'kregen',\n",
" 'beschimmeld',\n",
" 'brood',\n",
" 'timmerman',\n",
" 'splinter',\n",
" 'vinger',\n",
" 'fabriek',\n",
" 'vier',\n",
" 'bier',\n",
" 'twee',\n",
" 'drie',\n",
" 'hij',\n",
" 'knuppel',\n",
" 'ik',\n",
" 'knie',\n",
" 'gezien',\n",
" 'ragebol',\n",
" 'pet',\n",
" 'paddestoel',\n",
" 'kerel',\n",
" 'brede',\n",
" 'stenen',\n",
" 'breder',\n",
" 'breedste',\n",
" 'standbeeld',\n",
" 'duivel',\n",
" 'gebleven',\n",
" 'meester',\n",
" 'zee',\n",
" 'graag',\n",
" 'keelpijn',\n",
" 'steel',\n",
" 'bezem',\n",
" 'neen',\n",
" 'geroepen',\n",
" 'peer',\n",
" 'rijp',\n",
" 'geld',\n",
" 'ver',\n",
" 'brengen',\n",
" 'vrouw',\n",
" 'zwemmen',\n",
" 'sterk',\n",
" 'bed',\n",
" 'optillen',\n",
" 'metselaar',\n",
" 'springen',\n",
" 'boterham',\n",
" 'vader',\n",
" 'zes',\n",
" 'jaar',\n",
" 'school',\n",
" 'laten',\n",
" 'gaan',\n",
" 'water',\n",
" 'potten',\n",
" 'zijn',\n",
" 'veel',\n",
" 'maart',\n",
" 'nog',\n",
" 'koud',\n",
" 'kaars',\n",
" 'geeft',\n",
" 'licht',\n",
" 'paard',\n",
" 'tegen',\n",
" 'zwaluwen',\n",
" 'kaas',\n",
" 'motor',\n",
" 'dag',\n",
" 'avond',\n",
" 'jongetje',\n",
" 'barst',\n",
" 'brief',\n",
" 'hart',\n",
" 'spannen',\n",
" 'nieuwe',\n",
" 'kar',\n",
" 'zoon',\n",
" 'koning',\n",
" 'ook',\n",
" 'geweest',\n",
" 'rozen',\n",
" 'lange',\n",
" 'woord',\n",
" 'kindje',\n",
" 'was',\n",
" 'dochtertje',\n",
" 'bos',\n",
" 'ladder',\n",
" 'mond',\n",
" 'droog',\n",
" 'dorst',\n",
" 'weg',\n",
" 'krom',\n",
" 'liedje',\n",
" 'goed',\n",
" 'kelder',\n",
" 'voor',\n",
" 'moest',\n",
" 'ossenbloed',\n",
" 'drinken',\n",
" 'broer',\n",
" 'moe',\n",
" 'karnemelk',\n",
" 'dun',\n",
" 'zuur',\n",
" 'put',\n",
" 'uur',\n",
" 'Italië',\n",
" 'bergen',\n",
" 'vuur',\n",
" 'spuwen',\n",
" 'duwen',\n",
" 'hebben',\n",
" 'stuk',\n",
" 'brug',\n",
" 'veulen',\n",
" 'komen',\n",
" 'deur',\n",
" 'naaien',\n",
" 'gras',\n",
" 'brouwer',\n",
" 'bakken',\n",
" 'je',\n",
" 'eieren',\n",
" 'krijgen',\n",
" 'markt',\n",
" 'waren',\n",
" 'vijf',\n",
" 'eikels',\n",
" 'hooi',\n",
" 'is',\n",
" 'groen',\n",
" 'boompje',\n",
" 'wijn',\n",
" 'huis',\n",
" 'melk',\n",
" 'spuit',\n",
" 'koe',\n",
" 'koster',\n",
" 'kruiwagen',\n",
" 'buigen',\n",
" 'Duitsers',\n",
" 'blauw',\n",
" 'geslagen',\n",
" 'saus',\n",
" 'flauw',\n",
" 'sneeuw',\n",
" 'stad',\n",
" 'doen',\n",
" 'dopen',\n",
" 'doopvont',\n",
" 'soldaten',\n",
" 'dorsen',\n",
" 'binden',\n",
" 'gebonden\\n']"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"table[0].split('\\t')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['West-Terschelling',\n",
" 'kipən',\n",
" 'miŋ',\n",
" 'kɑ̟mərɑ̟ːt',\n",
" 'blʊmə',\n",
" 'spɪnə',\n",
" 'məsinəs / məʃinəs',\n",
" 'ʋɔrə̆k',\n",
" 'ʊp̬',\n",
" 'sxɪp',\n",
" 'kreːɣə̃ / krɪɣə̃',\n",
" 'fəsxɪməlt / bəsxɪməlt',\n",
" 'bro̝ˑə̆t',\n",
" 'tɪmərmɑn',\n",
" 'splɪntər',\n",
" 'fɪŋər',\n",
" 'fəbrik',\n",
" 'fjɔŭwər',\n",
" 'biˑə̆r',\n",
" 'twɑ̟',\n",
" 'treːĭjə',\n",
" 'hɛĭ',\n",
" 'knʏpəl / ɛinhɔŭt',\n",
" 'ɪk',\n",
" 'knɪbəl',\n",
" 'siˑə̆n',\n",
" 'rɑ̟ːɣəbɔl',\n",
" 'pɛt',\n",
" 'pɑ̟dəstuˑə̆l',\n",
" 'mɑ̟n',\n",
" 'breːdə / breːjə',\n",
" 'stɪn̩ː',\n",
" 'breːdər',\n",
" 'breːstə',\n",
" 'stɔndbeːlt',\n",
" 'dyvəl',\n",
" 'blɔŭn',\n",
" 'meːstər',\n",
" 'seˑ',\n",
" 'xrɑːx',\n",
" 'ətĩˑsĩkeːl',\n",
" 'stɛːl',\n",
" 'biːzəm',\n",
" 'neː',\n",
" 'rɔft',\n",
" 'pɔˑə̆r',\n",
" 'rip',\n",
" 'jɪlt',\n",
" 'fiˑə̆r',\n",
" 'brɪŋə',\n",
" 'ʋiːf',\n",
" 'swʊmə',\n",
" 'stɛrk',\n",
" 'bɛˑə̆t',\n",
" 'ʊptɪlən',\n",
" '',\n",
" 'sprɪŋə',\n",
" '',\n",
" 'tɔ̞ˑə̆',\n",
" 'sɛks',\n",
" 'jiə̆r',\n",
" 'sxuˑəl',\n",
" 'lɪtn̩̆',\n",
" 'xeˑə̆̃',\n",
" 'ʋɛtər',\n",
" 'pɔtn̩̆',\n",
" 'bɪn',\n",
" 'fʊlə',\n",
" 'mɑˑə̆t',\n",
" 'nɔx',\n",
" 'kɔˑə̆t',\n",
" 'kɛs',\n",
" 'jʊxt',\n",
" 'jɛxt',\n",
" 'hoĭsʲ',\n",
" 'tsjɪ',\n",
" 'swɑːlywə',\n",
" 'tsiːs / tsjiːs',\n",
" 'moˑtər',\n",
" 'dɛĭ',\n",
" 'ioŋ',\n",
" 'jʊŋkjə',\n",
" 'bœ̝st',\n",
" 'briːf',\n",
" 'hɔĭtʲ',\n",
" 'spɔnə',\n",
" 'niˑjə',\n",
" 'kɑ̟rə',\n",
" 'sɪn',\n",
" 'koˑə̆nɪŋ',\n",
" 'eˑə̆k',\n",
" 'ʋɛn',\n",
" 'roˑə̆zən',\n",
" 'lɑ̟ŋə',\n",
" 'ʋɔĭtʲ',\n",
" 'bɔ̞nʲ',\n",
" 'ʋɑ̟z',\n",
" 'fɑ̟mkə / dɔxtərtsə',\n",
" 'bʊs',\n",
" 'leˑə̆rt',\n",
" 'mylə',\n",
" 'drux',\n",
" 'toˑə̆st',\n",
" 'ʋɛĭ',\n",
" '',\n",
" 'fɛsjə',\n",
" 'xuˑət',\n",
" 'kɛldər',\n",
" 'fŭɑ̟r',\n",
" 'mɔs',\n",
" 'ɔsəbluˑət̬',\n",
" 'drɪŋkə',\n",
" 'bruər',\n",
" 'muˑə̆t',\n",
" 'suˑp / kɑrnəmoˑə̆lək',\n",
" 'tɪn',\n",
" 'suːr',\n",
" 'pʏt',\n",
" 'uːr',\n",
" 'itɑ̟ːljə',\n",
" 'bɑ̟rɣən',\n",
" 'fjuːr',\n",
" 'spiˑə̆n',\n",
" 'drʏkən',\n",
" 'hɑ̟bə',\n",
" 'stɪk',\n",
" 'brʏx',\n",
" 'fɔlʲtsə',\n",
" 'kʊmə',\n",
" 'doˑə̆r',\n",
" 'nɑːĭjə',\n",
" 'xɛs',\n",
" 'brɔŭwər',\n",
" 'bɑ̟kə',\n",
" 'do̞',\n",
" 'ɑːə̆jən',\n",
" 'kriˑjə',\n",
" 'mɑ̟rək / mɑrəkt',\n",
" 'wɑːrə̃',\n",
" 'fiːf',\n",
" 'ɛikəls',\n",
" 'heˑə̆',\n",
" 'ɪz',\n",
" 'xriˑə̆n',\n",
" 'boːmkə',\n",
" 'ʋin',\n",
" 'hyːs',\n",
" 'mʊə̆lək',\n",
" 'spœĭt',\n",
" 'ku',\n",
" 'kɔstər',\n",
" 'krødʋɛin',\n",
" 'buːɣə',\n",
" 'dytsərs',\n",
" 'blɑːŭ',\n",
" 'slɛin',\n",
" 'sjy',\n",
" '',\n",
" 'sneː',\n",
" 'stɑ̟t',\n",
" 'dweˑə̆n',\n",
" 'doːpə',\n",
" 'doːpfʊnt',\n",
" 'sɔldɑːtən',\n",
" 'tɛskjə',\n",
" 'binə',\n",
" 'boŋ\\n']"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"table[1].split('\\t')"
]
}
],
"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.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
File diff suppressed because it is too large. Load diff
+433
View File
@@ -0,0 +1,433 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Pronunciation-based location prediction confusion\n",
"\n",
"Setup a pandas dataframe with in each row\n",
"\n",
" * participant provided (actual) location,\n",
" * 3 estimations made by Nanna's heuristic based in what the participant stated to be the correct pronunciation of a word\n",
" * distance between the actual and heuristic predicted location\n",
" \n",
"Averages of the distances are exported for visualisation in QGIS."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pickle\n",
"import pandas\n",
"import MySQLdb\n",
"import numpy\n",
"import itertools\n",
"import requests\n",
"import json\n",
"from vincenty import vincenty\n",
"\n",
"db = MySQLdb.connect(user='root', passwd='Nmmxhjgt1@', db='stimmen')\n",
"\n",
"%matplotlib inline\n",
"from matplotlib import pyplot, rcParams\n",
"from jupyter_progressbar import ProgressBar\n",
"\n",
"# rcParams['font.family'] = 'Lucinda Console'\n",
"rcParams['font.size'] = '24'\n",
"rcParams['figure.figsize'] = (20, 10)\n",
"rcParams['figure.dpi'] = 100"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def simplify_area_name(x):\n",
" return ' '.join(\n",
" x.split('/') # split Dutch and Frysian name\n",
" [0] # extract Dutch name\n",
" .strip()\n",
" .split(' ') # Split area name from province, mostly 'Fr'\n",
" [:-1] # remove province\n",
" ).strip().lower() # rejoin spaces in area name"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"metadata = pandas.read_sql('''SELECT answer.* FROM core_surveyresultquestionanswer as answer''', db)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"grouped = metadata.groupby(['survey_result_id', 'question_id']).agg({\n",
" 'question_text': 'first',\n",
" 'answer_text': lambda x: x if len(x) == 1 else ', '.join(x)\n",
"})\n",
"grouped.reset_index(inplace=True)\n",
"\n",
"grouped = grouped.pivot(index='survey_result_id', columns='question_text', values='answer_text')\n",
"\n",
"grouped = grouped.rename({\n",
" 'Do you go to school?': 'school',\n",
" 'Do you go to university?': 'university',\n",
" 'What is your age bracket?': 'age_bracket',\n",
" 'What is your age?': 'age',\n",
" 'What is your gender?': 'gender',\n",
" 'Which language are you the most proficient in?': 'language',\n",
" 'Which languages do you actively use in your life?': 'active-languages'\n",
"}, axis='columns')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"predictions = pandas.read_sql('''\n",
"SELECT \n",
" sr.id as id,\n",
" sr.area_name as actual_area,\n",
" area1_name as area_prediction_1,\n",
" area2_name as area_prediction_2,\n",
" area3_name as area_prediction_3\n",
"FROM core_surveyresult as sr\n",
"INNER JOIN core_predictionquizresult as pq\n",
" ON sr.id = pq.survey_result_id\n",
"''', db)\n",
"\n",
"predicted_areas = set(map(simplify_area_name,\n",
" set(predictions['area_prediction_1']) |\n",
" set(predictions['area_prediction_2']) |\n",
" set(predictions['area_prediction_3'])\n",
"))\n",
"actual_areas = set(map(str.lower, predictions['actual_area']))\n",
"\n",
"areas = list(predicted_areas | actual_areas)\n",
"location_to_number = {l: i for i, l in enumerate(areas)}"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"simplified_predictions = pandas.DataFrame({\n",
" 'id': list(predictions['id']),\n",
" 'actual': list(map(str.lower, predictions['actual_area'])),\n",
" 'prediction_1': list(map(simplify_area_name, predictions['area_prediction_1'])),\n",
" 'prediction_2': list(map(simplify_area_name, predictions['area_prediction_2'])),\n",
" 'prediction_3': list(map(simplify_area_name, predictions['area_prediction_3'])),\n",
"})\n",
"# simplified_predictions.set_index('id')\n",
"simplified_predictions.to_excel('actual-predictions.xls')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"locations = {location for c in simplified_predictions.columns for location in simplified_predictions[c] if c != 'id'}"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"names = pandas.read_csv('plaatsen_nl.csv')\n",
"\n",
"nonominatim = {\n",
" name: [row['st_y'], row['x']]\n",
" for _, row in names.iterrows()\n",
" for column in ['bebouwdeko', 'naamoffici', 'naamnl', 'naamfries']\n",
"# for _ in [ print(row[column]) ]\n",
" if type(row[column]) == str\n",
" for name in [row[column], row[column].lower().replace('-', ' ')]\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "21c016f24e23473e807ed3e9c2d942c6",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(HBox(children=(FloatProgress(value=0.0, max=1.0), HTML(value='<b>0</b>s passed', placeholder='0…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"nominatim = {\n",
" l: json.loads(\n",
" requests.get(\n",
" 'https://nominatim.openstreetmap.org/search.php?q=Netherlands%20'\n",
" '{}&polygon_geojson=1&viewbox=&format=json'.format(l)\n",
" ).text\n",
" )\n",
" for l in ProgressBar(locations)\n",
" if l not in nonominatim\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"latlons = {\n",
" l: (float(v[0]['lat']), float(v[0]['lon']))\n",
" for l, v in nominatim.items()\n",
" if len(v) > 0\n",
"}\n",
"latlons.update(nonominatim)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"for c in {'actual', 'prediction_1', 'prediction_2', 'prediction_3'}:\n",
" simplified_predictions['{}_latlon'.format(c)] = [\n",
" latlons.get(l, numpy.nan)\n",
" for l in simplified_predictions['{}'.format(c)]\n",
" ]"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"for c in {'prediction_1_latlon', 'prediction_2_latlon', 'prediction_3_latlon'}:\n",
" simplified_predictions['{}_distance'.format(c)] = [\n",
" vincenty(x, y) if x == x and y == y else numpy.nan\n",
" for x, y in zip(simplified_predictions['actual_latlon'], simplified_predictions[c])\n",
" ]"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"simplified_predictions = simplified_predictions[[\n",
" 'id', 'actual', 'actual_latlon', 'prediction_3_latlon_distance',\n",
" 'prediction_1_latlon_distance', 'prediction_2_latlon_distance'\n",
"]]\n",
"\n",
"simplified_predictions = simplified_predictions.rename({\n",
" 'prediction_3_latlon_distance': 'distance3',\n",
" 'prediction_1_latlon_distance': 'distance1',\n",
" 'prediction_2_latlon_distance': 'distance2'\n",
"}, axis='columns')"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"simplified_predictions = simplified_predictions.join(grouped, on='id')"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"simplified_predictions['latitude'] = simplified_predictions['actual_latlon'].map(lambda x: x[0] if x == x else None)\n",
"simplified_predictions['longitude'] = simplified_predictions['actual_latlon'].map(lambda x: x[1] if x == x else None)\n",
"simplified_predictions = simplified_predictions.drop('actual_latlon', axis='columns')"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"simplified_predictions['age_groups'] = [\n",
" {'0-10': '0-20', '11-20': '0-20',\n",
" '21-30': '21-50', '31-40': '21-50', '41-50': '21-50',\n",
" '51-60': '51-100', '61-70': '51-100', '71-80': '51-100', '81-90': '51-100', '91-100': '51-100'}.get(b, None)\n",
" for b in simplified_predictions['age_bracket']\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"# age_groups = simplified_predictions.groupby(['age_groups', 'actual']).agg({\n",
"# 'distance1': ['mean', 'min', 'max', 'count', 'size'],\n",
"# 'latitude': 'first',\n",
"# 'longitude': 'first'\n",
"# })\n",
"# age_groups.index.get_level_values('age_groups')"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"# gender_groups = simplified_predictions.groupby(['gender', 'actual']).agg({\n",
"# 'distance1': ['min', 'mean', 'max', 'count', 'size'],\n",
"# 'latitude': 'first',\n",
"# 'longitude': 'first'\n",
"# })\n",
"# gender_groups"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"summary = simplified_predictions[['latitude', 'longitude', 'distance1', 'distance2', 'distance3', 'actual']]"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [],
"source": [
"summary.to_csv('points.csv')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"geojson = {\n",
" \"type\": \"FeatureCollection\",\n",
" \"features\": [\n",
" {\n",
" \"type\": \"Feature\",\n",
" \"properties\": {\n",
" \"distance 1\": row['prediction_1_latlon_distance'].mean() if row['prediction_1_latlon_distance'].isnull().sum() == 0 else -0.0001,\n",
" \"distance 2\": row['prediction_2_latlon_distance'].mean() if row['prediction_2_latlon_distance'].isnull().sum() == 0 else -0.0001,\n",
" \"distance 3\": row['prediction_3_latlon_distance'].mean() if row['prediction_3_latlon_distance'].isnull().sum() == 0 else -0.0001,\n",
" \"actual\": actual\n",
" },\n",
" \"geometry\": {\n",
" \"type\": \"Point\",\n",
" \"coordinates\": list( actual_lat_lon )[::-1]\n",
" }\n",
" }\n",
" for actual, row in simplified_predictions.groupby('actual')\n",
" if actual != ''\n",
"# for _ in [ print(row['actual_latlon']), print() ]\n",
" for actual_lat_lon in [list(row['actual_latlon'])[0]] # alias \n",
" if actual_lat_lon == actual_lat_lon\n",
" ]\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"geojson = {\n",
" \"type\": \"FeatureCollection\",\n",
" \"features\": [\n",
" {\n",
" \"type\": \"Feature\",\n",
" \"properties\": {\n",
" \"distance 1\": row['prediction_1_latlon_distance'].mean() if row['prediction_1_latlon_distance'].isnull().sum() == 0 else -0.0001,\n",
" \"distance 2\": row['prediction_2_latlon_distance'].mean() if row['prediction_2_latlon_distance'].isnull().sum() == 0 else -0.0001,\n",
" \"distance 3\": row['prediction_3_latlon_distance'].mean() if row['prediction_3_latlon_distance'].isnull().sum() == 0 else -0.0001,\n",
" \"actual\": actual\n",
" },\n",
" \"geometry\": {\n",
" \"type\": \"Point\",\n",
" \"coordinates\": list( actual_lat_lon )[::-1]\n",
" }\n",
" }\n",
" for actual, row in simplified_predictions.groupby('actual')\n",
" if actual != ''\n",
"# for _ in [ print(row['actual_latlon']), print() ]\n",
" for actual_lat_lon in [list(row['actual_latlon'])[0]] # alias \n",
" if actual_lat_lon == actual_lat_lon\n",
" ]\n",
"}"
]
}
],
"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.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
@@ -0,0 +1,615 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Geographical pronunciation statistics"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"import pandas\n",
"import MySQLdb\n",
"import numpy\n",
"import json\n",
"\n",
"db = MySQLdb.connect(user='root', passwd='Nmmxhjgt1@', db='stimmen', charset='utf8')\n",
"\n",
"%matplotlib notebook\n",
"from matplotlib import pyplot\n",
"import folium\n",
"from IPython.display import display\n",
"from shapely.geometry import Polygon, MultiPolygon, shape, Point, box, mapping\n",
"from jupyter_progressbar import ProgressBar\n",
"from collections import defaultdict\n",
"from ipy_table import make_table\n",
"from html import escape\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib.colors import LogNorm\n",
"from sklearn import mixture\n",
"from skimage.measure import find_contours\n",
"from collections import Counter\n",
"from random import shuffle"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Borders of Frysian municipalities\n",
"\n",
"with open('Friesland_AL8.GeoJson') as f:\n",
" gemeentes = json.load(f)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"coords = [feature['geometry'] for feature in gemeentes['features']]\n",
"coords_folium = [[[[c__[::-1] for c__ in c_] for c_ in c] for c in coords_['coordinates']] for coords_ in coords]\n",
"shapes = [shape(coords_).simplify(tolerance=0.001) for coords_ in coords]\n",
"gemeente_names = [feature['properties']['name'] for feature in gemeentes['features']]\n",
"\n",
"def get_gemeente(point):\n",
" for i, shape in enumerate(shapes):\n",
" if shape.contains(point):\n",
" return i\n",
" return -1"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"# Answers to how participants state a word should be pronounces.\n",
"\n",
"answers = pandas.read_sql('''\n",
"SELECT prediction_quiz_id, user_lat, user_lng, question_text, answer_text\n",
"FROM core_surveyresult as survey\n",
"INNER JOIN core_predictionquizresult as result ON survey.id = result.survey_result_id\n",
"INNER JOIN core_predictionquizresultquestionanswer as answer\n",
" ON result.id = answer.prediction_quiz_id\n",
"''', db)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"zero_latlng_questions = {\n",
" q\n",
" for q, row in answers.groupby('question_text').agg('std').iterrows()\n",
" if row['user_lat'] == 0 and row['user_lng'] == 0\n",
"}\n",
"answers_filtered = answers[answers['question_text'].map(lambda x: x not in zero_latlng_questions)]"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/herbert/.virtualenvs/stimmenfryslan/lib/python3.6/site-packages/ipykernel_launcher.py:10: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" # Remove the CWD from sys.path while we load stuff.\n"
]
}
],
"source": [
"# Takes approximately 2 minutes\n",
"\n",
"gemeente_map = {\n",
" (lng, lat): get_gemeente(Point(lng, lat))\n",
" for lng, lat in set(zip(answers_filtered['user_lng'], answers_filtered['user_lat']))\n",
"}\n",
"\n",
"answers_filtered['gemeente'] = [\n",
" gemeente_map[(lng, lat)]\n",
" for lat, lng in zip(answers_filtered['user_lat'], answers_filtered['user_lng'])\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/herbert/.virtualenvs/stimmenfryslan/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" \n"
]
}
],
"source": [
"answers_filtered['question_text_url'] = answers_filtered['question_text'].map(\n",
" lambda x: x.replace('\"', '').replace('*', ''))"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [],
"source": [
"def reverse(rd_multipolygon):\n",
" if len(rd_multipolygon) == 2 and tuple(map(type, rd_multipolygon)) == (float, float):\n",
" return rd_multipolygon[::-1]\n",
" return [\n",
" reverse(element)\n",
" for element in rd_multipolygon\n",
" ]"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [],
"source": [
"def get_palette(n, no_black=True, no_white=True):\n",
" with open('glasbey/{}_colors.txt'.format(n + no_black + no_white)) as f:\n",
" return [\n",
" '#%02x%02x%02x' % tuple(int(c) for c in line.replace('\\n', '').split(','))\n",
" for line in f\n",
" if not no_black or line != '0,0,0\\n'\n",
" if not no_white or line != '255,255,255\\n'\n",
" ]"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "56dab238a8864488a66a23b26dfa4ce3",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(HBox(children=(FloatProgress(value=0.0, max=1.0), HTML(value='<b>0</b>s passed', placeholder='0…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"cdfs = [\n",
" np.array([\n",
" box(xmin, ymin, xmax_, ymax).intersection(shape).area / shape.area\n",
" for xmax_ in numpy.linspace(xmin, xmax, 10001)\n",
" ][1:])\n",
" for shape in ProgressBar(shapes)\n",
" for xmin, ymin, xmax, ymax in [shape.bounds]\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 106,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6a7c2ca1bb1042ff8cfd4b6efbb14c2a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(HBox(children=(FloatProgress(value=0.0, max=1.0), HTML(value='<b>0</b>s passed', placeholder='0…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfZTg0OTY5NDgwYTUwNGZjMmJjNjY3ZTE1Y2ZiNzQ4MzEgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2U4NDk2OTQ4MGE1MDRmYzJiYzY2N2UxNWNmYjc0ODMxIiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF9lODQ5Njk0ODBhNTA0ZmMyYmM2NjdlMTVjZmI3NDgzMSA9IEwubWFwKAogICAgICAgICdtYXBfZTg0OTY5NDgwYTUwNGZjMmJjNjY3ZTE1Y2ZiNzQ4MzEnLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyX2FmZTQzNjU2ODMzNzQwYzBiOTRkNDQ1NGQzOTg0OTVkID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwX2U4NDk2OTQ4MGE1MDRmYzJiYzY2N2UxNWNmYjc0ODMxKTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fZTk3MWIxYWIxZjRkNDc5ZDg1MTc0Y2NjYTEyNDNhNjAgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba3c7bd470>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfNzA4YTZhMTAwNjgwNDNjNWI0MGQ5NTRhZWIzYWU3ODkgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzcwOGE2YTEwMDY4MDQzYzViNDBkOTU0YWViM2FlNzg5IiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF83MDhhNmExMDA2ODA0M2M1YjQwZDk1NGFlYjNhZTc4OSA9IEwubWFwKAogICAgICAgICdtYXBfNzA4YTZhMTAwNjgwNDNjNWI0MGQ5NTRhZWIzYWU3ODknLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyXzFmNDY1MjM0MDU0ZDQ1MzY5YjFmYTM4ZTA2YzAwNmFlID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwXzcwOGE2YTEwMDY4MDQzYzViNDBkOTU0YWViM2FlNzg5KTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fN2M4ZDU1MzAxODhkNGMyZjg0NWY3ZTBjOWI4NzA5YTMgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba3c807a58>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfODdmZjY4NjBhMmZkNGI5OWI4NTAzMjRiNGJmNjdjM2YgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzg3ZmY2ODYwYTJmZDRiOTliODUwMzI0YjRiZjY3YzNmIiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF84N2ZmNjg2MGEyZmQ0Yjk5Yjg1MDMyNGI0YmY2N2MzZiA9IEwubWFwKAogICAgICAgICdtYXBfODdmZjY4NjBhMmZkNGI5OWI4NTAzMjRiNGJmNjdjM2YnLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyXzI3MmYxZDIzMzM4MDQxNzRhNGU4ZGNhMGYxZTQxNzNmID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwXzg3ZmY2ODYwYTJmZDRiOTliODUwMzI0YjRiZjY3YzNmKTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fODFjZGZkYjdiMDI3NGM1OTgzMDIyNDcxZDBlMjI0ZDcgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba3b0e8a20>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfYjdmNmZmMTI4NTBmNGIxODk4ZjY3YjNmYTA1M2YzZDUgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2I3ZjZmZjEyODUwZjRiMTg5OGY2N2IzZmEwNTNmM2Q1IiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF9iN2Y2ZmYxMjg1MGY0YjE4OThmNjdiM2ZhMDUzZjNkNSA9IEwubWFwKAogICAgICAgICdtYXBfYjdmNmZmMTI4NTBmNGIxODk4ZjY3YjNmYTA1M2YzZDUnLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyX2VjZDVmYjRlZTc5ODRlYTNhM2RmYTUyNDRmNjlhZmIyID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwX2I3ZjZmZjEyODUwZjRiMTg5OGY2N2IzZmEwNTNmM2Q1KTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fYTY1ODU2ZDc3YTFiNDRmMzk3NGQxYWM1ZWY3MGM5Y2IgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba3aa0a5f8>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfYzA5ZjUzYTc2MDcyNDIzOWI3OTE3ZjQ0N2FiZTA5NDQgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2MwOWY1M2E3NjA3MjQyMzliNzkxN2Y0NDdhYmUwOTQ0IiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF9jMDlmNTNhNzYwNzI0MjM5Yjc5MTdmNDQ3YWJlMDk0NCA9IEwubWFwKAogICAgICAgICdtYXBfYzA5ZjUzYTc2MDcyNDIzOWI3OTE3ZjQ0N2FiZTA5NDQnLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyXzRkZjU3MmJmYTg5ZjQ4M2NhMTY3ZWZhYjhiOGRjMDgzID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwX2MwOWY1M2E3NjA3MjQyMzliNzkxN2Y0NDdhYmUwOTQ0KTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fYmEwYWRlYjk5YTRkNGE3ZDhlNDkzZDg4ODMwZWE1MWYgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba2e381908>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfODg1YmQyZTJjNTAxNDk2Y2ExYmVkM2ZjNGZkNDgzMDQgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzg4NWJkMmUyYzUwMTQ5NmNhMWJlZDNmYzRmZDQ4MzA0IiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF84ODViZDJlMmM1MDE0OTZjYTFiZWQzZmM0ZmQ0ODMwNCA9IEwubWFwKAogICAgICAgICdtYXBfODg1YmQyZTJjNTAxNDk2Y2ExYmVkM2ZjNGZkNDgzMDQnLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyXzBhYmViNjE4YjU0MTQ4OGNhNDU5ZTkyMjM1YWQ2NTdjID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwXzg4NWJkMmUyYzUwMTQ5NmNhMWJlZDNmYzRmZDQ4MzA0KTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fMWVhODVhMTJmMmU3NDk0MjkxYjUyOTc2NWUxZmYyZmUgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba2e381748>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfY2Y1YTg2ZTQ2NWYyNDIwOGI3ZDEyZmQzMDRmNDk2ODIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2NmNWE4NmU0NjVmMjQyMDhiN2QxMmZkMzA0ZjQ5NjgyIiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF9jZjVhODZlNDY1ZjI0MjA4YjdkMTJmZDMwNGY0OTY4MiA9IEwubWFwKAogICAgICAgICdtYXBfY2Y1YTg2ZTQ2NWYyNDIwOGI3ZDEyZmQzMDRmNDk2ODInLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyXzI0ZDQ4MTI0ZmJkYTQ1YjA5NjlmODhkMWM3MjVkZWQxID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwX2NmNWE4NmU0NjVmMjQyMDhiN2QxMmZkMzA0ZjQ5NjgyKTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fNTJhNDM2NGU1NjRhNGVmNTlmNjgwZmE5MTdlN2QyMDggPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba2e3f7ac8>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfZDgyNjI2MWVkMTM5NDczMThmM2Q1NmYxYmYyZWYwNDggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2Q4MjYyNjFlZDEzOTQ3MzE4ZjNkNTZmMWJmMmVmMDQ4IiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF9kODI2MjYxZWQxMzk0NzMxOGYzZDU2ZjFiZjJlZjA0OCA9IEwubWFwKAogICAgICAgICdtYXBfZDgyNjI2MWVkMTM5NDczMThmM2Q1NmYxYmYyZWYwNDgnLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyXzhkODViY2YxMzM5MjQwZjFiYTFlMGY5N2UyMjlhMGMxID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwX2Q4MjYyNjFlZDEzOTQ3MzE4ZjNkNTZmMWJmMmVmMDQ4KTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fZDM3NDRkMTM5ZTJlNDdjMDg2ODE4NDE0NWFiNDYzMzYgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba3a8a0ba8>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfNjgzYTBmMTkyNTg5NDRiZWExOTc5NmRmOTU1ZjY4YWEgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzY4M2EwZjE5MjU4OTQ0YmVhMTk3OTZkZjk1NWY2OGFhIiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF82ODNhMGYxOTI1ODk0NGJlYTE5Nzk2ZGY5NTVmNjhhYSA9IEwubWFwKAogICAgICAgICdtYXBfNjgzYTBmMTkyNTg5NDRiZWExOTc5NmRmOTU1ZjY4YWEnLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyXzk4MjU4M2I1NjAzYzQzZTc4MzcxODYwZGJiMzJiNmI3ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwXzY4M2EwZjE5MjU4OTQ0YmVhMTk3OTZkZjk1NWY2OGFhKTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fN2RiNWE5ZDJiMDQ3NDM2ZDlmZWNhMTgxODM3NGRlOTIgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba3b32aba8>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfNGFjZWIyY2YyYzI5NGRmYTlmYjE2MGViZGI1NzU2YjYgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzRhY2ViMmNmMmMyOTRkZmE5ZmIxNjBlYmRiNTc1NmI2IiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF80YWNlYjJjZjJjMjk0ZGZhOWZiMTYwZWJkYjU3NTZiNiA9IEwubWFwKAogICAgICAgICdtYXBfNGFjZWIyY2YyYzI5NGRmYTlmYjE2MGViZGI1NzU2YjYnLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyXzlhMGE2YjY2ZTVlODQ2Yjg4MmZhNGQ4ZjY4NWU0YjI0ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwXzRhY2ViMmNmMmMyOTRkZmE5ZmIxNjBlYmRiNTc1NmI2KTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fOTJjNjlmNmM5OTg0NGJhN2JkMjRiZTk2MGViZDU0M2IgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba3d0a2c88>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfMDAzN2FkOTNmMGM2NGFlMTlmNmRiN2QxOGJkOGUyMzEgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzAwMzdhZDkzZjBjNjRhZTE5ZjZkYjdkMThiZDhlMjMxIiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF8wMDM3YWQ5M2YwYzY0YWUxOWY2ZGI3ZDE4YmQ4ZTIzMSA9IEwubWFwKAogICAgICAgICdtYXBfMDAzN2FkOTNmMGM2NGFlMTlmNmRiN2QxOGJkOGUyMzEnLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyXzI2ZTFjOTY1MzhjZDQ0YTZhNzk4ODNhZWYxZTI0MTlkID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwXzAwMzdhZDkzZjBjNjRhZTE5ZjZkYjdkMThiZDhlMjMxKTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fZTgwMDNjYTAxNjc3NDM4M2EwODQzYTQ5ODBhZDUyMzIgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba3bb952e8>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfZGJkZGM1NDFiNGEwNDY4ZDk2YjM4YjRlYTYyNjVmNWQgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2RiZGRjNTQxYjRhMDQ2OGQ5NmIzOGI0ZWE2MjY1ZjVkIiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF9kYmRkYzU0MWI0YTA0NjhkOTZiMzhiNGVhNjI2NWY1ZCA9IEwubWFwKAogICAgICAgICdtYXBfZGJkZGM1NDFiNGEwNDY4ZDk2YjM4YjRlYTYyNjVmNWQnLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyX2U4Y2EzNGMzYzgzMTRhOWI4NTJiYzcyODczNGZiZjQ1ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwX2RiZGRjNTQxYjRhMDQ2OGQ5NmIzOGI0ZWE2MjY1ZjVkKTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fZGRlOWVjM2ZhNWNkNGYwYTgxZjNiZWQ1OGZhZTZhNWQgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba2e3b1eb8>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfNTJmMzkxN2FiNTViNGFiN2IwYTRkNjdlMWU2OWFhMGIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzUyZjM5MTdhYjU1YjRhYjdiMGE0ZDY3ZTFlNjlhYTBiIiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF81MmYzOTE3YWI1NWI0YWI3YjBhNGQ2N2UxZTY5YWEwYiA9IEwubWFwKAogICAgICAgICdtYXBfNTJmMzkxN2FiNTViNGFiN2IwYTRkNjdlMWU2OWFhMGInLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyXzNjZGYzMWI4OGVhNDQ5NjNhNTBiNjZhNmJiYjVjODg5ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwXzUyZjM5MTdhYjU1YjRhYjdiMGE0ZDY3ZTFlNjlhYTBiKTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fNzA2NWFiZGJiNGNjNDVkNmExZTJiZjFhODRhYmY4ZWUgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba3aeb94e0>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfN2NhYWNlYjlmOTg2NDMxZWJkNmRkNzE4YjI2ZDk2YmYgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzdjYWFjZWI5Zjk4NjQzMWViZDZkZDcxOGIyNmQ5NmJmIiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF83Y2FhY2ViOWY5ODY0MzFlYmQ2ZGQ3MThiMjZkOTZiZiA9IEwubWFwKAogICAgICAgICdtYXBfN2NhYWNlYjlmOTg2NDMxZWJkNmRkNzE4YjI2ZDk2YmYnLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyX2M5MWQyMGRiNzUzNTQ5YmQ5NDYyMDM0OTc1NWI2ZWQwID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwXzdjYWFjZWI5Zjk4NjQzMWViZDZkZDcxOGIyNmQ5NmJmKTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fZTNkMDU4M2VjYzE2NGFkMmIyZGUzNmMzYzY1YTk4ZTcgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba3ada81d0>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfNGIyOGI5MzUxYTY4NDZmZGJhYTkwOWY4MjJhOTY0M2QgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzRiMjhiOTM1MWE2ODQ2ZmRiYWE5MDlmODIyYTk2NDNkIiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF80YjI4YjkzNTFhNjg0NmZkYmFhOTA5ZjgyMmE5NjQzZCA9IEwubWFwKAogICAgICAgICdtYXBfNGIyOGI5MzUxYTY4NDZmZGJhYTkwOWY4MjJhOTY0M2QnLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyX2RjNzRkMTgwYjA1MjRlZDY4ZDM0MTZhYWMzYTQ0MDA5ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwXzRiMjhiOTM1MWE2ODQ2ZmRiYWE5MDlmODIyYTk2NDNkKTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fZDkyZmU2YzU5YmNlNDVjMGE5NzA2MmMwOWFiY2E4NzYgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba3af2ff28>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfMzIyZGQ3ZTNlMmY3NGRiNjg2YmQwNTYwMzIzOTQ0ZTggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzMyMmRkN2UzZTJmNzRkYjY4NmJkMDU2MDMyMzk0NGU4IiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF8zMjJkZDdlM2UyZjc0ZGI2ODZiZDA1NjAzMjM5NDRlOCA9IEwubWFwKAogICAgICAgICdtYXBfMzIyZGQ3ZTNlMmY3NGRiNjg2YmQwNTYwMzIzOTQ0ZTgnLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyXzZkZDdhMjI1MGE2ZDRiNTdiNzU0NTg4Nzc4Y2FkNTZkID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwXzMyMmRkN2UzZTJmNzRkYjY4NmJkMDU2MDMyMzk0NGU4KTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fZTRmZGM2N2RlZjM2NDUzMGJmM2NkYWY0Nzc1Mjk1YzQgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba3af2f908>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfNWNmODI5NTJmODFmNDczZWFhYWFiNTcxNTY4ODkyNWYgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzVjZjgyOTUyZjgxZjQ3M2VhYWFhYjU3MTU2ODg5MjVmIiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF81Y2Y4Mjk1MmY4MWY0NzNlYWFhYWI1NzE1Njg4OTI1ZiA9IEwubWFwKAogICAgICAgICdtYXBfNWNmODI5NTJmODFmNDczZWFhYWFiNTcxNTY4ODkyNWYnLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyX2JkMmMzZWYxNzJiMDRiZjM4OTE5YTFmODAzNGFhYjU5ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwXzVjZjgyOTUyZjgxZjQ3M2VhYWFhYjU3MTU2ODg5MjVmKTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fMGQ2ZWY0MjZiMzYwNDgzNThiY2UwOWY2MjNmYzgzZTkgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba3a7fd9e8>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfYTNhMmZiMWJiM2JlNGRmYzkwYWI4MzM1NDk1NzAzOTggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2EzYTJmYjFiYjNiZTRkZmM5MGFiODMzNTQ5NTcwMzk4IiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF9hM2EyZmIxYmIzYmU0ZGZjOTBhYjgzMzU0OTU3MDM5OCA9IEwubWFwKAogICAgICAgICdtYXBfYTNhMmZiMWJiM2JlNGRmYzkwYWI4MzM1NDk1NzAzOTgnLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyXzExNGVmN2Q5MzI1YjQ0MTRiZWJmY2NhMGM1YTRlZmU0ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwX2EzYTJmYjFiYjNiZTRkZmM5MGFiODMzNTQ5NTcwMzk4KTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fNTZhMjIwNmUzNmE4NGVkOTg2OTNmOTQyMGI1YmEzY2QgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba3a7fd518>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfYTNhMzhlMWZmYWVjNGM3MGI4MGFhMzRmNDAxNTVmZjkgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2EzYTM4ZTFmZmFlYzRjNzBiODBhYTM0ZjQwMTU1ZmY5IiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF9hM2EzOGUxZmZhZWM0YzcwYjgwYWEzNGY0MDE1NWZmOSA9IEwubWFwKAogICAgICAgICdtYXBfYTNhMzhlMWZmYWVjNGM3MGI4MGFhMzRmNDAxNTVmZjknLCB7CiAgICAgICAgY2VudGVyOiBbNTMuMTc5ODAzMzczMzkxNDMsIDUuOTAzNjk0MTM5NjA4NjgzXSwKICAgICAgICB6b29tOiAxMCwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyXzIxODhlNzFkNTEwNDQ5MDM5YTMzNjcyYTk4ODk3ZDY2ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIKfSkuYWRkVG8obWFwX2EzYTM4ZTFmZmFlYzRjNzBiODBhYTM0ZjQwMTU1ZmY5KTsKICAgIAoKICAgICAgICAgICAgdmFyIHBvbHlnb25fOWRjZjgxMTY2ODVmNDI3YTg4NGE2N2Y3YTI5NGQ2OGYgPSBMLnBvbHlnb24oCiAgICAgICAgICAgICAgICBbW1s1My4yNDA5MjQsIDYuMDE5Nzg5XSwgWzUzLjI0Mjc5MSwgNi4wMjMwOTRdLCBbNTMuMjQxMzk4LCA2LjAyNzhdLCBbNTMuMjQyNzU5LCA2LjAyODgxNl0sIFs1My4yNDI2MTcsIDYuMDM4ODQ5XSwgWzUzLjI0ODQ0OCwgNi4wNzQ1MTVdLCBbNTMuMjU5ODU1LCA2LjExMDc3NF0sIFs1My4yNjQzODMsIDYuMTQxMDU4XSwgWzUzLjI2MDE2NSwgNi4xNDQ5NzhdLCBbNTMuMjYzNjg0LCA2LjE1ODc4MV0sIFs1My4yNjE5ODUsIDYuMTYwNTIzXSwgWzUzLjI2Mzk1OCwgNi4xNjQxOTZdLCBbNTMuMjU5MDU0LCA2LjE3OTQ5MV0sIFs1My4yNTk2NTUsIDYuMTgxMTg0XSwgWzUzLjI2MTA1LCA2LjE4MDcyMV0sIFs1My4yNjMzNzgsIDYuMTkwMzg1XSwgWzUzLjI2NzI3MywgNi4xODU2N10sIFs1My4yNjk4OSwgNi4xODkyMl0sIFs1My4yNjg1ODQsIDYuMTkwNzJdLCBbNTMuMjcwMDM3LCA2LjE5Mzc5XSwgWzUzLjI2NTI2NywgNi4yMTcwOTRdLCBbNTMuMjU5ODczLCA2LjIxODk0N10sIFs1My4yNTcyNCwgNi4yMjM5NzFdLCBbNTMuMjU2ODcyLCA2LjIzMjE1OF0sIFs1My4yNTQ4NDcsIDYuMjMyMzI1XSwgWzUzLjI1MzM1NSwgNi4yMzUxMDFdLCBbNTMuMjUwOCwgNi4yMzM3MDVdLCBbNTMuMjQ5ODI2LCA2LjIyOTQ4MV0sIFs1My4yNDcxOTgsIDYuMjMxOTQ4XSwgWzUzLjI0NTA2NywgNi4yMzEwNDRdLCBbNTMuMjQxOTMyLCA2LjIxNzk3OF0sIFs1My4yMzg1OTMsIDYuMjI0OTcyXSwgWzUzLjIzNjk4NSwgNi4yMTU1NDNdLCBbNTMuMjM1MjE0LCA2LjIxNDg4Ml0sIFs1My4yMzQzNDIsIDYuMjE2NzU0XSwgWzUzLjIzNDE2MywgNi4yMTQyNThdLCBbNTMuMjI5OTg0LCA2LjIyNDcyXSwgWzUzLjIyNjgyOSwgNi4yMjYyMzddLCBbNTMuMjI1NDU1LCA2LjIyNTMzOV0sIFs1My4yMjI0NCwgNi4yMzAxNzNdLCBbNTMuMjE5MTQzLCA2LjIyODk4NF0sIFs1My4yMTc3MTQsIDYuMjI5OTQ1XSwgWzUzLjIxNDU3OSwgNi4yMjQ3NV0sIFs1My4yMTE5NjYsIDYuMjI0ODE1XSwgWzUzLjIwNTk5MywgNi4yMTkwNThdLCBbNTMuMLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fba3c826c50>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"cutoff_percentage = 0.05\n",
"\n",
"for question, rows in ProgressBar(\n",
" answers_filtered.groupby('question_text_url'),\n",
" size=len(answers_filtered['question_text_url'].unique())\n",
"):\n",
" m = folium.Map((rows['user_lat'].median(), rows['user_lng'].median()), tiles='stamentoner', zoom_start=10)\n",
" answer_texts = {\n",
" answer_text\n",
" for gemeente, _ in enumerate(gemeente_names)\n",
" for rows_ in [rows[rows['gemeente'] == gemeente]]\n",
" for answer_text, rows__ in rows_.groupby('answer_text')\n",
" if len(rows__) / len(rows_) >= cutoff_percentage\n",
" }\n",
" palette = dict(zip(answer_texts, get_palette(len(answer_texts))))\n",
" n_other = len(rows) - sum(sum(rows['answer_text'] == answer_text) for answer_text in answer_texts)\n",
" \n",
" groups = {\n",
" answer_text: folium.FeatureGroup(name=name, overlay=True)\n",
" for answer_text, color in palette.items()\n",
" for name in [\n",
" '<span style=\\\\\"color:{}; \\\\\">{} ({})'.format(\n",
" color,\n",
" escape(answer_text),\n",
" sum(rows['answer_text'] == answer_text)\n",
" )\n",
" ]\n",
" }\n",
" groups['other'] = folium.FeatureGroup(\n",
" name='<span style=\\\\\"color: black; \\\\\">{} ({})'.format(\n",
" escape('other'),n_other),\n",
" overlay=True\n",
" )\n",
" \n",
" for gemeente, gemeente_name in enumerate(gemeente_names):\n",
" rows_ = rows[rows['gemeente'] == gemeente]\n",
" order = [a for _, a in sorted((\n",
" (r['user_lat'], answer)\n",
" for answer, r in rows_.groupby('answer_text').count().iterrows()\n",
" ), reverse=True)]\n",
" gemeente_shape = shapes[gemeente]\n",
" xmin, ymin, xmax, ymax = gemeente_shape.bounds\n",
" xmin_cum = xmin\n",
"# print(sum(sum(rows_['answer_text'] == answer_text) for answer_text in order))\n",
"# print(len(rows_))\n",
" cum_percentage = 0\n",
" for i, answer_text in enumerate(order):\n",
" total = sum(rows_['answer_text'] == answer_text)\n",
" percentage = total / len(rows_)\n",
" cum_percentage += percentage\n",
" if i == 0:\n",
" max_percentage = percentage\n",
" \n",
" name = '{} ({}, {}%)'.format(answer_text, total, int(round(100*percentage)))\n",
" if percentage < cutoff_percentage:\n",
" xmax_ = xmax\n",
" color = '#ffffff'\n",
" answer_text = 'other'\n",
" total = sum(sum(rows_['answer_text'] == answer_text) for answer_text in order[i:])\n",
" percentage = total / len(rows_)\n",
" done = True\n",
" else:\n",
" percentage_corrected = numpy.abs(cdfs[gemeente] - cum_percentage).argmin() / 10000\n",
" xmax_ = xmin + percentage_corrected * (xmax - xmin)\n",
" color = palette[answer_text]\n",
" done = False\n",
" \n",
" answer_shape = gemeente_shape.intersection(box(xmin_cum, ymin, xmax_, ymax))\n",
" xmin_cum = xmax_\n",
"# color = '#%02x%02x%02x' % tuple(int(255 * c) for c in cmap(percentage / max_percentage)[:3])\n",
" \n",
" polygon = folium.Polygon(\n",
" reverse(mapping(answer_shape)['coordinates']),\n",
" fill_color=color,\n",
" fill_opacity=0.8,\n",
" color=None,\n",
" popup='{} ({}, {: 3d}%)'.format(answer_text, total, round(100*percentage))\n",
" )\n",
" polygon.add_to(groups[answer_text])\n",
" if done:\n",
" break\n",
" \n",
" polygon = folium.Polygon(\n",
" reverse(mapping(gemeente_shape)['coordinates']),\n",
" fill_color=None, color='#000000'\n",
" )\n",
" polygon.add_to(m)\n",
" \n",
" for _, group in sorted(groups.items(), key=lambda x: sum(rows['answer_text'] == x[0]), reverse=True):\n",
" group.add_to(m)\n",
" \n",
" folium.map.LayerControl('topright', collapsed=False).add_to(m)\n",
" display(m)\n",
" m.save('maps/heatmaps-combined/{}.html'.format(question))\n",
"# break"
]
},
{
"cell_type": "code",
"execution_count": 109,
"metadata": {},
"outputs": [],
"source": [
"import glob\n",
"with open('maps/heatmaps-combined/index.html', 'w') as f:\n",
" f.write('<html><head></head><body>' + \n",
" '<br/>\\n'.join(\n",
" '\\t<a href=\"{}\">{}<a>'.format(fn, fn[:-5].replace('_', ' '))\n",
" for fn in sorted(\n",
" glob.glob('maps/heatmaps-combined/*.html')\n",
" )\n",
" for fn in [fn[len('maps/heatmaps-combined/'):]]\n",
" ) + \"</body></html>\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
@@ -0,0 +1,293 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Geographical pronunciation statistics"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"import pandas\n",
"import MySQLdb\n",
"import numpy\n",
"import json\n",
"\n",
"db = MySQLdb.connect(user='root', passwd='Nmmxhjgt1@', db='stimmen', charset='utf8')\n",
"\n",
"%matplotlib notebook\n",
"from matplotlib import pyplot\n",
"import folium\n",
"from IPython.display import display\n",
"from shapely.geometry import Polygon, MultiPolygon, shape, Point\n",
"from jsbutton import JsButton\n",
"from jupyter_progressbar import ProgressBar\n",
"from collections import defaultdict\n",
"from ipy_table import make_table\n",
"from html import escape\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib.colors import LogNorm\n",
"from sklearn import mixture\n",
"from skimage.measure import find_contours\n",
"from collections import Counter\n",
"from random import shuffle"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"# Borders of Frysian municipalities\n",
"\n",
"with open('Friesland_AL8.GeoJson') as f:\n",
" gemeentes = json.load(f)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"coords = [feature['geometry'] for feature in gemeentes['features']]\n",
"coords_folium = [[[[c__[::-1] for c__ in c_] for c_ in c] for c in coords_['coordinates']] for coords_ in coords]\n",
"shapes = [shape(coords_) for coords_ in coords]\n",
"gemeente_names = [feature['properties']['name'] for feature in gemeentes['features']]\n",
"\n",
"def get_gemeente(point):\n",
" for i, shape in enumerate(shapes):\n",
" if shape.contains(point):\n",
" return i\n",
" return -1"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Answers to how participants state a word should be pronounces.\n",
"\n",
"answers = pandas.read_sql('''\n",
"SELECT prediction_quiz_id, user_lat, user_lng, question_text, answer_text\n",
"FROM core_surveyresult as survey\n",
"INNER JOIN core_predictionquizresult as result ON survey.id = result.survey_result_id\n",
"INNER JOIN core_predictionquizresultquestionanswer as answer\n",
" ON result.id = answer.prediction_quiz_id\n",
"''', db)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"zero_latlng_questions = {\n",
" q\n",
" for q, row in answers.groupby('question_text').agg('std').iterrows()\n",
" if row['user_lat'] == 0 and row['user_lng'] == 0\n",
"}\n",
"answers_filtered = answers[answers['question_text'].map(lambda x: x not in zero_latlng_questions)]"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/herbert/.virtualenvs/stimmenfryslan/lib/python3.6/site-packages/ipykernel_launcher.py:10: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" # Remove the CWD from sys.path while we load stuff.\n"
]
}
],
"source": [
"# Takes approximately 2 minutes\n",
"\n",
"gemeente_map = {\n",
" (lng, lat): get_gemeente(Point(lng, lat))\n",
" for lng, lat in set(zip(answers_filtered['user_lng'], answers_filtered['user_lat']))\n",
"}\n",
"\n",
"answers_filtered['gemeente'] = [\n",
" gemeente_map[(lng, lat)]\n",
" for lat, lng in zip(answers_filtered['user_lat'], answers_filtered['user_lng'])\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/herbert/.virtualenvs/stimmenfryslan/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" \n"
]
}
],
"source": [
"answers_filtered['question_text_url'] = answers_filtered['question_text'].map(\n",
" lambda x: x.replace('\"', '').replace('*', ''))"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e48eb24f5c43434bad4241d4bea53074",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(HBox(children=(FloatProgress(value=0.0, max=1.0), HTML(value='<b>0</b>s passed', placeholder='0…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"cmap = pyplot.get_cmap('YlOrRd')\n",
"\n",
"for question, rows in ProgressBar(\n",
" answers_filtered.groupby('question_text_url'),\n",
" size=len(answers_filtered['question_text_url'].unique())\n",
"):\n",
" m = folium.Map((rows['user_lat'].median(), rows['user_lng'].median()), tiles=None, zoom_start=9)\n",
" pecentage_labels = folium.FeatureGroup(name='pecentages', overlay=True)\n",
" order = [a for _, a in sorted((\n",
" (r['user_lat'], answer)\n",
" for answer, r in rows.groupby('answer_text').count().iterrows()\n",
" ), reverse=True)]\n",
" gemeente_normalizer = {\n",
" gemeente: r['user_lat']\n",
" for gemeente, r in rows.groupby('gemeente').count().iterrows()\n",
" }\n",
" for answer_text in order:\n",
" rows_ = rows[rows['answer_text'] == answer_text]\n",
" if (rows_['gemeente'] >= 0).sum() <= 0:\n",
" continue\n",
"\n",
" spread = {\n",
" gemeente: r['user_lat']\n",
" for gemeente, r in rows_.groupby('gemeente').count().iterrows()\n",
" if gemeente >= 0\n",
" }\n",
" n_answers = sum(spread.values())\n",
" \n",
" name = '{} ({})'.format(answer_text, n_answers)\n",
" group = folium.FeatureGroup(name=name, overlay=False)\n",
" folium.TileLayer(tiles='stamentoner').add_to(group)\n",
" \n",
" max_value = max(value / gemeente_normalizer[gemeente] for gemeente, value in spread.items())\n",
" for gemeente, gemeente_name in enumerate(gemeente_names):\n",
" if gemeente in spread:\n",
" value = spread[gemeente]\n",
" percentage = value / gemeente_normalizer[gemeente]\n",
" color_value = percentage / max_value\n",
" color = '#%02x%02x%02x' % tuple(int(255 * c) for c in cmap(color_value)[:3])\n",
" \n",
" polygon = folium.Polygon(coords_folium[gemeente], fill_color=color, fill_opacity=0.8,\n",
" color='#555555', popup='{} ({}, {}%)'.format(gemeente_name, value, round(100*percentage)))\n",
" centroid = shapes[gemeente].centroid\n",
" centroid = (centroid.y, centroid.x)\n",
"# folium.Circle(centroid, color='green', radius=200).add_to(group)\n",
" folium.map.Marker(\n",
" [shapes[gemeente].centroid.y, shapes[gemeente].centroid.x],\n",
" icon=folium.DivIcon(\n",
" icon_size=(50, 24),\n",
" icon_anchor=(25, 12),\n",
" html='<div class=\"percentage-label\" style=\"font-size: 12pt; background-color: rgba(255,255,255,0.8); border-radius: 12px; text-align: center;\">{:d}%</div>'.format(int(100 * percentage)),\n",
" )\n",
" ).add_to(group)\n",
" else:\n",
" polygon = folium.Polygon(coords_folium[gemeente], fill_color=None, fill_opacity=0, color='#555555')\n",
" polygon.add_to(group)\n",
" group.add_to(m)\n",
" pecentage_labels.add_to(m)\n",
" folium.map.LayerControl('topright', collapsed=False).add_to(m)\n",
" JsButton(\n",
" title='<i class=\"fas fa-tags\"></i>',\n",
" function=\"\"\"\n",
" function(btn, map){\n",
" $('.percentage-label').toggle();\n",
" }\n",
" \"\"\"\n",
" ).add_to(m)\n",
"# display(m)\n",
" m.save('maps/heatmaps/{}.html'.format(question))\n",
"# break"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"import glob\n",
"with open('maps/heatmaps/index.html', 'w') as f:\n",
" f.write('<html><head></head><body>' + \n",
" '<br/>\\n'.join(\n",
" '\\t<a href=\"http://herbertkruitbosch.com/pronunciation_maps/{}\">{}<a>'.format(fn[5:], fn[14:-5].replace('_', ' '))\n",
" for fn in sorted(\n",
" glob.glob('maps/heatmaps/*.html')\n",
" )\n",
" ) + \"</body></html>\")"
]
}
],
"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.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
@@ -0,0 +1,312 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Geographical pronunciation statistics"
]
},
{
"cell_type": "code",
"execution_count": 128,
"metadata": {},
"outputs": [],
"source": [
"import pandas\n",
"import MySQLdb\n",
"import numpy\n",
"import json\n",
"\n",
"db = MySQLdb.connect(user='root', passwd='Nmmxhjgt1@', db='stimmen', charset='utf8')\n",
"\n",
"%matplotlib notebook\n",
"from matplotlib import pyplot\n",
"import folium\n",
"from IPython.display import display\n",
"from shapely.geometry import Polygon, MultiPolygon, shape, Point\n",
"from jsbutton import JsButton\n",
"from shapely.geometry import LineString, MultiLineString\n",
"from jupyter_progressbar import ProgressBar\n",
"from collections import defaultdict, Counter\n",
"from ipy_table import make_table\n",
"from html import escape\n",
"\n",
"import numpy as np\n",
"from random import shuffle\n",
"import pickle\n",
"from jupyter_progressbar import ProgressBar"
]
},
{
"cell_type": "code",
"execution_count": 129,
"metadata": {},
"outputs": [],
"source": [
"with open('friesland_wijken.p3', 'rb') as f:\n",
" wijken, wijk_shapes = pickle.load(f)\n",
"\n",
"wijk_names = [wijk['properties']['GM_NAAM'] + ', ' + wijk['properties'].get('WK_NAAM', '') for wijk in wijken['features']]\n",
"\n",
"def get_wijk(point):\n",
" for i, shape in enumerate(wijk_shapes):\n",
" if shape.contains(point):\n",
" return i\n",
" return -1"
]
},
{
"cell_type": "code",
"execution_count": 130,
"metadata": {},
"outputs": [],
"source": [
"def listify(rd_multipolygon):\n",
" if len(rd_multipolygon) == 2 and tuple(map(type, rd_multipolygon)) == (float, float):\n",
" return list(rd_multipolygon)\n",
" return [\n",
" listify(element)\n",
" for element in rd_multipolygon\n",
" ]"
]
},
{
"cell_type": "code",
"execution_count": 131,
"metadata": {},
"outputs": [],
"source": [
"# Answers to how participants state a word should be pronounces.\n",
"\n",
"answers = pandas.read_sql('''\n",
"SELECT prediction_quiz_id, user_lat, user_lng, question_text, answer_text\n",
"FROM core_surveyresult as survey\n",
"INNER JOIN core_predictionquizresult as result ON survey.id = result.survey_result_id\n",
"INNER JOIN core_predictionquizresultquestionanswer as answer\n",
" ON result.id = answer.prediction_quiz_id\n",
"''', db)"
]
},
{
"cell_type": "code",
"execution_count": 132,
"metadata": {},
"outputs": [],
"source": [
"zero_latlng_questions = {\n",
" q\n",
" for q, row in answers.groupby('question_text').agg('std').iterrows()\n",
" if row['user_lat'] == 0 and row['user_lng'] == 0\n",
"}\n",
"answers_filtered = answers[answers['question_text'].map(lambda x: x not in zero_latlng_questions)]"
]
},
{
"cell_type": "code",
"execution_count": 133,
"metadata": {},
"outputs": [],
"source": [
"def reverse(rd_multipolygon):\n",
" if len(rd_multipolygon) == 2 and tuple(map(type, rd_multipolygon)) == (float, float):\n",
" return rd_multipolygon[::-1]\n",
" return [\n",
" reverse(element)\n",
" for element in rd_multipolygon\n",
" ]"
]
},
{
"cell_type": "code",
"execution_count": 134,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/herbert/.virtualenvs/stimmenfryslan/lib/python3.6/site-packages/ipykernel_launcher.py:10: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" # Remove the CWD from sys.path while we load stuff.\n"
]
}
],
"source": [
"# Takes approximately 2 minutes\n",
"points = set(zip(answers_filtered['user_lng'], answers_filtered['user_lat']))\n",
"\n",
"wijk_map = dict()\n",
"for lng, lat in points:\n",
" wijk_map[(lng, lat)] = get_wijk(Point(lng, lat))\n",
"\n",
"answers_filtered['wijk'] = [\n",
" wijk_map[(lng, lat)]\n",
" for lat, lng in zip(answers_filtered['user_lat'], answers_filtered['user_lng'])\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 135,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/herbert/.virtualenvs/stimmenfryslan/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" \n"
]
}
],
"source": [
"answers_filtered['question_text_url'] = answers_filtered['question_text'].map(\n",
" lambda x: x.replace('\"', '').replace('*', ''))"
]
},
{
"cell_type": "code",
"execution_count": 137,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "ea89078b81da4daba82bcd4b1ddbe8c2",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(HBox(children=(FloatProgress(value=0.0, max=1.0), HTML(value='<b>0</b>s passed', placeholder='0…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"cmap = pyplot.get_cmap('YlOrRd')\n",
"\n",
"for question, rows in ProgressBar(\n",
" answers_filtered.groupby('question_text_url'),\n",
" size=len(answers_filtered['question_text_url'].unique())\n",
"):\n",
" m = folium.Map((rows['user_lat'].median(), rows['user_lng'].median()), tiles=None, zoom_start=9)\n",
" order = [a for _, a in sorted((\n",
" (r['user_lat'], answer)\n",
" for answer, r in rows.groupby('answer_text').count().iterrows()\n",
" ), reverse=True)]\n",
" wijk_normalizer = {\n",
" wijk: r['user_lat']\n",
" for wijk, r in rows.groupby('wijk').count().iterrows()\n",
" }\n",
" for answer_text in (order):\n",
" rows_ = rows[rows['answer_text'] == answer_text]\n",
" if (rows_['wijk'] >= 0).sum() <= 0:\n",
" continue\n",
"\n",
" spread = {\n",
" wijk: r['user_lat']\n",
" for wijk, r in rows_.groupby('wijk').count().iterrows()\n",
" if wijk >= 0\n",
" }\n",
" n_answers = sum(spread.values())\n",
" \n",
" name = '{} ({})'.format(answer_text, n_answers)\n",
" group = folium.FeatureGroup(name=name, overlay=False)\n",
" folium.TileLayer(tiles='stamentoner').add_to(group)\n",
" \n",
" max_value = max(value / wijk_normalizer[wijk] for wijk, value in spread.items())\n",
" \n",
" for wijk, wijk_name in enumerate(wijk_names):\n",
" coordinates = reverse(wijken['features'][wijk]['geometry']['coordinates'])\n",
" if wijk in spread:\n",
" value = spread[wijk]\n",
" percentage = value / wijk_normalizer[wijk]\n",
" color_value = percentage / max_value\n",
" color = '#%02x%02x%02x' % tuple(int(255 * c) for c in cmap(color_value)[:3])\n",
" \n",
" polygon = folium.Polygon(\n",
" coordinates, fill_color=color, fill_opacity=0.8,\n",
" color='#555555', popup='{} ({}, {: 3d}%)'.format(wijk_name, value, int(100*percentage))\n",
" \n",
" )\n",
" centroid = wijk_shapes[wijk].centroid\n",
" centroid = (centroid.y, centroid.x)\n",
" folium.map.Marker(\n",
" [wijk_shapes[wijk].centroid.y, wijk_shapes[wijk].centroid.x],\n",
" icon=folium.DivIcon(\n",
" icon_size=(30, 16),\n",
" icon_anchor=(15, 8),\n",
" html='<div class=\"percentage-label\" style=\"font-size: 8pt; background-color: rgba(255,255,255,0.8); border-radius: 4px; text-align: center;\">{:d}%</div>'.format(int(100 * percentage)),\n",
" )\n",
" ).add_to(group)\n",
" else:\n",
" polygon = folium.Polygon(coordinates, fill_color=None, fill_opacity=0, color='#555555')\n",
" polygon.add_to(group)\n",
" group.add_to(m)\n",
" JsButton(\n",
" title='<i class=\"fas fa-tags\"></i>',\n",
" function=\"\"\"\n",
" function(btn, map){\n",
" $('.percentage-label').toggle();\n",
" }\n",
" \"\"\"\n",
" ).add_to(m)\n",
" folium.map.LayerControl('topright', collapsed=False).add_to(m)\n",
"# display(m)\n",
" m.save('maps/heatmaps-wijk/{}.html'.format(question))\n",
"# break"
]
},
{
"cell_type": "code",
"execution_count": 138,
"metadata": {},
"outputs": [],
"source": [
"import glob\n",
"with open('maps/heatmaps-wijk/index.html', 'w') as f:\n",
" f.write('<html><head></head><body>' + \n",
" '<br/>\\n'.join(\n",
" '\\t<a href=\"{}\">{}<a>'.format(fn, fn[:-5].replace('_', ' '))\n",
" for fn in sorted(\n",
" glob.glob('maps/heatmaps-wijk/*.html')\n",
" )\n",
" for fn in [fn[len('maps/heatmaps-wijk/'):]]\n",
" ) + \"</body></html>\")"
]
}
],
"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.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
+327
View File
@@ -0,0 +1,327 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Geographical pronunciation statistics"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pandas\n",
"import MySQLdb\n",
"import numpy\n",
"import json\n",
"\n",
"db = MySQLdb.connect(user='root', passwd='Nmmxhjgt1@', db='stimmen', charset='utf8')\n",
"\n",
"%matplotlib notebook\n",
"from matplotlib import pyplot\n",
"import folium\n",
"from IPython.display import display\n",
"from shapely.geometry import Polygon, MultiPolygon, shape, Point\n",
"from jupyter_progressbar import ProgressBar\n",
"from collections import defaultdict\n",
"from ipy_table import make_table\n",
"from html import escape\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib.colors import LogNorm\n",
"from sklearn import mixture\n",
"from skimage.measure import find_contours\n",
"from collections import Counter\n",
"from random import shuffle"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Borders of Frysian municipalities\n",
"\n",
"with open('Friesland_AL8.GeoJson') as f:\n",
" gemeentes = json.load(f)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"shapes = [shape(feature['geometry']) for feature in gemeentes['features']]\n",
"gemeente_names = [feature['properties']['name'] for feature in gemeentes['features']]\n",
"\n",
"def get_gemeente(point):\n",
" for i, shape in enumerate(shapes):\n",
" if shape.contains(point):\n",
" return i\n",
" return -1"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Answers to how participants state a word should be pronounces.\n",
"\n",
"answers = pandas.read_sql('''\n",
"SELECT prediction_quiz_id, user_lat, user_lng, question_text, answer_text\n",
"FROM core_surveyresult as survey\n",
"INNER JOIN core_predictionquizresult as result ON survey.id = result.survey_result_id\n",
"INNER JOIN core_predictionquizresultquestionanswer as answer\n",
" ON result.id = answer.prediction_quiz_id\n",
"''', db)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Takes approximately 2 minutes\n",
"\n",
"gemeente_map = {\n",
" (lng, lat): get_gemeente(Point(lng, lat))\n",
" for lng, lat in set(zip(answers['user_lng'], answers['user_lat']))\n",
"}\n",
"\n",
"answers['gemeente'] = [\n",
" gemeente_map[(lng, lat)]\n",
" for lat, lng in zip(answers['user_lat'], answers['user_lng'])\n",
"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Mapping pronunciations\n",
"\n",
"The idea is to plot each pronunciation as a point of a different color, now only seems to show participation density.\n",
"\n",
"Slow, so started with the first question."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"# cmap = pyplot.get_cmap('gist_rainbow')\n",
"\n",
"# std = (1.89, 1.35)\n",
"\n",
"# for _, (question, rows) in zip(range(3), answers.groupby('question_text')):\n",
"# plt.figure()\n",
"# n_answers = len(rows.groupby('answer_text').count())\n",
"# colors = cmap(range(256))[::256 // n_answers]\n",
"# for (answer, rows_), color in zip(rows.groupby('answer_text'), colors):\n",
"# if len(rows_) < 100:\n",
"# continue\n",
"# color = '#%02x%02x%02x' % tuple(int(c*255) for c in color[:3])\n",
"# X = rows_[['user_lat', 'user_lng']].as_matrix()\n",
"\n",
"# clf = mixture.GaussianMixture(n_components=5, covariance_type='full')\n",
"# clf.fit(X)\n",
"# xlim = numpy.percentile(X[:, 0], [1, 99.5])\n",
"# ylim = numpy.percentile(X[:, 1], [1, 99.5])\n",
"# xlim = [2*xlim[0] - xlim[1], 2*xlim[1] - xlim[0]]\n",
"# ylim = [2*ylim[0] - ylim[1], 2*ylim[1] - ylim[0]]\n",
" \n",
"# x = np.linspace(*xlim, 1000)\n",
"# y = np.linspace(*ylim, 1000)\n",
"# xx, yy = np.meshgrid(x, y)\n",
"# xxyy = np.array([xx.ravel(), yy.ravel()]).T\n",
"# z = np.exp(clf.score_samples(xxyy))\n",
"# z = z.reshape(xx.shape)\n",
" \n",
"# z_sorted = sorted(z.ravel(), reverse=True)\n",
"# z_sorted_cumsum = np.cumsum(z_sorted)\n",
"# split = np.where(z_sorted_cumsum > (z_sorted_cumsum[-1] * 0.5))[0][0]\n",
"# threshold = z_sorted[split]\n",
"# threshold\n",
"\n",
"# # p = list(range(0, 100, 5))\n",
"\n",
"# p = [80]\n",
"# plt.contour(xx, yy, z, levels=[threshold], colors=[color])\n",
"# plt.plot(X[:, 0], X[:, 1], '.', c=color)\n",
"# plt.xlim(*xlim)\n",
"# plt.ylim(*ylim)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"zero_latlng_questions = {\n",
" q\n",
" for q, row in answers.groupby('question_text').agg('std').iterrows()\n",
" if row['user_lat'] == 0 and row['user_lng'] == 0\n",
"}\n",
"answers_filtered = answers[answers['question_text'].map(lambda x: x not in zero_latlng_questions)]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"answers_filtered['question_text_url'] = answers_filtered['question_text'].map(\n",
" lambda x: x.replace('\"', '').replace('*', ''))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def get_palette(n, no_black=True, no_white=True):\n",
" with open('glasbey/{}_colors.txt'.format(n + no_black + no_white)) as f:\n",
" return [\n",
" '#%02x%02x%02x' % tuple(int(c) for c in line.replace('\\n', '').split(','))\n",
" for line in f\n",
" if not no_black or line != '0,0,0\\n'\n",
" if not no_white or line != '255,255,255\\n'\n",
" ]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"options = [x[1] for x in sorted([\n",
" (row['user_lng'], answer_text)\n",
" for answer_text, row in rows.groupby('answer_text').agg({'user_lng': 'count'}).iterrows()\n",
"], reverse=True)]\n",
"\n",
"groups = [options[:len(options) // 2], options[len(options) // 2:]]\n",
"groups"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"80000 / 350"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import glob\n",
"with open('index.html', 'w') as f:\n",
" f.write('<html><head></head><body>' + \n",
" '<br/>\\n'.join(\n",
" '\\t<a href=\"http://herbertkruitbosch.com/pronunciation_maps/{}\">{}<a>'.format(fn, fn[:-4].replace('_', ' '))\n",
" for fn in sorted(\n",
" glob.glob('*_all.html') +\n",
" glob.glob('*_larger.html') +\n",
" glob.glob('*_smaller.html')\n",
" )\n",
" ) + \"</body></html>\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"# cmap = pyplot.get_cmap('gist_rainbow')\n",
"# colors = pyplot.get_cmap('tab20')\n",
"# colors = ['#e6194b', '#3cb44b', '#ffe119', '#0082c8', '#f58231', '#911eb4', '#46f0f0', '#f032e6', '#d2f53c', '#fabebe', '#008080', '#e6beff', '#aa6e28', '#fffac8', '#800000', '#aaffc3', '#808000', '#ffd8b1', '#000080', '#808080']\n",
"\n",
"std = (1.89, 1.35)\n",
"\n",
"for question, rows in answers_filtered.groupby('question_text_url'):\n",
"# question = rows['question_text_url'][0]\n",
" n_answers = len(rows.groupby('answer_text').count())\n",
" \n",
" \n",
" options = [x[1] for x in sorted([\n",
" (row['user_lng'], answer_text)\n",
" for answer_text, row in rows.groupby('answer_text').agg({'user_lng': 'count'}).iterrows()\n",
" ], reverse=True)]\n",
" groups = [options]\n",
" if n_answers > 6:\n",
" groups.extend([options[:6], options[6:]])\n",
" \n",
" for group, group_name in zip(groups, ['all', 'larger', 'smaller']):\n",
" m = folium.Map((rows['user_lat'].median(), rows['user_lng'].median()), tiles='stamentoner', zoom_start=9)\n",
" # colors = cmap(range(256))[::256 // n_answers]\n",
" colors = get_palette(len(group))\n",
" for answer, color in zip(group, colors):\n",
" rows_ = rows[rows['answer_text'] == answer]\n",
" # color = '#%02x%02x%02x' % tuple(int(c*255) for c in color[:3])\n",
" name = '<span style=\\\\\"color:{}; \\\\\">{} ({})'.format(color, escape(answer), len(rows_))\n",
"\n",
" group = folium.FeatureGroup(name=name)\n",
" colormap[name] = color\n",
"\n",
" for point in zip(rows_['user_lat'], rows_['user_lng']):\n",
" point = tuple(p + 0.01 * s * numpy.random.randn() for p, s in zip(point, std))\n",
" folium.Circle(\n",
" point, color=None, fill_color=color,\n",
" radius=400*min(1, 100 / len(rows_)), fill_opacity=1 #1 - 0.5 * len(rows_) / len(rows)\n",
" ).add_to(group)\n",
" group.add_to(m)\n",
" folium.map.LayerControl('topright', collapsed=False).add_to(m)\n",
" \n",
" print(group_name, question)\n",
" if group_name == 'larger':\n",
" display(m)\n",
" m.save('{}_{}.html'.format(question, group_name))"
]
}
],
"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.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
@@ -0,0 +1,397 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Geographical pronunciation statistics"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas\n",
"import MySQLdb\n",
"import numpy\n",
"import json\n",
"\n",
"db = MySQLdb.connect(user='root', passwd='Nmmxhjgt1@', db='stimmen', charset='utf8')\n",
"\n",
"%matplotlib notebook\n",
"from matplotlib import pyplot\n",
"import folium\n",
"from IPython.display import display\n",
"from shapely.geometry import Polygon, MultiPolygon, shape, Point\n",
"from jsbutton import JsButton\n",
"from shapely.geometry import LineString, MultiLineString\n",
"from jupyter_progressbar import ProgressBar\n",
"from collections import defaultdict, Counter\n",
"from ipy_table import make_table\n",
"from html import escape\n",
"\n",
"import numpy as np\n",
"from random import shuffle\n",
"import pickle\n",
"from jupyter_progressbar import ProgressBar"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"with open('friesland_wijken_land_only.p3', 'rb') as f:\n",
" wijken, wijk_shapes = pickle.load(f)\n",
"\n",
"for x in wijken['features']:\n",
" x['type'] = 'Feature'\n",
"\n",
"with open('friesland_wijken_geojson.json', 'w') as f:\n",
" wijken['features'] = wijken['features']\n",
" json.dump(wijken, f, indent=1)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"from osgeo import gdal, ogr\n",
"\n",
"srcDS = gdal.OpenEx('friesland_wijken_geojson.json')\n",
"ds = gdal.VectorTranslate('friesland_wijken_geojson.kml', srcDS, format='kml')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'k4luâ7mWBAgDSKhCVaysNdr TjeoE85JzëGúcM.,IRtp2-bLû69Un0wZF3Hv1iOfô'"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"''.join({\n",
" c\n",
" for wijk in wijken['features']\n",
" for c in wijk['properties']['gemeente_en_wijk_naam']\n",
"})"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"with open('friesland_wijken_land_only.p3', 'rb') as f:\n",
" wijken, wijk_shapes = pickle.load(f)\n",
"\n",
"wijk_names = [wijk['properties']['gemeente_en_wijk_naam'] for wijk in wijken['features']]\n",
"\n",
"def get_wijk(point):\n",
" for i, shape in enumerate(wijk_shapes):\n",
" if shape.contains(point):\n",
" return i\n",
" return -1"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def listify(rd_multipolygon):\n",
" if len(rd_multipolygon) == 2 and tuple(map(type, rd_multipolygon)) == (float, float):\n",
" return list(rd_multipolygon)\n",
" return [\n",
" listify(element)\n",
" for element in rd_multipolygon\n",
" ]"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# Answers to how participants state a word should be pronounces.\n",
"\n",
"answers = pandas.read_sql('''\n",
"SELECT prediction_quiz_id, user_lat, user_lng, question_text, answer_text\n",
"FROM core_surveyresult as survey\n",
"INNER JOIN core_predictionquizresult as result ON survey.id = result.survey_result_id\n",
"INNER JOIN core_predictionquizresultquestionanswer as answer\n",
" ON result.id = answer.prediction_quiz_id\n",
"''', db)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"zero_latlng_questions = {\n",
" q\n",
" for q, row in answers.groupby('question_text').agg('std').iterrows()\n",
" if row['user_lat'] == 0 and row['user_lng'] == 0\n",
"}\n",
"answers_filtered = answers[answers['question_text'].map(lambda x: x not in zero_latlng_questions)]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"def reverse(rd_multipolygon):\n",
" if len(rd_multipolygon) == 2 and tuple(map(type, rd_multipolygon)) == (float, float):\n",
" return rd_multipolygon[::-1]\n",
" return [\n",
" reverse(element)\n",
" for element in rd_multipolygon\n",
" ]"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/herbert/.virtualenvs/stimmenfryslan/lib/python3.6/site-packages/ipykernel_launcher.py:10: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" # Remove the CWD from sys.path while we load stuff.\n"
]
}
],
"source": [
"# Takes approximately 2 minutes\n",
"points = set(zip(answers_filtered['user_lng'], answers_filtered['user_lat']))\n",
"\n",
"wijk_map = dict()\n",
"for lng, lat in points:\n",
" wijk_map[(lng, lat)] = get_wijk(Point(lng, lat))\n",
"\n",
"answers_filtered['wijk'] = [\n",
" wijk_map[(lng, lat)]\n",
" for lat, lng in zip(answers_filtered['user_lat'], answers_filtered['user_lng'])\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/herbert/.virtualenvs/stimmenfryslan/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" \n",
"/home/herbert/.virtualenvs/stimmenfryslan/lib/python3.6/site-packages/ipykernel_launcher.py:5: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" \"\"\"\n",
"/home/herbert/.virtualenvs/stimmenfryslan/lib/python3.6/site-packages/ipykernel_launcher.py:8: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" \n"
]
}
],
"source": [
"answers_filtered['question_text_url'] = answers_filtered['question_text'].map(\n",
" lambda x: x.replace('\"', '').replace('*', ''))\n",
"\n",
"answers_filtered['wijk_name'] = answers_filtered['wijk'].map(\n",
" lambda x: wijk_names[x])\n",
"\n",
"answers_filtered['answer_text_url'] = answers_filtered['answer_text'].map(\n",
" lambda x: x[x.find('('):x.find(')')][1:])"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"wijken = pandas.DataFrame([\n",
" {'#name': name, 'longitude': shape.centroid.xy[0][0], 'latitude': shape.centroid.xy[1][0]}\n",
" for name, shape in zip(wijk_names, wijk_shapes)\n",
"])\n",
"\n",
"wijken.set_index('#name', inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"def merge_dicts(*args):\n",
" for arg in args[1:]:\n",
" args[0].update(arg)\n",
" return args[0]\n",
"\n",
"\n",
"pronunciations = pandas.DataFrame([\n",
" merge_dicts(\n",
" {\n",
" question: answers['answer_text_url']\n",
" for question, answers in rows.groupby(\n",
" 'question_text_url'\n",
" ).agg(\n",
" {\n",
" 'answer_text_url': lambda x: [\n",
" {\n",
" 'pronunciation': answer_text,\n",
" 'count': answer_texts.count(answer_text)\n",
" }\n",
" for answer_texts in [list(x)]\n",
" for answer_text in sorted(set(x))\n",
" \n",
" ] \n",
" }\n",
" ).iterrows()\n",
" }, {\n",
" 'wijk': wijk_names[wijk]\n",
" })\n",
" for wijk, rows in answers_filtered.groupby('wijk')\n",
" if wijk >= 0\n",
"])\n",
"\n",
"pronunciations.set_index('wijk', inplace=True)\n",
"pronunciations\n",
"\n",
"columns = list(pronunciations.columns)\n",
"\n",
"counts = pandas.DataFrame([\n",
" merge_dicts({\n",
" column + \": \" + x['pronunciation']: 100 * x['count'] / total\n",
" for column in columns\n",
" for total in [sum(x['count'] for x in row[column])]\n",
" for x in row[column]\n",
" }, {'': wijk})\n",
" for wijk, row in pronunciations.iterrows()\n",
"])\n",
"\n",
"pronunciations = pandas.DataFrame([\n",
" merge_dicts({\n",
" column: ' / '.join(str(x['pronunciation']) for x in row[column])\n",
" for column in columns\n",
" }, {'': wijk})\n",
" for wijk, row in pronunciations.iterrows()\n",
"])\n",
"\n",
"pronunciations.set_index('', inplace=True)\n",
"counts.set_index('', inplace=True)\n",
"counts[counts != counts] = 0"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<function shapely.geometry.geo.shape(context)>"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"shape"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"pronunciations.to_csv('pronunciations_by_wijk.tsv', sep='\\t')\n",
"counts.to_csv('pronunciation_percentages_by_wijk.tsv', sep='\\t')\n",
"wijken.to_csv('wijk_centroid.tsv', sep='\\t', columns=['longitude', 'latitude'])"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"with open('pronunciations_by_wijk.tsv') as f:\n",
" p = list(f)\n",
" \n",
"with open('pronunciation_count_by_wijk.tsv') as f:\n",
" c = list(f)\n",
"\n",
"with open('wijk_centroid.tsv') as f:\n",
" w = list(f)"
]
}
],
"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.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
+217
View File
@@ -0,0 +1,217 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Pronunciation-based location prediction confusion\n",
"\n",
"Confusion of pronunciation-based predictions of someone's location"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pickle\n",
"import folium\n",
"import pandas\n",
"import MySQLdb\n",
"import numpy\n",
"from sklearn.metrics import confusion_matrix\n",
"from folium.plugins import HeatMap\n",
"from IPython.display import display\n",
"import itertools\n",
"import requests\n",
"import json\n",
"import random\n",
"from vincenty import vincenty\n",
"\n",
"db = MySQLdb.connect(user='root', passwd='Nmmxhjgt1@', db='stimmenfryslan')\n",
"\n",
"\n",
"%matplotlib inline\n",
"from matplotlib import pyplot, rcParams\n",
"from jupyter_progressbar import ProgressBar\n",
"\n",
"# rcParams['font.family'] = 'Lucinda Console'\n",
"rcParams['font.size'] = '24'\n",
"rcParams['figure.figsize'] = (20, 10)\n",
"rcParams['figure.dpi'] = 100\n",
"\n",
"from jupyter_progressbar import ProgressBar"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"with open('simplified_predictions.p3', 'rb') as f:\n",
" simplified_predictions = pickle.load(f)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"simplified_predictions['actual_latlon_rounded'] = [\n",
" (\n",
" (x[0] // 0.1) * 0.1,\n",
" (x[1] // 0.1) * 0.1,\n",
" ) if x == x else numpy.nan\n",
" for x in simplified_predictions['actual_latlon']\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfY2NmZTJhNjMzOThkNGEyZWFjMjhiMzM1YjM3YWE3YWUgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2NjZmUyYTYzMzk4ZDRhMmVhYzI4YjMzNWIzN2FhN2FlIiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF9jY2ZlMmE2MzM5OGQ0YTJlYWMyOGIzMzViMzdhYTdhZSA9IEwubWFwKAogICAgICAgICdtYXBfY2NmZTJhNjMzOThkNGEyZWFjMjhiMzM1YjM3YWE3YWUnLCB7CiAgICAgICAgY2VudGVyOiBbNTIuMTYzNzAzMTAyNjY2ODIsIDUuNjAxNzAxODI1MDMzODI0XSwKICAgICAgICB6b29tOiA4LAogICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgIGxheWVyczogW10sCiAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NywKICAgICAgICB6b29tQ29udHJvbDogdHJ1ZSwKICAgICAgICB9KTsKCiAgICAKICAgIAogICAgdmFyIHRpbGVfbGF5ZXJfYjI1ZTAyYWIzNzJmNDM4M2E1N2RhOWQ1ZWEzZTFhNjQgPSBMLnRpbGVMYXllcigKICAgICAgICAnaHR0cHM6Ly9zdGFtZW4tdGlsZXMte3N9LmEuc3NsLmZhc3RseS5uZXQvdG9uZXIve3p9L3t4fS97eX0ucG5nJywKICAgICAgICB7CiAgICAgICAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAgICAgICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgICAgICAgIm1heE5hdGl2ZVpvb20iOiAxOCwKICAgICAgICAibWF4Wm9vbSI6IDE4LAogICAgICAgICJtaW5ab29tIjogMCwKICAgICAgICAibm9XcmFwIjogZmFsc2UsCiAgICAgICAgInN1YmRvbWFpbnMiOiAiYWJjIgp9KS5hZGRUbyhtYXBfY2NmZTJhNjMzOThkNGEyZWFjMjhiMzM1YjM3YWE3YWUpOwogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2EwMDk0Nzg0MTk1MzQ2MWI4NjM1NTgzMzA5MTc3N2JiID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTMuMSwgNi4xMDAwMDAwMDAwMDAwMDA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9jY2ZlMmE2MzM5OGQ0YTJlYWMyOGIzMzViMzdhYTdhZSk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzUxODM5ZmZlMDYwODRhYTI5Y2Q0ODEwZmJiMmFkMzVjID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTMuMiwgNi40XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9jY2ZlMmE2MzM5OGQ0YTJlYWMyOGIzMzViMzdhYTdhZSk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2FlZTRkMjhmYzgxMzQ2MTE4MjJhYjFjM2FhYjA3ZTc4ID0gTC5jaXJjbGUoCiAgICAgILine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fc46cd185c0>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"actual_latlon = [tuple(x) for x in simplified_predictions['actual_latlon'] if x == x]\n",
"\n",
"m = folium.Map((52.16370310266682, 5.601701825033824), tiles='stamentoner', zoom_start=8)\n",
"\n",
"for p in set(actual_latlon):\n",
" if p == p:\n",
" pp = ((p[0] // 0.1) * 0.1, (p[1] // 0.1) * 0.1)\n",
" folium.Circle(pp, radius=10).add_to(m)\n",
"\n",
"m"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"from collections import Counter"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9b3470db2073443a9ee9ed47076116b9",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(HBox(children=(FloatProgress(value=0.0, max=1.0), HTML(value='<b>0</b>s passed', placeholder='0…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"confusions = Counter([\n",
" (tuple(actual), tuple(predicted))\n",
" for actual, predicted in zip(\n",
" ProgressBar(simplified_predictions['actual_latlon_rounded']),\n",
" simplified_predictions['prediction_1_latlon']\n",
" )\n",
" if actual == actual and predicted == predicted\n",
"])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"m = folium.Map((52.16370310266682, 5.601701825033824), tiles='stamentoner', zoom_start=8)\n",
"\n",
"for (actual, predicted), count in confusions.items():\n",
" \n",
" folium.PolyLine([actual, predicted], color=\"red\", weight=numpy.log(count), opacity=1).add_to(m)\n",
"\n",
"m"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfYjkxMzMxODQ3NTY3NGZkMDk2YTg2Nzc3MTVjMDMyZTQgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2I5MTMzMTg0NzU2NzRmZDA5NmE4Njc3NzE1YzAzMmU0IiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF9iOTEzMzE4NDc1Njc0ZmQwOTZhODY3NzcxNWMwMzJlNCA9IEwubWFwKAogICAgICAgICdtYXBfYjkxMzMxODQ3NTY3NGZkMDk2YTg2Nzc3MTVjMDMyZTQnLCB7CiAgICAgICAgY2VudGVyOiBbNTIuMTYzNzAzMTAyNjY2ODIsIDUuNjAxNzAxODI1MDMzODI0XSwKICAgICAgICB6b29tOiA4LAogICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgIGxheWVyczogW10sCiAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NywKICAgICAgICB6b29tQ29udHJvbDogdHJ1ZSwKICAgICAgICB9KTsKCiAgICAKICAgIAogICAgdmFyIHRpbGVfbGF5ZXJfNzVkZjhmYjg5Mjg5NDcwODhjODZlMmFmMDJjNmE3M2UgPSBMLnRpbGVMYXllcigKICAgICAgICAnaHR0cHM6Ly9zdGFtZW4tdGlsZXMte3N9LmEuc3NsLmZhc3RseS5uZXQvdG9uZXIve3p9L3t4fS97eX0ucG5nJywKICAgICAgICB7CiAgICAgICAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAgICAgICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgICAgICAgIm1heE5hdGl2ZVpvb20iOiAxOCwKICAgICAgICAibWF4Wm9vbSI6IDE4LAogICAgICAgICJtaW5ab29tIjogMCwKICAgICAgICAibm9XcmFwIjogZmFsc2UsCiAgICAgICAgInN1YmRvbWFpbnMiOiAiYWJjIgp9KS5hZGRUbyhtYXBfYjkxMzMxODQ3NTY3NGZkMDk2YTg2Nzc3MTVjMDMyZTQpOwogICAgCiAgICAgICAgICAgICAgICB2YXIgcG9seV9saW5lXzA3ZWU0MjNhM2YwMDQ3OTNhYjNjNzRhZjQ5NjE2Y2ZjID0gTC5wb2x5bGluZSgKICAgICAgICAgICAgICAgICAgICBbWzUyLjkwMDAwMDAwMDAwMDAwNiwgNS43XSwgWzUzLjA0NjUzNjQ2NTU2NTg2NSwgNS44Mzk3ODgxNTU1Mjk2NDY1XV0sCiAgICAgICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAibm9DbGlwIjogZmFsc2UsCiAgIm9wYWNpdHkiOiAxLAogICJzbW9vdGhGYWN0b3IiOiAxLjAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDAuNjkzMTQ3MTgwNTU5OTQ1Mwp9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfYjkxMzMxODQ3NTY3NGZkMDk2YTg2Nzc3MTVjMDMyZTQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIHBvbHlfbGluZV8xY2Y3ZWY0OWY5ZWQ0YzlhODU5OThjMzZhOGM2ZTI3NyA9IEwucG9seWxpbmUoCiAgICAgICAgICAgICAgICAgICAgW1s1My4yLCA1LjVdLCBbNTMuMjE1ODA2MDU4MzYyMTksIDUuNDg3MjYwMzE4OTE2OTM4XV0sCiAgICAgICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAibm9DbGlwIjogZmFsc2UsCiAgIm9wYWNpdHkiOiAxLAogICJzbW9vdGhGYWN0b3IiOiAxLjAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDEuOLine truncated
],
"text/plain": [
"<folium.folium.Map at 0x7fa6ec208ba8>"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = folium.Map((52.16370310266682, 5.601701825033824), tiles='stamentoner', zoom_start=8)\n",
"\n",
"for (actual, predicted), count in confusions.items():\n",
" \n",
" folium.PolyLine([actual, predicted], color=\"red\", weight=numpy.log(count), opacity=1).add_to(m)\n",
"\n",
"m"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
+102
View File
@@ -0,0 +1,102 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"from glob import glob\n",
"\n",
"import os"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"waves = [\n",
" wave\n",
" for location in os.listdir('data')\n",
" for date in os.listdir(os.path.join('data', location))\n",
" for wave in os.listdir(os.path.join('data', location, date))\n",
"]\n",
"assert len(waves) == len(set(waves)), \"Not all filenames are unique :(\""
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"for location in os.listdir('data'):\n",
" for date in os.listdir(os.path.join('data', location)):\n",
" for wave in os.listdir(os.path.join('data', location, date)):\n",
" source = os.path.join('data', location, date, wave)\n",
" destination = os.path.join('per_word', wave.split('_')[1])\n",
" if not os.path.isdir(destination):\n",
" os.mkdir(destination)\n",
" os.rename(source, os.path.join(destination, wave))"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"import pandas\n",
"\n",
"data = pandas.read_csv('/home/herbert/picture-game-result-export.csv', delimiter=';')\n",
"data['Filename'] = [x.split('/')[-1] for x in data['Opname']]"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [],
"source": [
"for word in os.listdir('per_word'):\n",
" for wave in os.listdir(os.path.join('per_word', word)):\n",
" source = os.path.join('per_word', word, wave)\n",
" if wave not in relevant:\n",
" destination = os.path.join('per_word', word, 'irrelevant_accent_' + wave)\n",
" os.rename(source, destination)"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [],
"source": [
"data.to_excel('/home/herbert/picture-game-result-export-filename.xlsx')"
]
}
],
"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.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}