From 7acb891d341593eace1481376ff99f3dc6b22dc0 Mon Sep 17 00:00:00 2001 From: aroatdlt Date: Tue, 24 Nov 2020 21:56:14 +0100 Subject: [PATCH 1/2] soluciones notebook 3 --- notebooks/03_programacion.ipynb | 125 ++++- notebooks/soluciones/03_programacion.ipynb | 610 +++++++++++++++++++++ 2 files changed, 711 insertions(+), 24 deletions(-) create mode 100644 notebooks/soluciones/03_programacion.ipynb diff --git a/notebooks/03_programacion.ipynb b/notebooks/03_programacion.ipynb index 6a2f720..88abee0 100644 --- a/notebooks/03_programacion.ipynb +++ b/notebooks/03_programacion.ipynb @@ -695,9 +695,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Moratalaz': 95000, 'Centro': 150000, 'Barajas': 46000}" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "poblacion = {'Moratalaz': 95000,\n", " 'Centro': 150000,\n", @@ -746,9 +757,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Moratalaz': 95.0, 'Centro': 150.0, 'Barajas': 46.0}" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Atención al .items() para poder iterar sobre clave y valor en el dict\n", "\n", @@ -801,9 +823,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "datetime.date(2019, 1, 30)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from datetime import date, datetime\n", "\n", @@ -813,9 +846,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "datetime.datetime(2019, 3, 30, 14, 35, 59)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "fecha_hora = datetime(2019, 3, 30, 14, 35, 59)\n", "fecha_hora" @@ -830,9 +874,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "datetime.date(2019, 3, 30)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "fecha_hora.date()" ] @@ -849,18 +904,40 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'2019-01-30'" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "fecha.strftime('%Y-%m-%d')" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'2019-03-30 14:35:59'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "fecha_hora.strftime('%Y-%m-%d %H:%M:%S')" ] @@ -1154,9 +1231,9 @@ ], "metadata": { "kernelspec": { - "display_name": "libropython", + "display_name": "Python 3", "language": "python", - "name": "libropython" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -1168,7 +1245,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" } }, "nbformat": 4, diff --git a/notebooks/soluciones/03_programacion.ipynb b/notebooks/soluciones/03_programacion.ipynb new file mode 100644 index 0000000..e6a67cb --- /dev/null +++ b/notebooks/soluciones/03_programacion.ipynb @@ -0,0 +1,610 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Ponemos como ruta principal la carpeta padre de \"soluciones\"\n", + "# para que las rutas relativas queden igual que en la carpeta de notebooks\n", + "import paths\n", + "\n", + "# Otras dependencias\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ejercicio\n", + "\n", + "Sobre el siguiente DataFrame, crea dos columnas separadas, una para el importe (que sea float) y otra para la divisa (que sea cadena de texto)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "importes = pd.DataFrame({'importe_divisa': ['592,50 EUR', '690,10 USD', '2951 GBP']})\n", + "result = map(separate, importes.importe_divisa)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " importe_divisa\n", + "0 592,50 EUR\n", + "1 690,10 USD\n", + "2 2951 GBP\n" + ] + } + ], + "source": [ + "def separate(s): return s.split(' ')\n", + "for row in list(result):\n", + " for element in row:\n", + " if(element.isdigit()):\n", + " importes.importe_divisa['importe'] = float(element)\n", + " else:\n", + " importes.importe_divisa['divisa'] = element\n", + "print(importes)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "scrolled": true + }, + "source": [ + "### Expresiones regulares" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ejercicio\n", + "Con expresiones regulares, realiza los siguientes ejercicios:\n", + "\n", + "Sobre la cadena '30 del 04 para el 2018', extrae:\n", + "\n", + "* Todos los números de forma independiente. Es decir, resultará una lista con 3, 0, 0, 4, ...\n", + "* Todos los números de forma consecutiva. Es decir, resultará una lista con 30, 04, 2018.\n", + "* Extrae las palabras de '30 del 04 para el 2018'. Saldrá del, para, ...\n", + "* Extrae el último número consecutivo. Saldrá 2018.\n", + "* Transfórmala para convertirla a formato ISO (es decir, yyyy-mm-dd)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['3', '0', '0', '4', '2', '0', '1', '8']" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Importamos re\n", + "import re\n", + "#Todos los números de forma independiente\n", + "cadena = '30 del 04 para el 2018'\n", + "re.findall(r'([0-9]{1})', cadena)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['30', '04', '2018']" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Todos los números de forma consecutiva\n", + "re.findall(r'[0-9]+', cadena)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['del', 'para', 'el']" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Extraemos las palabras\n", + "re.findall(r'[a-z]+', cadena)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['2018']" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Extraemos el último número consecutivo\n", + "re.findall(r'(\\d+)(?!.*\\d)', cadena)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "' 2018-04-30 '" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Transformamos la cadena para darle el formato ISO\n", + "re.sub(r'([0-3][0-9]).*([0-1][0-9]).*(\\d{4})', r' \\3-\\2-\\1 ', cadena)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Listas" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Ejercicio\n", + "\n", + "Crea una lista que contenga las palabras de `frase` que tengan una longitud de más de 5 caracteres." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Estoy', 'curso', 'python', 'ciencia', 'datos']" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "frase = 'Estoy en el curso de python para ciencia de datos'\n", + "total_palabras = frase.split()\n", + "[f'{palabra}' for palabra in total_palabras if len(palabra) >= 5]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Ejercicio\n", + "\n", + "Elimina las vocales de la frase anterior" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Esty n l crs d pythn pr cnc d dts\n" + ] + } + ], + "source": [ + "frase = 'Estoy en el curso de python para ciencia de datos'\n", + "vocales = 'aeiou'\n", + "sinvocales = ''.join(letra for letra in frase if letra not in vocales)\n", + "print(sinvocales)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Ejercicio\n", + "\n", + "Calcula la lista de los cuadrados de:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[4, 9, 25, 49]\n" + ] + } + ], + "source": [ + "lista = [2, 3, 5, 7]\n", + "cuadrados = [number * number for number in lista] \n", + "print(cuadrados)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Diccionarios" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Ejercicio\n", + "\n", + "A partir del diccionario `precios_por_distrito`, crea un diccionario donde la clave sea el distrito y el valor, otro diccionario con dos elementos: el precio mínimo (la clave será `minimo`) y el máximo (con clave `maximo`)." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Arganzuela': {'minimo': 1920.4065754345897, 'maximo': 3980.43306658443},\n", + " 'Barajas': {'minimo': 1661.89030566455, 'maximo': 3730.1779520808},\n", + " 'Carabanchel': {'minimo': 1358.55787972897, 'maximo': 3227.6873594259996},\n", + " 'Centro': {'minimo': 1857.41441612893, 'maximo': 4987.19887607627},\n", + " 'Chamartín': {'minimo': 2523.68801546582, 'maximo': 5028.7606510284495},\n", + " 'Chamberí': {'minimo': 2264.7895662852898, 'maximo': 5202.006707450821},\n", + " 'Ciudad Lineal': {'minimo': 2006.8859076291199, 'maximo': 3818.3598512111207},\n", + " 'Fuencarral': {'minimo': 2047.43064685387, 'maximo': 3920.54885583231},\n", + " 'Hortaleza': {'minimo': 2098.2717490201003, 'maximo': 3950.0356215050606},\n", + " 'Latina': {'minimo': 1473.8692762737803, 'maximo': 3239.46764244599},\n", + " 'Moncloa': {'minimo': 2019.07068648125, 'maximo': 4430.00381720687},\n", + " 'Moratalaz': {'minimo': 1672.70935515272, 'maximo': 3391.0740941292997},\n", + " 'Puente De Vallecas': {'minimo': 1344.08002441389,\n", + " 'maximo': 3138.16619810753},\n", + " 'Retiro': {'minimo': 2152.36137617549, 'maximo': 4875.669322096111},\n", + " 'Salamanca': {'minimo': 2437.77633210158, 'maximo': 5929.503382679461},\n", + " 'San Blas': {'minimo': 1666.29660945609, 'maximo': 3453.60218268776},\n", + " 'Tetuán': {'minimo': 2063.82501950686, 'maximo': 3963.97896418851},\n", + " 'Usera': {'minimo': 1292.14858687068, 'maximo': 3096.2097085769},\n", + " 'Vicálvaro': {'minimo': 1505.91052361511, 'maximo': 3294.3617906114},\n", + " 'Villa De Vallecas': {'minimo': 1270.61727331786, 'maximo': 3175.93995680773},\n", + " 'Villaverde': {'minimo': 1110.5403031765302, 'maximo': 2867.49730693443}}" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import paths\n", + "import pandas as pd\n", + "\n", + "venta = pd.read_csv(\"dat/venta-madrid-distritos.csv\", index_col=False)\n", + "venta = venta[venta.precio.notnull()]\n", + "precios_por_distrito = venta.groupby('distrito').precio.apply(lambda precios: precios.tolist()).to_dict()\n", + "{distrito: {'minimo': min(valor), 'maximo': max(valor)} for distrito, valor in precios_por_distrito.items()}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Fechas" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Ejercicio\n", + "\n", + "Formatea fecha_hora con formato 12 horas en lugar de 24 e indicando si es AM o PM" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "datetime.datetime(2019, 3, 30, 14, 35, 59)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from datetime import date, datetime\n", + "fecha_hora = datetime(2019, 3, 30, 14, 35, 59)\n", + "fecha_hora" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'2019-03-30 02:35:59 PM'" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fecha_hora.strftime('%Y-%m-%d %I:%M:%S %p')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Ejercicio\n", + "\n", + "Parsea a fecha:\n", + "\n", + "* `'20/05/2018'`\n", + "* `'2018-05-20'`" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "datetime.datetime(2018, 5, 20, 0, 0)" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fecha_primera = datetime.strptime('20/05/2018', '%d/%m/%Y')\n", + "fecha_primera" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "datetime.datetime(2018, 5, 20, 0, 0)" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fecha_segunda = datetime.strptime('2018-05-20', '%Y-%m-%d')\n", + "fecha_segunda" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Bucles" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Ejercicio\n", + "\n", + "Usa un bucle que devuelva el mismo resultado que la compresión de lista que ya hemos visto\n", + "\n", + "```\n", + "[f'{precio} €' for precio in precios]\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['2300 €', '1942 €', '3455 €', '4100 €', '600 €', '1230 €']\n" + ] + } + ], + "source": [ + "precios = [2300, 1942, 3455, 4100, 600, 1230]\n", + "precios_euros = []\n", + "def formatea_precio(precio):\n", + " return str(precio) + ' €'\n", + "for precio in precios:\n", + " precios_euros.append(formatea_precio(precio))\n", + "print(precios_euros)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Expresiones condicionales" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Ejercicio\n", + "\n", + "Construye una función que, dado un precio y un umbral, devuelva la cadena `caro` o `barato` según si el precio está por encima o por debajo del umbral. Crea entonces una columna adicional en `venta` usando como umbral la mediana del precio." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "venta['mediana'] = venta.groupby('distrito').precio.transform('median')\n", + "def tipo_precio(precio, umbral):\n", + " if umbral > precio:\n", + " return 'barato'\n", + " else: \n", + " return 'caro'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Ejercicio\n", + "\n", + "Usa la función del ejercicio anterior, bucles, etc. para crear una columna adicional en `venta` que indique si el precio de un piso es caro o barato según supere o no la mediana de precios de su distrito." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " distrito ano quarter precio mediana venta\n", + "16 Tetuán 2001 1 2063.825020 3227.767592 barato\n", + "37 Tetuán 2001 2 2254.026720 3227.767592 barato\n", + "58 Tetuán 2001 3 2287.169543 3227.767592 barato\n", + "79 Tetuán 2001 4 2321.009574 3227.767592 barato\n", + "100 Tetuán 2002 1 2474.372011 3227.767592 barato\n", + "... ... ... ... ... ... ...\n", + "1381 Tetuán 2017 2 3022.064288 3227.767592 barato\n", + "1402 Tetuán 2017 3 3073.203746 3227.767592 barato\n", + "1423 Tetuán 2017 4 3150.590133 3227.767592 barato\n", + "1444 Tetuán 2018 1 3411.186852 3227.767592 caro\n", + "1465 Tetuán 2018 2 3557.922318 3227.767592 caro\n", + "\n", + "[68 rows x 6 columns]\n" + ] + } + ], + "source": [ + "for i, row in venta.iterrows():\n", + " venta.at[i, 'venta'] = tipo_precio(row.precio, row.mediana)\n", + "\n", + "print(venta[(venta.distrito == 'Tetuán')])" + ] + }, + { + "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.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From b5e3afe87e85242c759ff10e3a7ac3e3bfd5cd89 Mon Sep 17 00:00:00 2001 From: aroatdlt Date: Sun, 27 Dec 2020 21:16:31 +0100 Subject: [PATCH 2/2] add solutions exercise 4 apis --- notebooks/soluciones/04_apis.ipynb | 345 +++++++++++++++++++++++++++++ 1 file changed, 345 insertions(+) create mode 100644 notebooks/soluciones/04_apis.ipynb diff --git a/notebooks/soluciones/04_apis.ipynb b/notebooks/soluciones/04_apis.ipynb new file mode 100644 index 0000000..e8cce3d --- /dev/null +++ b/notebooks/soluciones/04_apis.ipynb @@ -0,0 +1,345 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "# Ponemos como ruta principal la carpeta padre de \"soluciones\"\n", + "# para que las rutas relativas queden igual que en la carpeta de notebooks\n", + "import paths\n", + "\n", + "# Otras dependencias\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ejercicio\n", + "\n", + "Investiga en la documentación de la librería [requests](http://www.python-requests.org/en/latest/) cómo pasar parámetros en el query string. También consulta la documentación de la API [exchangeratesapi](https://exchangeratesapi.io/).\n", + "\n", + "Con esta información, extrae el valor actual de la conversión de la libra esterlina `GBP` al resto de monedas.\n", + "\n", + "*Nota*: hazlo sin poner manualmente el query string en la URL" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://api.exchangeratesapi.io/latest?base=GBP\n" + ] + }, + { + "data": { + "text/plain": [ + "'{\"rates\":{\"CAD\":1.7435269224,\"HKD\":10.5275349407,\"ISK\":173.6176847263,\"PHP\":65.2140987806,\"DKK\":8.2843142714,\"HUF\":402.7173005178,\"CZK\":29.2878222618,\"GBP\":1.0,\"RON\":5.4262486775,\"SEK\":11.2214488557,\"IDR\":19281.7640180411,\"INR\":99.8769419233,\"BRL\":7.0836906287,\"RUB\":100.8869090707,\"HRK\":8.4036973105,\"JPY\":140.7428030514,\"THB\":40.8586224177,\"CHF\":1.208419177,\"EUR\":1.1136477532,\"MYR\":5.5136700262,\"BGN\":2.1780722757,\"TRY\":10.2761846428,\"CNY\":8.8673088702,\"NOK\":11.7053288045,\"NZD\":1.9119104627,\"ZAR\":19.8509939306,\"USD\":1.3578707055,\"MXN\":27.1145386714,\"SGD\":1.8035525363,\"AUD\":1.7861796314,\"ILS\":4.3678378529,\"KRW\":1497.8228186425,\"PLN\":5.0138649145},\"base\":\"GBP\",\"date\":\"2020-12-24\"}'" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import requests\n", + "data = {'base': 'GBP'}\n", + "r = requests.get('https://api.exchangeratesapi.io/latest', params=data)\n", + "print(r.url)\n", + "r.text" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ejercicio\n", + "\n", + "También sobre la API de `exchangeratesapi`, consulta el histórico disponible del valor entre dólares americanos y libras entre el 15 de agosto y 15 de septiembre de 2018" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://api.exchangeratesapi.io/history?start_at=2018-08-15&end_at=2018-09-15&symbols=USD%2CGBP\n" + ] + }, + { + "data": { + "text/plain": [ + "'{\"rates\":{\"2018-08-27\":{\"USD\":1.1633,\"GBP\":0.90365},\"2018-09-14\":{\"USD\":1.1689,\"GBP\":0.89228},\"2018-08-22\":{\"USD\":1.1616,\"GBP\":0.89928},\"2018-09-11\":{\"USD\":1.1574,\"GBP\":0.89068},\"2018-09-07\":{\"USD\":1.1615,\"GBP\":0.89275},\"2018-08-28\":{\"USD\":1.171,\"GBP\":0.9068},\"2018-08-17\":{\"USD\":1.1391,\"GBP\":0.89575},\"2018-08-30\":{\"USD\":1.1692,\"GBP\":0.89758},\"2018-08-20\":{\"USD\":1.142,\"GBP\":0.89478},\"2018-09-12\":{\"USD\":1.1585,\"GBP\":0.89028},\"2018-08-15\":{\"USD\":1.1321,\"GBP\":0.8913},\"2018-09-10\":{\"USD\":1.1571,\"GBP\":0.8934},\"2018-08-29\":{\"USD\":1.166,\"GBP\":0.905},\"2018-08-23\":{\"USD\":1.1579,\"GBP\":0.89878},\"2018-08-31\":{\"USD\":1.1651,\"GBP\":0.8974},\"2018-09-05\":{\"USD\":1.1582,\"GBP\":0.90328},\"2018-08-21\":{\"USD\":1.1502,\"GBP\":0.8974},\"2018-08-24\":{\"USD\":1.1588,\"GBP\":0.902},\"2018-09-03\":{\"USD\":1.1609,\"GBP\":0.90158},\"2018-09-06\":{\"USD\":1.1634,\"GBP\":0.89824},\"2018-08-16\":{\"USD\":1.137,\"GBP\":0.89498},\"2018-09-04\":{\"USD\":1.1562,\"GBP\":0.90058},\"2018-09-13\":{\"USD\":1.162,\"GBP\":0.89}},\"start_at\":\"2018-08-15\",\"base\":\"EUR\",\"end_at\":\"2018-09-15\"}'" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = {'start_at': '2018-08-15', 'end_at': '2018-09-15', 'symbols': 'USD,GBP'}\n", + "r = requests.get('https://api.exchangeratesapi.io/history', params=data)\n", + "print(r.url)\n", + "r.text" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ejercicio\n", + "\n", + "Consulta la documentación de estas dos APIs:\n", + "\n", + "* [Nominatim - reverse geocoding](http://wiki.openstreetmap.org/wiki/Nominatim#Reverse_Geocoding)\n", + "* [UK Police - crimes at location](https://data.police.uk/docs/method/crimes-at-location)\n", + "\n", + "Primero, consulta a la API de Nominatim para conocer cuál es la dirección asociada a estas coordenadas:\n", + "\n", + "* Latitud: 51.4965946\n", + "* Longitud: -0.1436476\n", + "\n", + "El resultado debe estar en formato JSON.\n", + "Luego, consulta a la API de la policía de UK los crímenes que se cometieron en esa localización en julio de 2018" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://data.police.uk/api/crimes-at-location?date=2018-07&location_id=953339\n" + ] + }, + { + "data": { + "text/plain": [ + "[{'category': 'other-theft',\n", + " 'location_type': 'Force',\n", + " 'location': {'latitude': '51.496602',\n", + " 'street': {'id': 953339, 'name': 'On or near Victoria Street'},\n", + " 'longitude': '-0.143827'},\n", + " 'context': '',\n", + " 'outcome_status': {'category': 'Status update unavailable',\n", + " 'date': '2018-11'},\n", + " 'persistent_id': '135c66ac6fb8a55203fc6f7280bb4c3a152df5c64d7e7a28994a6a35bc586e90',\n", + " 'id': 66682430,\n", + " 'location_subtype': '',\n", + " 'month': '2018-07'},\n", + " {'category': 'other-theft',\n", + " 'location_type': 'Force',\n", + " 'location': {'latitude': '51.496602',\n", + " 'street': {'id': 953339, 'name': 'On or near Victoria Street'},\n", + " 'longitude': '-0.143827'},\n", + " 'context': '',\n", + " 'outcome_status': {'category': 'Investigation complete; no suspect identified',\n", + " 'date': '2018-07'},\n", + " 'persistent_id': 'c33b9ccf37cbf501f9c79f86517c697fedef478378c0ff3a370a5bede5e63293',\n", + " 'id': 66694477,\n", + " 'location_subtype': '',\n", + " 'month': '2018-07'},\n", + " {'category': 'other-theft',\n", + " 'location_type': 'Force',\n", + " 'location': {'latitude': '51.496602',\n", + " 'street': {'id': 953339, 'name': 'On or near Victoria Street'},\n", + " 'longitude': '-0.143827'},\n", + " 'context': '',\n", + " 'outcome_status': {'category': 'Status update unavailable',\n", + " 'date': '2018-11'},\n", + " 'persistent_id': 'f1f10696b3700a0ff91d07661e45733ec2e03c74393cfd8d68f58b42c0dde822',\n", + " 'id': 66677176,\n", + " 'location_subtype': '',\n", + " 'month': '2018-07'},\n", + " {'category': 'other-theft',\n", + " 'location_type': 'Force',\n", + " 'location': {'latitude': '51.496602',\n", + " 'street': {'id': 953339, 'name': 'On or near Victoria Street'},\n", + " 'longitude': '-0.143827'},\n", + " 'context': '',\n", + " 'outcome_status': {'category': 'Status update unavailable',\n", + " 'date': '2018-11'},\n", + " 'persistent_id': '6b1ec82b8e83b2dabec5a5de9c321bfbeeefcc889ef04017416717dc4682977a',\n", + " 'id': 66661547,\n", + " 'location_subtype': '',\n", + " 'month': '2018-07'},\n", + " {'category': 'other-theft',\n", + " 'location_type': 'Force',\n", + " 'location': {'latitude': '51.496602',\n", + " 'street': {'id': 953339, 'name': 'On or near Victoria Street'},\n", + " 'longitude': '-0.143827'},\n", + " 'context': '',\n", + " 'outcome_status': {'category': 'Investigation complete; no suspect identified',\n", + " 'date': '2018-07'},\n", + " 'persistent_id': 'cdcf8a4e2ccd84f22a2b2b57ca324366e77ccad2eb46c205a92145f837a6a9a1',\n", + " 'id': 66663114,\n", + " 'location_subtype': '',\n", + " 'month': '2018-07'},\n", + " {'category': 'other-theft',\n", + " 'location_type': 'Force',\n", + " 'location': {'latitude': '51.496602',\n", + " 'street': {'id': 953339, 'name': 'On or near Victoria Street'},\n", + " 'longitude': '-0.143827'},\n", + " 'context': '',\n", + " 'outcome_status': {'category': 'Status update unavailable',\n", + " 'date': '2018-11'},\n", + " 'persistent_id': '1241e77c59b8cb46c8c5cfa2385018c8572286da7701a13c2d3713a7ae89ac66',\n", + " 'id': 66706127,\n", + " 'location_subtype': '',\n", + " 'month': '2018-07'},\n", + " {'category': 'public-order',\n", + " 'location_type': 'Force',\n", + " 'location': {'latitude': '51.496602',\n", + " 'street': {'id': 953339, 'name': 'On or near Victoria Street'},\n", + " 'longitude': '-0.143827'},\n", + " 'context': '',\n", + " 'outcome_status': {'category': 'Offender given a caution',\n", + " 'date': '2018-08'},\n", + " 'persistent_id': 'e86aa5d7305b3032bd9427d6fcb43384ee3c9f4ffd6051d57e8f0239c9748bcf',\n", + " 'id': 66663903,\n", + " 'location_subtype': '',\n", + " 'month': '2018-07'},\n", + " {'category': 'robbery',\n", + " 'location_type': 'Force',\n", + " 'location': {'latitude': '51.496602',\n", + " 'street': {'id': 953339, 'name': 'On or near Victoria Street'},\n", + " 'longitude': '-0.143827'},\n", + " 'context': '',\n", + " 'outcome_status': {'category': 'Status update unavailable',\n", + " 'date': '2018-11'},\n", + " 'persistent_id': '180c674b7c6e7bd45d5d4bfcaa345bfd4a365abc66e7ffb82d68286ee805981b',\n", + " 'id': 66680012,\n", + " 'location_subtype': '',\n", + " 'month': '2018-07'},\n", + " {'category': 'theft-from-the-person',\n", + " 'location_type': 'Force',\n", + " 'location': {'latitude': '51.496602',\n", + " 'street': {'id': 953339, 'name': 'On or near Victoria Street'},\n", + " 'longitude': '-0.143827'},\n", + " 'context': '',\n", + " 'outcome_status': {'category': 'Status update unavailable',\n", + " 'date': '2018-11'},\n", + " 'persistent_id': '563237a95056e032d05512afcffe0192aa603f3af4607de9bf6bd95d62deb5b1',\n", + " 'id': 66662904,\n", + " 'location_subtype': '',\n", + " 'month': '2018-07'},\n", + " {'category': 'theft-from-the-person',\n", + " 'location_type': 'Force',\n", + " 'location': {'latitude': '51.496602',\n", + " 'street': {'id': 953339, 'name': 'On or near Victoria Street'},\n", + " 'longitude': '-0.143827'},\n", + " 'context': '',\n", + " 'outcome_status': {'category': 'Status update unavailable',\n", + " 'date': '2018-11'},\n", + " 'persistent_id': '574bc744ebdaf4ec0f53ca048a1c4a313d51bef4a809e553670528392d050694',\n", + " 'id': 66692437,\n", + " 'location_subtype': '',\n", + " 'month': '2018-07'},\n", + " {'category': 'violent-crime',\n", + " 'location_type': 'Force',\n", + " 'location': {'latitude': '51.496602',\n", + " 'street': {'id': 953339, 'name': 'On or near Victoria Street'},\n", + " 'longitude': '-0.143827'},\n", + " 'context': '',\n", + " 'outcome_status': {'category': 'Status update unavailable',\n", + " 'date': '2018-11'},\n", + " 'persistent_id': '58638a3e9296eaad16f67efc1eebc7939bd0fb73ea9989ddf69a4ad83db653b4',\n", + " 'id': 66682678,\n", + " 'location_subtype': '',\n", + " 'month': '2018-07'}]" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = {'date':'2018-07', 'location_id': '953339'}\n", + "r = requests.get('https://data.police.uk/api/crimes-at-location', params=data)\n", + "print(r.url)\n", + "r.json()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Ejercicio swapi\n", + "\n", + "Haz una petición a la API de [swapi](https://swapi.dev/documentation) con una búsqueda de todos los personajes que tengan el apellido `skywalker`. Examina la respuesta e imprime los nombres resultantes utilizando una `list comprehension` (no utilices bucles)." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://swapi.dev/api/people/?search=skywalker\n", + "['Luke Skywalker', 'Anakin Skywalker', 'Shmi Skywalker']\n" + ] + } + ], + "source": [ + "data = {'search':'skywalker'}\n", + "r = requests.get('https://swapi.dev/api/people/', params=data)\n", + "print(r.url)\n", + "result = r.json()\n", + "characters = result['results']\n", + "names = [character['name'] for character in characters]\n", + "print(names)" + ] + }, + { + "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.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}