<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Cargando datos con API-REST
¿Qué es API-REST?
API es la Application Programming Interface, es decir nuestra forma de interactuar con una aplicación. REST quiere decir REpresentational State Transfer. Normalmente cuando hablamos de REST, estamos hablando de una interfaz para obtener datos usando directamente HTTP, es decir es un tipo de web API. 
De manera sencilla podemos decir que es una Interfaz con la que se interactúa mediante URLs normalmente para obtener datos.
La principal diferencia entre esto y una URL común, es que la URL de una página web devolverá algo que tu navegador puede interpretar y mostrar de forma "bonita", mientras que una API web mandará datos o instrucciones útiles para ti o tu ordenador.
Step2:  Veamos la respuesta a una página web clásica
Veamos la respuesta de una web api
En definitiva, cuando utilizamos una WEB API, están involucrados
Step3:  Debemos saber cuál es la url a la que vamos a hacer la petición
Step4:  Por último, lanzamos la petición
Step5:  Comprobando la respuesta
Step6:  Vemos que hemos obtenido una respuesta con código 200, esto quiere decir, en el código habitual de las API-REST, que todo ha ido bien. De hecho, es conveniente ver que todo ha ido bien antes de hacer nada más
Step7:  Otra información que podemos obtener es, por ejemplo;
Step8:  Pero... ¿dónde están nuestros datos?
¡Parece que esto es un json!
Efectivamente, la mayoría de las WEB APIs devuelven json o xml. Pero, otra vez... ¿dónde están nuestros datos?
En definitiva, podríamos reagrupar todo lo anterior como
<ASSISTANT_TASK:>
Python Code:
# preserve
from IPython.display import HTML
Explanation: Cargando datos con API-REST
¿Qué es API-REST?
API es la Application Programming Interface, es decir nuestra forma de interactuar con una aplicación. REST quiere decir REpresentational State Transfer. Normalmente cuando hablamos de REST, estamos hablando de una interfaz para obtener datos usando directamente HTTP, es decir es un tipo de web API. 
De manera sencilla podemos decir que es una Interfaz con la que se interactúa mediante URLs normalmente para obtener datos.
La principal diferencia entre esto y una URL común, es que la URL de una página web devolverá algo que tu navegador puede interpretar y mostrar de forma "bonita", mientras que una API web mandará datos o instrucciones útiles para ti o tu ordenador.
End of explanation
# preserve
def load_api_key(file):
    Returns the contents in the file without the final line break
    
    with open(file, 'r') as f:
        api_key = f.read().rstrip()
    return api_key
# cargamos la api_key
Explanation: Veamos la respuesta a una página web clásica
Veamos la respuesta de una web api
En definitiva, cuando utilizamos una WEB API, están involucrados:
Cliente: realiza la petición a través de la url
Servidor: da una respuesta a la url recibida
Protocolo: se establece en la especificación de la API
¿Cómo utilizar una API?
El uso de WEB APIs permite: obtener información que sería cosotsa de obtener y procesar de otra manera (incluso en tiempo real).
En algunas ocasiones, la API es pública y cualquiera puede hacer una petición, pero en otras es necesario tener una api key que nos identifica. Por lo tanto, el proceso para obtener datos suele ser:
Comprobar si existe una API-REST para obtener dichos datos
Obtener una api key en caso de que sea necesaria
Leer la especificación de la API para saber cómo componer la URL y como interpretar la respuesta
Utilizar la API, en nuestro caso desde Python.
Ejemplo: descargando datos de AEMET
Esta es la página principal de su API:
https://opendata.aemet.es/centrodedescargas/inicio
Aquí podemos encontrar: información general, el lugar donde obtener nuestra API key, una interfaz para acceder a los datos para público general 
Módulo requests
Aunque existen otras formas y librería para trabajar con HTTP en Python, el módulo requests está específicamente pensado para trabajar con APIs web.
Como siempre hasta ahora, lo primero es importarlo:
Necesitaremos cargar nuesta API key, lo más cómodo es almacenarla en un fichero y cargarla desde ahí. Creemos una función para leerla:
End of explanation
# Fijamos la url y los parámetros
# Predicción costera de Asturias, Cantabria y País Vasco debemos introducir
# https://opendata.aemet.es/opendata/api/prediccion/maritima/costera/costa/41
Explanation: Debemos saber cuál es la url a la que vamos a hacer la petición:
End of explanation
# Lanzamos la request
Explanation: Por último, lanzamos la petición:
End of explanation
# Vemos la respuesta
Explanation: Comprobando la respuesta:
End of explanation
# código de estado
Explanation: Vemos que hemos obtenido una respuesta con código 200, esto quiere decir, en el código habitual de las API-REST, que todo ha ido bien. De hecho, es conveniente ver que todo ha ido bien antes de hacer nada más:
End of explanation
# preserve
# Tiempo en procesar la petición
print("Elapsed: ", response.elapsed)
# Información del servidor
print("Headers: ", response.headers)
Explanation: Otra información que podemos obtener es, por ejemplo;
End of explanation
# preserve
from warnings import warn
def get_prediction_for_cantabria(api_key):
    url = "https://opendata.aemet.es/opendata/api/prediccion/maritima/costera/costa/41"
    querystring = {"api_key": api_key}
    
    response = requests.get(url, params=querystring, verify=False)
    
    prediction = None
     
    if response.status_code == requests.codes.ok:
        r_data = requests.get(content['datos'], verify=False)
        if r_data.status_code == requests.codes.ok:
            data = r_data.json()
            prediction = data[0]['prediccion']
    
    elif response.status_code == requests.codes.TOO_MANY_REQUESTS:
        warn('Too many requests')
        
    elif response.status.code == requests.codes.NOT_FOUND:
        warn('No data for the response')
        
    else:
        warn('Code error {}'.format(response.status_code))
            
    return prediction
        
Explanation: Pero... ¿dónde están nuestros datos?
¡Parece que esto es un json!
Efectivamente, la mayoría de las WEB APIs devuelven json o xml. Pero, otra vez... ¿dónde están nuestros datos?
En definitiva, podríamos reagrupar todo lo anterior como:
End of explanation
<END_TASK>