Tutorial

Descarga y analiza datos FRED automáticamente con Python

Automatiza la descarga y análisis de datos económicos de la Reserva Federal (FRED) usando Python. Accede a miles de indicadores económicos, crea visualizaciones y construye pipelines de reportes automatizados.

Los datos FRED se actualizan frecuentemente. Cada vez que quieres actualizar tu análisis, necesitas descargar los datos nuevamente.

Por ejemplo, los datos de Inflación (IPC) se actualizan mensualmente.

Sitio web FRED con IPC

En lugar de descargar el archivo Excel manualmente y hacer clic a través de los menús para reproducir el gráfico, puedes automatizar el proceso usando Python. ¿Cómo?

En este tutorial, te lo explicamos paso a paso.

Preguntas

  1. ¿Cómo identificar indicadores del sitio web FRED?
  2. ¿Cómo usar la API FRED para descargar datos programáticamente?
  3. ¿Cómo construir una tabla a partir de los datos de respuesta de la API?
  4. ¿Cómo exportar datos a un archivo Excel?
  5. ¿Cómo refactorizar el código en una función para evitar repetición?
  6. ¿Cómo descargar múltiples indicadores automáticamente?
  7. ¿Cómo fusionar múltiples tablas en una sola?

Metodología

Documentación de la API FRED

Se recomienda visitar la documentación oficial de la API FRED para entender cómo están organizados los indicadores.

En nuestro caso, utilizaremos el endpoint fred/series/observations para obtener los datos de Inflación (IPC), que es el indicador que viste en el gráfico anterior.

Siguiendo las instrucciones del endpoint, podemos proporcionar tres parámetros:

  1. api_key
  2. series_id
  3. file_type

Además de la URL y el endpoint, que son los siguientes:

URL_BASE = 'https://api.stlouisfed.org/'
ENDPOINT = 'fred/series/observations'
URL = URL_BASE + ENDPOINT

Antes de crear los parámetros en Python, asegúrate de tener una clave API, proporcionada por FRED. Si no la tienes, sigue estas instrucciones para obtener una.

De lo contrario, obtendrás un error porque FRED no permite solicitudes anónimas a la API.

Solicitar datos de la API FRED

Para obtener datos de ubicaciones de internet (URLs), utilizaremos la librería de Python requests.

El siguiente código compone la URL para obtener el IPC basado en el indicador CORESTICKM159SFRBATL:

import requests

API_KEY = 'e11d8a19946314171e03bf7842bbf84a'
INDICATOR = 'CORESTICKM159SFRBATL'

params = {
    'api_key': API_KEY,
    'series_id': INDICATOR,
    'file_type': 'json'
}

res = requests.get(URL, params=params)
data = res.json()
data
Datos JSON devueltos por la API FRED

Construir tabla a partir de los datos de respuesta de la API

Como puedes ver, la respuesta de la API no está representada en formato tabular. Es un objeto JSON. Por lo tanto, necesitamos transformarlo en una tabla para analizarlo.

Las siguientes operaciones se ejecutan en las líneas de código subsecuentes:

  1. La respuesta JSON obtenida se convierte en un DataFrame de la librería pandas.
  2. El DataFrame es luego preprocesado y refinado para tener datos simples y funcionales.
import pandas as pd

df_cpi = (pd
 .DataFrame(data['observations'])
 .drop(columns=['realtime_start', 'realtime_end'])
 .rename(columns={'value': 'CPI'})
 .astype({'date': 'datetime64[ns]'})
 .set_index('date')
 .apply(pd.to_numeric)
 )

df_cpi
DataFrame con IPC

Exportar datos a Excel

Si estás familiarizado con Excel, puedes exportar los datos a un archivo Excel para analizarlos allí.

df_cpi.to_excel('FRED_CPI.xlsx')

Ahora, ¿qué pasa si queremos descargar otro indicador como el MORTGAGE30US?

¿Vamos a repetir el mismo código de nuevo?

¡Por supuesto que no! Podemos crear una función para automatizar el proceso.

Refactorizar el código en una función

Dado que un solo indicador económico podría no ser suficiente para un análisis integral, para mejorar nuestras capacidades de adquisición de datos, deberíamos refactorizar nuestro código en una función.

La siguiente función nos permitirá recuperar cualquier indicador según nuestras necesidades.

import requests

def indicator_data(
    indicator = 'MORTGAGE30US',
    api_key='e11d8a19946314171e03bf7842bbf84a',
    endpoint='fred/series/observations',
    column_name='value'
    ):

    URL_BASE = 'https://api.stlouisfed.org/'
    URL = URL_BASE + endpoint
    
    parameters = {
        'api_key': api_key,
        'series_id': indicator,
        'file_type': 'json'
    }
    
    res = requests.get(URL, params=parameters)
    data = res.json()
    
    df = (pd.DataFrame(data['observations'])
     .drop(columns=['realtime_start', 'realtime_end'])
     .rename(columns={'value': column_name})
     .astype({'date': 'datetime64[ns]'}) 
     .set_index('date')
     .apply(pd.to_numeric)
     )

    df.to_excel(f'FRED_{column_name}.xlsx')

    return df

Obtener múltiples indicadores automáticamente

En lugar de repetir todas las líneas de código anteriores, llamamos a la función para obtener la información de dos indicadores simplemente proporcionando los códigos de los indicadores.

  1. Índice de Precios al Consumidor (IPC): CORESTICKM159SFRBATL
  2. Tasa Hipotecaria: MORTGAGE30US

Además, fusionamos los conjuntos de datos basándose en el índice de fecha y hora de ambos DataFrames para mostrarlos en una sola tabla.

df_inflation = indicator_data(indicator='CORESTICKM159SFRBATL', column_name='CPI')
df_mortgage = indicator_data(indicator='MORTGAGE30US', column_name='MR30US')

df = pd.merge(
    left=df_inflation, right=df_mortgage,
    left_index=True, right_index=True, how='outer')

df
DataFrame con dos indicadores FRED

Hay presencia de datos faltantes NaN porque la información de los indicadores no se recupera en el mismo período: CPI es mensual, mientras que MR es semanal.

Este problema hace que nuestros datos no sean aptos para el análisis. Por ejemplo, si tratamos de crear un gráfico, no vemos la mayoría de los datos CPI:

df.plot(color='variable')
Graficando CPI crudo y MR30US

Conclusiones

En lugar de descargar los datos FRED a un archivo Excel manualmente y hacer clic a través de los menús para reproducir el gráfico, ahora sabes cómo automatizar el proceso usando Python.

En este tutorial, has aprendido cómo:

  1. Identificar indicadores del sitio web FRED.
  2. Usar la API FRED para descargar datos programáticamente.
  3. Construir una tabla a partir de los datos de respuesta de la API.
  4. Exportar los datos a un archivo Excel.
  5. Refactorizar el código en una función para evitar la repetición de código.

Aún así, hay un problema con los indicadores que no tienen la misma frecuencia.

En el próximo post, te mostraremos cómo interpolar para llenar los datos faltantes con valores razonables.

Antes, exportemos los datos a un archivo Excel para cargarlos en el siguiente tutorial.

df.to_excel('FRED_CPI-MR30US.xlsx')