diff --git a/.gitignore b/.gitignore index 736006e..65fa99a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ .vscode **/*mt.ipynb **/*mt +.env diff --git a/03.I - Geo-folium-markers-layers.ipynb b/03.I - Geo-folium-markers-layers.ipynb new file mode 100644 index 0000000..eff0f8b --- /dev/null +++ b/03.I - Geo-folium-markers-layers.ipynb @@ -0,0 +1,4911 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "toc": true + }, + "source": [ + "

Table of Contents

\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Intro to Folium " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![mapa](../images/geo_portada.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "First things first: \n", + "- https://python-visualization.github.io/folium/" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "#!pip install folium" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import folium\n", + "from folium import Choropleth, Circle, Marker, Icon, Map\n", + "from folium.plugins import HeatMap, MarkerCluster\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "## 1st map: Landmarks - Sonora 🌯" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "We create a basic map as a result of some coordinates with an initial zoom" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "lat = 41.3978801 \n", + "lon = 2.1899704 \n", + "\n", + "# /'grenitS/" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# EACH TOOL THAT USES MAPS: lat, lon -> lon, lar" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Make this Notebook Trusted to load map: File -> Trust Notebook
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "map_1 = Map(location = [lat, lon], zoom_start=15)\n", + "map_1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1st Marker: Landmarks: Razzmatazz 🕺" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "razz_lat = 41.3977323\n", + "razz_long = 2.191110815" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "club = Marker(location = [razz_lat, razz_long], tooltip=\"Razzmatazz\")\n", + "club" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "club.add_to(map_1) # Invoice class -> send invoice " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "I leave you here the specific doc of the markers\n", + "- https://python-visualization.github.io/folium/modules.html?highlight=marker" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "To add markers to a map, we'll have to \"add\" elements to that map, so we're going to add them to the previous map called map_1." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# How to get location:\n", + "\n", + "1. Go to google maps\n", + "2. Look for something in particular\n", + "3. Look at the URL\n", + "\n", + "Example (after the @):\n", + "\n", + "https://www.google.com/maps/place/Sonora+Sport+Tavern/@41.3978841,2.1877817,17z/data=!3m2!4b1!5s0x12a4a31ef25e7f6f:0x8534d14247dd8c4d!4m5!3m4!1s0x12a4a3192255e3c3:0x66d21ce6efad4cfb!8m2!3d41.3978801!4d2.1899704\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "We add another Marker and we see that we can change the icon and the color of the background and the icon." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "To modify the icons, where do we get them?\n", + "- https://fontawesome.com/v4.7.0/icons/ --> If I want to use these I put prefix=\"fa\" (Font Awesome)\n", + "- https://getbootstrap.com/docs/3.3/components/ --> Built in no need to put prefix" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "```python\n", + "['red', 'blue', 'green', 'purple', 'orange', 'darkred',\n", + "'lightred', 'beige', 'darkblue', 'darkgreen', 'cadetblue', 'darkpurple', 'white', 'pink', 'lightblue', 'lightgreen', 'gray', 'black', 'lightgray ']\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "#### Now different icons" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "First way to add a tuned marker to the map" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "lat_ih = 41.3977461\n", + "lon_ih = 2.187674417" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "icon = Icon(\n", + " color = \"green\",\n", + " icon_color = \"black\",\n", + " icon = \"database\",\n", + " prefix = \"fa\" #font-awesome: fa\n", + " \n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "marker_ih = Marker(location = [lat_ih, lon_ih], tooltip=\"Ironhack\", icon=icon)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "marker_ih.add_to(map_1);" + ] + }, + { + "attachments": { + "Screenshot%202022-10-27%20at%2009.17.50.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Screenshot%202022-10-27%20at%2009.17.50.png](attachment:Screenshot%202022-10-27%20at%2009.17.50.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Make this Notebook Trusted to load map: File -> Trust Notebook
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "map_1" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "Second way to add a tuned marker to the map" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2nd Marker: beach" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Kwargs --> https://book.pythontips.com/en/latest/args_and_kwargs.html \n", + "https://j2logo.com/args-y-kwargs-en-python/" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "## Don't bike during work-days 🤕" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "To teach this example, we use a dataset where we already have some latitude and longitude columns " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
fechadiayearhorariofestividadtipo_accidentelesividadmeteodistritodireccionlonlat
02019-01-01 14:00:002019-01-01 00:00:002019TardeFestivoColisionModeradaDespejadoSALAMANCACALLE CASTELLO / CALLE DON RAMON DE LA CRUZ Ma...-3.68120940.428990
12019-01-02 21:00:002019-01-02 00:00:002019NocheLaborableColisionGraveDespejadoHORTALEZAAVDA. GRAN VIA DE HORTALEZA / GTA. LUIS ROSALE...-3.65452740.466921
22019-01-03 14:00:002019-01-03 00:00:002019TardeLaborableColisionLeveDespejadoVILLA DE VALLECASCALLE FELIPE ALVAREZ 10 Madrid-3.62342340.381971
32019-01-03 13:00:002019-01-03 00:00:002019TardeLaborableColisionLeveDespejadoVILLA DE VALLECASAVDA. SANTA EUGENIA / CALLE REAL DE ARGANDA Ma...-3.60827640.377939
42019-01-03 13:00:002019-01-03 00:00:002019TardeLaborableColisionLeveDespejadoVILLA DE VALLECASAVDA. SANTA EUGENIA / CALLE REAL DE ARGANDA Ma...-3.60827640.377939
.......................................
21922017-12-26 18:00:002017-12-26 00:00:002017TardeLaborableColisionLeveLluviaRETIROAVENIDA DE MENENDEZ PELAYO - CALLE DEL DOCE DE...-3.67784840.415537
21932017-12-27 00:00:002017-12-27 00:00:002017NocheLaborableCaidaLeveLluviaCHAMBERICALLE DE FUENCARRAL NUM ...-3.70284140.429487
21942017-12-29 07:00:002017-12-29 00:00:002017MañanaLaborableColisionLeveDespejadoBARAJASAVENIDA SUR DEL AEROPUERTO DE BARAJAS - AVENI...-3.58004140.456254
21952017-12-30 11:00:002017-12-30 00:00:002017MañanaVisperaCaidaLeveDespejadoCENTROCALLE DE LA MADERA NUM ...-3.70329540.424769
21962017-12-31 21:00:002017-12-31 00:00:002017NocheFestivoColisionLeveLluviaCHAMBERIPASEO DE EDUARDO DATO NUM ...-3.69620140.432461
\n", + "

2197 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " fecha dia year horario festividad \n", + "0 2019-01-01 14:00:00 2019-01-01 00:00:00 2019 Tarde Festivo \\\n", + "1 2019-01-02 21:00:00 2019-01-02 00:00:00 2019 Noche Laborable \n", + "2 2019-01-03 14:00:00 2019-01-03 00:00:00 2019 Tarde Laborable \n", + "3 2019-01-03 13:00:00 2019-01-03 00:00:00 2019 Tarde Laborable \n", + "4 2019-01-03 13:00:00 2019-01-03 00:00:00 2019 Tarde Laborable \n", + "... ... ... ... ... ... \n", + "2192 2017-12-26 18:00:00 2017-12-26 00:00:00 2017 Tarde Laborable \n", + "2193 2017-12-27 00:00:00 2017-12-27 00:00:00 2017 Noche Laborable \n", + "2194 2017-12-29 07:00:00 2017-12-29 00:00:00 2017 Mañana Laborable \n", + "2195 2017-12-30 11:00:00 2017-12-30 00:00:00 2017 Mañana Vispera \n", + "2196 2017-12-31 21:00:00 2017-12-31 00:00:00 2017 Noche Festivo \n", + "\n", + " tipo_accidente lesividad meteo distrito \n", + "0 Colision Moderada Despejado SALAMANCA \\\n", + "1 Colision Grave Despejado HORTALEZA \n", + "2 Colision Leve Despejado VILLA DE VALLECAS \n", + "3 Colision Leve Despejado VILLA DE VALLECAS \n", + "4 Colision Leve Despejado VILLA DE VALLECAS \n", + "... ... ... ... ... \n", + "2192 Colision Leve Lluvia RETIRO \n", + "2193 Caida Leve Lluvia CHAMBERI \n", + "2194 Colision Leve Despejado BARAJAS \n", + "2195 Caida Leve Despejado CENTRO \n", + "2196 Colision Leve Lluvia CHAMBERI \n", + "\n", + " direccion lon lat \n", + "0 CALLE CASTELLO / CALLE DON RAMON DE LA CRUZ Ma... -3.681209 40.428990 \n", + "1 AVDA. GRAN VIA DE HORTALEZA / GTA. LUIS ROSALE... -3.654527 40.466921 \n", + "2 CALLE FELIPE ALVAREZ 10 Madrid -3.623423 40.381971 \n", + "3 AVDA. SANTA EUGENIA / CALLE REAL DE ARGANDA Ma... -3.608276 40.377939 \n", + "4 AVDA. SANTA EUGENIA / CALLE REAL DE ARGANDA Ma... -3.608276 40.377939 \n", + "... ... ... ... \n", + "2192 AVENIDA DE MENENDEZ PELAYO - CALLE DEL DOCE DE... -3.677848 40.415537 \n", + "2193 CALLE DE FUENCARRAL NUM ... -3.702841 40.429487 \n", + "2194 AVENIDA SUR DEL AEROPUERTO DE BARAJAS - AVENI... -3.580041 40.456254 \n", + "2195 CALLE DE LA MADERA NUM ... -3.703295 40.424769 \n", + "2196 PASEO DE EDUARDO DATO NUM ... -3.696201 40.432461 \n", + "\n", + "[2197 rows x 12 columns]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv(\"../datasets/bici_clean.csv\")\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "We are going to iterate over all the rows of the dataframe looking for what is inside each row in the column.\n", + "We will put an icon to the accidents based on the \"holiday\" column\n", + "But we will have to save the settings and add the Marker at the end and all this inside a loop 🤭🤯\n", + "- First the tooltip config\n", + "- Then the little icon depending on the holiday\n", + "- Finally add each marker" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "# https://datos.madrid.es/portal/site/egob/menuitem.9e1e2f6404558187cf35cf3584f1a5a0/?vgnextoid=374512b9ace9f310VgnVCM100000171f5a0aRCRD&vgnextchannel=374512b9ace9f310VgnVCM100000171f5a0aRCRD&vgnextfmt=default" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "Is that the best way to visualize this? We have created a map with infinite markers...but is there another way to visualize this information a little better?\n", + "When we have a lot of grouped data 🗺" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
fechadiayearhorariofestividadtipo_accidentelesividadmeteodistritodireccionlonlat
14212018-12-03 13:00:002018-12-03 00:00:002018TardeLaborableCaidaLeveDespejadoMONCLOA-ARAVACALUGAR DE LA CASA DE CAMPO Madrid-3.74883740.419742
\n", + "
" + ], + "text/plain": [ + " fecha dia year horario festividad \n", + "1421 2018-12-03 13:00:00 2018-12-03 00:00:00 2018 Tarde Laborable \\\n", + "\n", + " tipo_accidente lesividad meteo distrito \n", + "1421 Caida Leve Despejado MONCLOA-ARAVACA \\\n", + "\n", + " direccion lon lat \n", + "1421 LUGAR DE LA CASA DE CAMPO Madrid -3.748837 40.419742 " + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.sample()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "df[\"distrito\"] = df[\"distrito\"].apply(lambda x: x.strip())" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['SALAMANCA', 'HORTALEZA', 'VILLA DE VALLECAS', 'MONCLOA-ARAVACA',\n", + " 'CHAMARTÍN', 'MORATALAZ', 'FUENCARRAL-EL PARDO', 'ARGANZUELA',\n", + " 'CARABANCHEL', 'CENTRO', 'LATINA', 'CHAMBERÍ', 'CIUDAD LINEAL',\n", + " 'RETIRO', 'SAN BLAS-CANILLEJAS', 'VICÁLVARO', 'PUENTE DE VALLECAS',\n", + " 'TETUÁN', 'USERA', 'BARAJAS', 'VILLAVERDE', 'SAN BLAS', 'TETUAN',\n", + " 'CHAMBERI', 'CHAMARTIN', 'VICALVARO'], dtype=object)" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[\"distrito\"].unique()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "distrito\n", + "CENTRO 388\n", + "RETIRO 169\n", + "SALAMANCA 148\n", + "ARGANZUELA 146\n", + "MONCLOA-ARAVACA 136\n", + "CARABANCHEL 118\n", + "CHAMBERI 102\n", + "FUENCARRAL-EL PARDO 99\n", + "PUENTE DE VALLECAS 86\n", + "HORTALEZA 78\n", + "LATINA 75\n", + "CIUDAD LINEAL 75\n", + "TETUAN 72\n", + "USERA 63\n", + "CHAMBERÍ 60\n", + "SAN BLAS 60\n", + "CHAMARTIN 50\n", + "VILLA DE VALLECAS 44\n", + "MORATALAZ 43\n", + "TETUÁN 41\n", + "VILLAVERDE 41\n", + "BARAJAS 34\n", + "CHAMARTÍN 28\n", + "VICALVARO 17\n", + "SAN BLAS-CANILLEJAS 16\n", + "VICÁLVARO 8\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[\"distrito\"].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "mad_lat = 40.4166852\n", + "mad_lon = -3.705739617\n", + "\n", + "# 1. Map\n", + "mad_map = Map(location = [mad_lat, mad_lon], zoom_start = 15)\n", + "#mad_map" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Make this Notebook Trusted to load map: File -> Trust Notebook
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mad_map" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Festivos vs Holiday vs vispera" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "Marker location must be assigned when added directly to map.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/anaconda3/envs/ironhack/lib/python3.9/site-packages/IPython/core/formatters.py:343\u001b[0m, in \u001b[0;36mBaseFormatter.__call__\u001b[0;34m(self, obj)\u001b[0m\n\u001b[1;32m 341\u001b[0m method \u001b[38;5;241m=\u001b[39m get_real_method(obj, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprint_method)\n\u001b[1;32m 342\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m method \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 343\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 344\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 345\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "File \u001b[0;32m~/anaconda3/envs/ironhack/lib/python3.9/site-packages/folium/folium.py:319\u001b[0m, in \u001b[0;36mMap._repr_html_\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 317\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parent \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 318\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 319\u001b[0m out \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_parent\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_repr_html_\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 320\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m out\n", + "File \u001b[0;32m~/anaconda3/envs/ironhack/lib/python3.9/site-packages/branca/element.py:343\u001b[0m, in \u001b[0;36mFigure._repr_html_\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 341\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_repr_html_\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 342\u001b[0m \u001b[38;5;124;03m\"\"\"Displays the Figure in a Jupyter notebook.\"\"\"\u001b[39;00m\n\u001b[0;32m--> 343\u001b[0m html \u001b[38;5;241m=\u001b[39m escape(\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrender\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[1;32m 344\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mheight \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 345\u001b[0m iframe \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m 346\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m
\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 347\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m
\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;66;03m# noqa\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 353\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m
\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 354\u001b[0m )\u001b[38;5;241m.\u001b[39mformat(html\u001b[38;5;241m=\u001b[39mhtml, width\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mwidth, ratio\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mratio)\n", + "File \u001b[0;32m~/anaconda3/envs/ironhack/lib/python3.9/site-packages/branca/element.py:338\u001b[0m, in \u001b[0;36mFigure.render\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 336\u001b[0m \u001b[38;5;124;03m\"\"\"Renders the HTML representation of the element.\"\"\"\u001b[39;00m\n\u001b[1;32m 337\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m name, child \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_children\u001b[38;5;241m.\u001b[39mitems():\n\u001b[0;32m--> 338\u001b[0m \u001b[43mchild\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrender\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 339\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_template\u001b[38;5;241m.\u001b[39mrender(this\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m, kwargs\u001b[38;5;241m=\u001b[39mkwargs)\n", + "File \u001b[0;32m~/anaconda3/envs/ironhack/lib/python3.9/site-packages/folium/folium.py:401\u001b[0m, in \u001b[0;36mMap.render\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 374\u001b[0m figure\u001b[38;5;241m.\u001b[39mheader\u001b[38;5;241m.\u001b[39madd_child(\n\u001b[1;32m 375\u001b[0m Element(\n\u001b[1;32m 376\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
fechadiayearhorariofestividadtipo_accidentelesividadmeteodistritodireccionlonlat
17162017-05-25 23:00:002017-05-25 00:00:002017NocheLaborableCaidaLeveDespejadoCENTROCALLE GRAN VIA NUM ...-3.70098840.419598
\n", + "" + ], + "text/plain": [ + " fecha dia year horario festividad \n", + "1716 2017-05-25 23:00:00 2017-05-25 00:00:00 2017 Noche Laborable \\\n", + "\n", + " tipo_accidente lesividad meteo distrito \n", + "1716 Caida Leve Despejado CENTRO \\\n", + "\n", + " direccion lon lat \n", + "1716 CALLE GRAN VIA NUM ... -3.700988 40.419598 " + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.sample()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "## Morning bikers will be safer 🚴" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "Let's check how many categories there are in the time column, to make a heat map. First we make a map with the morning schedule, and then we add the afternoon schedule with the Layer Control.\n", + "Here we go 🔥" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "### We create the basic map to which we then add the layers" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 Tarde\n", + "1 Noche\n", + "2 Tarde\n", + "3 Tarde\n", + "4 Tarde\n", + " ... \n", + "2192 Tarde\n", + "2193 Noche\n", + "2194 Mañana\n", + "2195 Mañana\n", + "2196 Noche\n", + "Name: horario, Length: 2197, dtype: object" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[\"horario\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "mad_map = Map(location=[mad_lat, mad_lon], zoom_start=15)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Make this Notebook Trusted to load map: File -> Trust Notebook
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mad_map" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [], + "source": [ + "morning = df[df[\"horario\"] == \"Mañana\"]\n", + "evening = df[df[\"horario\"] == \"Tarde\"]\n", + "night = df[df[\"horario\"] == \"Noche\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "### Subset the dataframe per layer" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "### We create the FeatureGroup" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "morning = df[df[\"horario\"] == \"Mañana\"]\n", + "morning_group = folium.FeatureGroup(name=f\"Morning: {morning.shape[0]}\")\n", + "HeatMap(data = morning[[\"lat\", \"lon\"]]).add_to(morning_group) #only the lat,lon from the mornings\n", + "morning_group.add_to(mad_map)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Make this Notebook Trusted to load map: File -> Trust Notebook
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mad_map" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "### Create the HeatMap layer and add it to the FeatureGroup" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#morning = df[df[\"horario\"] == \"Mañana\"]\n", + "evening_group = folium.FeatureGroup(name=f\"Evening: {evening.shape[0]}\")\n", + "HeatMap(data = evening[[\"lat\", \"lon\"]]).add_to(evening_group) #only the lat,lon from the mornings\n", + "evening_group.add_to(mad_map)\n", + "\n", + "#morning = df[df[\"horario\"] == \"Mañana\"]\n", + "night_group = folium.FeatureGroup(name=f\"Night: {night.shape[0]}\")\n", + "HeatMap(data = night[[\"lat\", \"lon\"]]).add_to(night_group) #only the lat,lon from the mornings\n", + "night_group.add_to(mad_map)" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Make this Notebook Trusted to load map: File -> Trust Notebook
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mad_map" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "### Add the FeatureGroup with heatmap and name to the map" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Adding the evenings" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "### Night layer" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [], + "source": [ + "folium.LayerControl(collapsed=False, position=\"topleft\").add_to(mad_map);" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Make this Notebook Trusted to load map: File -> Trust Notebook
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mad_map" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lang": "en" + }, + "source": [ + "### We can save our maps" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [], + "source": [ + "mad_map.save(\"mad_map_accidents_layers.html\")" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [], + "source": [ + "#!open mad_map_accidents_layers.html" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['choropleth',\n", + " 'crs',\n", + " 'height',\n", + " 'left',\n", + " 'location',\n", + " 'options',\n", + " 'position',\n", + " 'render',\n", + " 'save',\n", + " 'top',\n", + " 'width']" + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[i for i in dir(mad_map) if \"_\" not in i]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Your turn" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Extra\n", + "\n", + "[Can I draw lines in folium?](https://stackoverflow.com/questions/60578408/is-it-possible-to-draw-paths-in-folium)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Lat, lon: different tools: different conventions: watch out not to be in Kenya\n", + "- Maps ()\n", + " Marker()\n", + " Icon()\n", + " \n", + " FeatureGroups, HeatMaps...\n", + " LayerControl -> menu on the map itself" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ironhack", + "language": "python", + "name": "ironhack" + }, + "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.9.12" + }, + "nbTranslate": { + "displayLangs": [ + "en", + "es" + ], + "hotkey": "alt-a", + "langInMainMenu": true, + "sourceLang": "es", + "targetLang": "en", + "useGoogleTranslate": true + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": true, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": true, + "toc_position": { + "height": "calc(100% - 180px)", + "left": "10px", + "top": "150px", + "width": "260px" + }, + "toc_section_display": true, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/challenge-2.ipynb b/challenge-2.ipynb index df5e7f0..9600711 100644 --- a/challenge-2.ipynb +++ b/challenge-2.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 82, "id": "9b373771", "metadata": {}, "outputs": [], @@ -21,22 +21,187 @@ "from getpass import getpass" ] }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import os\n", + "from dotenv import load_dotenv\n", + "load_dotenv()" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [], + "source": [ + "token = os.getenv(\"token\")" + ] + }, { "cell_type": "markdown", "id": "e94dce92", "metadata": {}, "source": [ - "# 2. Get names and location of the 10 coffee places by passing Ironhack as your location" + "# 2. Get names and location of the 10 coffee places by passing Ironhack as your location" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 97, "id": "1d72f571", "metadata": {}, "outputs": [], "source": [ - "# your code here" + "lat = 41.3977461\n", + "lon = 2.187674417\n", + "\n", + "def requests_for_foursquare (query, lat, lon, radius=500, limit=1):\n", + "\n", + " url = f\"https://api.foursquare.com/v3/places/search?query={query}&ll={lat}%2C{lon}&radius={radius}&limit={limit}&sort=DISTANCE\"\n", + "\n", + " headers = {\n", + " \"accept\": \"application/json\",\n", + " \"Authorization\": token\n", + " }\n", + " \n", + " try:\n", + " return requests.get(url, headers=headers).json()\n", + " except:\n", + " print(\"no :(\")" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameaddress
0Espacio 88Carrer Pamplona, 88
1SKYE Coffee CoCalle Pamplona, 88
2Granja MabelMarina, 114-116
3Three Marks CoffeeAusiàs Marc, 151
4El BarRibes, 46
5El Cafè BlauCasp, 192
6Cantina RestobarMarina, 164
7Eva-2Bolivia, 21
8De Pa i XocolataCarrer de la Marina, 92
9La RoureraGran Vía de Les Corts Catalanes, 792
\n", + "
" + ], + "text/plain": [ + " name address\n", + "0 Espacio 88 Carrer Pamplona, 88\n", + "1 SKYE Coffee Co Calle Pamplona, 88\n", + "2 Granja Mabel Marina, 114-116\n", + "3 Three Marks Coffee Ausiàs Marc, 151\n", + "4 El Bar Ribes, 46\n", + "5 El Cafè Blau Casp, 192\n", + "6 Cantina Restobar Marina, 164\n", + "7 Eva-2 Bolivia, 21\n", + "8 De Pa i Xocolata Carrer de la Marina, 92\n", + "9 La Rourera Gran Vía de Les Corts Catalanes, 792" + ] + }, + "execution_count": 111, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res = requests_for_foursquare (\"coffee\", lat, lon, radius=500, limit=10)\n", + "\n", + "name = [(res[\"results\"][i][\"name\"]) for i in range(10)]\n", + "address = [(res[\"results\"][i][\"location\"][\"address\"]) for i in range(10)]\n", + "\n", + "new = {}\n", + "\n", + "new[\"name\"] = name\n", + "new[\"address\"] = address\n", + "\n", + "df = pd.DataFrame(new)\n", + "df" ] }, { @@ -44,17 +209,98 @@ "id": "941b5dbf", "metadata": {}, "source": [ - "# 3. Now get the 5 CLOSEST coffe places. Make use of params: limit, near?" + "# 3. Now get the 5 CLOSEST coffe places. Make use of params: limit, near?" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 112, "id": "fda8ddff", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namedistance
0Espacio 88311
1SKYE Coffee Co320
2Granja Mabel327
3Three Marks Coffee354
4El Bar364
\n", + "
" + ], + "text/plain": [ + " name distance\n", + "0 Espacio 88 311\n", + "1 SKYE Coffee Co 320\n", + "2 Granja Mabel 327\n", + "3 Three Marks Coffee 354\n", + "4 El Bar 364" + ] + }, + "execution_count": 112, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# your code here" + "res = requests_for_foursquare (\"coffee\", lat, lon, radius=500, limit=10)\n", + "res[\"results\"][0][\"distance\"]\n", + "\n", + "name = [res[\"results\"][i][\"name\"] for i in range(5)]\n", + "distance = [res[\"results\"][i][\"distance\"] for i in range(5)]\n", + "\n", + "new = {}\n", + "\n", + "new[\"name\"] = name\n", + "new[\"distance\"] = distance\n", + "\n", + "df = pd.DataFrame(new)\n", + "df" ] }, { @@ -62,18 +308,104 @@ "id": "d19904e8", "metadata": {}, "source": [ - "# 4. Define a function that returns name, lat, long for starbucks OR restaurants AND for any given location" + "# 4. Define a function that returns name, lat, long for starbucks OR restaurants AND for any given location" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 146, "id": "1fad5153", "metadata": {}, "outputs": [], "source": [ + "limit = 1\n", + "\n", "def foursquare_places (venue, coordinates):\n", - " pass" + " \n", + " url = f\"https://api.foursquare.com/v3/places/search?query={venue}&ll={coordinates[0]}%2C{coordinates[1]}&radius=1000&limit={limit}&sort=DISTANCE\"\n", + "\n", + " headers = {\n", + " \"accept\": \"application/json\",\n", + " \"Authorization\": token\n", + " }\n", + " \n", + " try:\n", + " res = requests.get(url, headers=headers).json()\n", + " names = [res[\"results\"][i][\"name\"] for i in range(limit)]\n", + " lat = [res[\"results\"][i][\"geocodes\"][\"main\"][\"latitude\"] for i in range(limit)]\n", + " lon = [res[\"results\"][i][\"geocodes\"][\"main\"][\"longitude\"] for i in range(limit)]\n", + "\n", + " db = {}\n", + "\n", + " db[\"name\"] = names\n", + " db[\"latitude\"] = lat\n", + " db[\"longitud\"] = lon\n", + "\n", + " df = pd.DataFrame(db)\n", + " return df\n", + " \n", + " except:\n", + " print(\"no :(\")" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namelatitudelongitud
0Starbucks41.3920072.180638
\n", + "
" + ], + "text/plain": [ + " name latitude longitud\n", + "0 Starbucks 41.392007 2.180638" + ] + }, + "execution_count": 147, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "venue = \"starbucks\"\n", + "coordinates = [41.3977461, 2.187674417]\n", + "\n", + "res = foursquare_places(venue, coordinates)\n", + "res" ] }, { @@ -86,7 +418,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 89, "id": "7ac5f2a8", "metadata": {}, "outputs": [], @@ -104,7 +436,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 90, "id": "85b94955", "metadata": {}, "outputs": [], @@ -117,7 +449,7 @@ "kernelspec": { "display_name": "ironhack", "language": "python", - "name": "ironhack" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -129,7 +461,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.13" + "version": "3.11.5" }, "toc": { "base_numbering": 1, diff --git a/data/coffe_shops.json b/data/coffe_shops.json new file mode 100644 index 0000000..3620cb4 --- /dev/null +++ b/data/coffe_shops.json @@ -0,0 +1 @@ +{"name":{"0":"Can Dend\u00ea","1":"La Tavern\u00edcola","2":"Little Fern","3":"Parking Pizza","4":"Funky Bakers"},"latitude":{"0":41.39836,"1":41.400358,"2":41.402328,"3":41.396301,"4":41.394916},"longitud":{"0":2.198345,"1":2.197944,"2":2.197571,"3":2.174171,"4":2.172866}} \ No newline at end of file diff --git a/foursquaredata.txt b/foursquaredata.txt new file mode 100644 index 0000000..fb77f10 --- /dev/null +++ b/foursquaredata.txt @@ -0,0 +1,3 @@ +newprojectkey = "fsq3fQnHboOxddC78bl5nAO+qufPkDwwBgQD/jDqx+sRkok=" +clientid = "PEHVZRPXTB4QW2YB523S3LBBW14QEL4BWZXGRKJ35ORBJA4Q" +clientsecret = "5IZTH4JRSQZBPP3BNGRT23G3DDP1QAFJHHRCILPQXHLQQ51V" \ No newline at end of file