From 93fbe5b075707b09119c8f738f3d2908f86ca4dd Mon Sep 17 00:00:00 2001 From: Jose Rivera Date: Fri, 2 Apr 2021 21:21:14 +0100 Subject: [PATCH 1/8] Implementa fuzzy search para devolver el municipio mas cercano al input. --- aemet/__init__.py | 18 ++++++++++++------ aemet/models.py | 15 +++++++++------ requirements.txt | 1 + 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/aemet/__init__.py b/aemet/__init__.py index 3eca3fe..4930c10 100644 --- a/aemet/__init__.py +++ b/aemet/__init__.py @@ -1,14 +1,20 @@ from aemet.models import * # noqa import click + @click.command() -@click.option('-p', '--prediccion', help='Muestra la predicción meteorológica dado un nombre de municipio') -def main(prediccion): - client = Aemet() +@click.option( + "-p", + "--prediccion", + help="Muestra la predicción meteorológica dado un nombre de municipio", +) +@click.option("-k", "--key", help="API key AEMET") +@click.option("-f", "--keyfile", help="Fichero con la clave de la AEMET.") +def main(prediccion, key, keyfile): + client = Aemet(api_key=key, api_key_file=keyfile) municipio = Municipio.buscar(prediccion) p = client.get_prediccion(municipio.get_codigo()) for dia in p.prediccion: print(dia.fecha) - print('Máxima: {}'.format(dia.temperatura['maxima'])) - print('Mínima: {}'.format(dia.temperatura['minima'])) - print() + print("Máxima: {}".format(dia.temperatura["maxima"])) + print("Mínima: {}\n".format(dia.temperatura["minima"])) diff --git a/aemet/models.py b/aemet/models.py index ca0f56a..c3e2b88 100644 --- a/aemet/models.py +++ b/aemet/models.py @@ -2,6 +2,7 @@ import json import urllib3 from datetime import datetime +from fuzzywuzzy import fuzz from aemet.constants import * # Disable Insecure Request Warnings @@ -279,15 +280,17 @@ def get_municipio(id): @staticmethod def buscar(nombre): """ - Devuelve una lista con los resultados de la búsqueda + Devuelve el resultado de la búsqueda entre todos los municipios de España. :param nombre: Nombre del municipio """ try: - municipios_raw = list(filter(lambda t: nombre in t.get('NOMBRE'), Municipio.MUNICIPIOS)) - municipios = list(map(lambda m: Municipio.from_json(m), municipios_raw)) - return municipios - except: - return None + match_ratios = list(map(lambda m: fuzz.ratio(nombre.lower(), m.get("NOMBRE").lower()), Municipio.MUNICIPIOS)) + best_match = max(match_ratios) + idx_best_match = match_ratios.index(best_match) + municipio = Municipio.from_json(Municipio.MUNICIPIOS[idx_best_match]) + return municipio + except e: + print(f"Ha habido un error {e}") def get_codigo(self): return '{}{}'.format(self.cpro, self.cmun) diff --git a/requirements.txt b/requirements.txt index 6c737fe..577a732 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ urllib3 requests click +fuzzywuzzy From 1485e67b67661b240c8b288f9484d0518c41b011 Mon Sep 17 00:00:00 2001 From: Jose Rivera Date: Fri, 2 Apr 2021 21:25:44 +0100 Subject: [PATCH 2/8] python-Levenshtein for faster sequence search --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 577a732..c7ada47 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ urllib3 requests click fuzzywuzzy +python-Levenshtein From d886da635012bb35545fd14bc1b589f440dd24dd Mon Sep 17 00:00:00 2001 From: Jose Rivera Date: Fri, 2 Apr 2021 21:26:12 +0100 Subject: [PATCH 3/8] Nombre del municipio en la salida. --- aemet/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aemet/__init__.py b/aemet/__init__.py index 4930c10..cf2a64d 100644 --- a/aemet/__init__.py +++ b/aemet/__init__.py @@ -14,6 +14,7 @@ def main(prediccion, key, keyfile): client = Aemet(api_key=key, api_key_file=keyfile) municipio = Municipio.buscar(prediccion) p = client.get_prediccion(municipio.get_codigo()) + print(f"Predicción de temperaturas para {municipio.nombre}:\n") for dia in p.prediccion: print(dia.fecha) print("Máxima: {}".format(dia.temperatura["maxima"])) From feea8c9d0ac933d6e8c405019d4538fe492e97b2 Mon Sep 17 00:00:00 2001 From: Jose Rivera Date: Fri, 2 Apr 2021 21:48:50 +0100 Subject: [PATCH 4/8] Better fuzzy seach with token_set_ratio. --- aemet/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aemet/models.py b/aemet/models.py index c3e2b88..bd82e8f 100644 --- a/aemet/models.py +++ b/aemet/models.py @@ -284,7 +284,7 @@ def buscar(nombre): :param nombre: Nombre del municipio """ try: - match_ratios = list(map(lambda m: fuzz.ratio(nombre.lower(), m.get("NOMBRE").lower()), Municipio.MUNICIPIOS)) + match_ratios = list(map(lambda m: fuzz.token_set_ratio(nombre, m.get("NOMBRE")), Municipio.MUNICIPIOS)) best_match = max(match_ratios) idx_best_match = match_ratios.index(best_match) municipio = Municipio.from_json(Municipio.MUNICIPIOS[idx_best_match]) From 4eee411418ec128d787e82be4c76fc865ed93922 Mon Sep 17 00:00:00 2001 From: Jose Rivera Date: Fri, 2 Apr 2021 21:59:42 +0100 Subject: [PATCH 5/8] Add todo. --- aemet/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aemet/models.py b/aemet/models.py index bd82e8f..a31cab4 100644 --- a/aemet/models.py +++ b/aemet/models.py @@ -3,6 +3,7 @@ import urllib3 from datetime import datetime from fuzzywuzzy import fuzz +# ToDo: eliminar este import de todos los elementos del modulo from aemet.constants import * # Disable Insecure Request Warnings From 2c81cfa3547d9ff5dcea510492eefd2ece8536ad Mon Sep 17 00:00:00 2001 From: Jose Rivera Date: Sat, 3 Apr 2021 19:27:25 +0100 Subject: [PATCH 6/8] Better with fuzz.process. --- aemet/models.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/aemet/models.py b/aemet/models.py index a31cab4..b62ad52 100644 --- a/aemet/models.py +++ b/aemet/models.py @@ -1,8 +1,8 @@ -import requests import json +import requests import urllib3 from datetime import datetime -from fuzzywuzzy import fuzz +from fuzzywuzzy import process # ToDo: eliminar este import de todos los elementos del modulo from aemet.constants import * @@ -285,9 +285,9 @@ def buscar(nombre): :param nombre: Nombre del municipio """ try: - match_ratios = list(map(lambda m: fuzz.token_set_ratio(nombre, m.get("NOMBRE")), Municipio.MUNICIPIOS)) - best_match = max(match_ratios) - idx_best_match = match_ratios.index(best_match) + nombres_municipios = list(map(lambda m: m.get("NOMBRE"), Municipio.MUNICIPIOS)) + best_match = process.extractOne(nombre, nombres_municipios) + idx_best_match = nombres_municipios.index(best_match[0]) municipio = Municipio.from_json(Municipio.MUNICIPIOS[idx_best_match]) return municipio except e: From c84b4ea93213e33d83ac318e17d961aa4bc089e5 Mon Sep 17 00:00:00 2001 From: Jose Rivera Date: Sat, 3 Apr 2021 19:28:04 +0100 Subject: [PATCH 7/8] Primer caso de uso con busqueda por municipio. --- docs/README.md | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..fdf52ae --- /dev/null +++ b/docs/README.md @@ -0,0 +1,80 @@ +# Casos de uso de `python-aemet` + +## Requisitos previos + +### Instalar la librería `python-aemet` + +- Tener `python3` instalado en el sistema: `which python` + +- Instalar la librería en el local. Recomendamos el uso de un `virtualenv`. + + E.g. Instala `virtualenv`: + + ```bash + pip install virtualenv + ``` + + Clona el repo `git clone git@github.com:pablo-moreno/python-aemet.git && cd python-aemet` + + Activa el `virtualenv`: + + ```bash + virtualenv .venv + source .venv/bin/activate + ``` + + Instala la librería + + ```bash + pip install . + ``` + +### Obtener la clave API + +Obtén tu clave de API en la siguiente URL: + + + +Y ponla en un fichero `aemet.key` + +## Casos de uso + +### Predicción de la temperatura máxima y mínima en un municipio concreto en los próximos días + +```bash +aemet -p Madrid -f /path/a/la/clave/aemet.key +``` + +La salida: + +```sh +Predicción de temperaturas para Madrid: + +2021-04-03T00:00:00 +Máxima: 20 +Mínima: 10 + +2021-04-04T00:00:00 +Máxima: 20 +Mínima: 7 + +2021-04-05T00:00:00 +Máxima: 22 +Mínima: 7 + +2021-04-06T00:00:00 +Máxima: 22 +Mínima: 7 + +2021-04-07T00:00:00 +Máxima: 19 +Mínima: 4 + +2021-04-08T00:00:00 +Máxima: 18 +Mínima: 9 + +2021-04-09T00:00:00 +Máxima: 20 +Mínima: 10 +``` From 3d01bcf84dc537f7d4e25a1f655595d5f37b59d5 Mon Sep 17 00:00:00 2001 From: Jose Rivera Date: Sun, 4 Apr 2021 20:55:59 +0100 Subject: [PATCH 8/8] Caso de uso como en la PR #30. --- docs/README.md | 62 +++++++++++++++++++------------------------------- 1 file changed, 24 insertions(+), 38 deletions(-) diff --git a/docs/README.md b/docs/README.md index fdf52ae..61d7063 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,30 +4,16 @@ ### Instalar la librería `python-aemet` -- Tener `python3` instalado en el sistema: `which python` +- Tener `python3` instalado en el sistema: `which python` -- Instalar la librería en el local. Recomendamos el uso de un `virtualenv`. +- Instalar la librería en el local. Recomendamos el uso de un `virtualenv` o un gestor + de entornos como `pyenv`. - E.g. Instala `virtualenv`: + Instala la librería - ```bash - pip install virtualenv - ``` - - Clona el repo `git clone git@github.com:pablo-moreno/python-aemet.git && cd python-aemet` - - Activa el `virtualenv`: - - ```bash - virtualenv .venv - source .venv/bin/activate - ``` - - Instala la librería - - ```bash - pip install . - ``` + ```bash + pip install python-aemet + ``` ### Obtener la clave API @@ -42,39 +28,39 @@ Y ponla en un fichero `aemet.key` ### Predicción de la temperatura máxima y mínima en un municipio concreto en los próximos días ```bash -aemet -p Madrid -f /path/a/la/clave/aemet.key +aemet -p Huelva -f /path/a/la/clave/aemet.key ``` La salida: ```sh -Predicción de temperaturas para Madrid: - -2021-04-03T00:00:00 -Máxima: 20 -Mínima: 10 +Predicción de temperaturas para Huelva: 2021-04-04T00:00:00 -Máxima: 20 -Mínima: 7 +Máxima: 23 +Mínima: 12 2021-04-05T00:00:00 Máxima: 22 -Mínima: 7 +Mínima: 13 2021-04-06T00:00:00 -Máxima: 22 -Mínima: 7 +Máxima: 25 +Mínima: 11 2021-04-07T00:00:00 -Máxima: 19 -Mínima: 4 +Máxima: 25 +Mínima: 13 2021-04-08T00:00:00 -Máxima: 18 -Mínima: 9 +Máxima: 23 +Mínima: 12 2021-04-09T00:00:00 -Máxima: 20 -Mínima: 10 +Máxima: 21 +Mínima: 12 + +2021-04-10T00:00:00 +Máxima: 21 +Mínima: 13 ```