Demo: Usando la clase ServicioWeb del paquete bccr

Demo: Usando la clase ServicioWeb del paquete bccr

Randall Romero Aguilar

Esta actualización: 21 de diciembre de 2019.


Este cuaderno de Jupyter ilustra el uso del paquete de Python bccr, con el cual se facilita la descarga de datos del servicio Web del Banco Central de Costa Rica.

Primero cargamos algunos paquetes: bccr para consultar datos del servicio web, pandas para manipular los datos en Python, numpy para calcular un promedio (más adelante), matplotlib para hacer gráficos.

In [1]:
import bccr
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('seaborn')
%matplotlib inline

1. Iniciando una consulta

Para utilizar este paquete, es necesario inscribirse en la página de servicio web del BCCR en https://www.bccr.fi.cr/seccion-indicadores-economicos/servicio-web/

portal-servicio-web

Una vez llenado el formulario, recibirá un token de parte del BCCR en el correo suministrado. Este paso solo debe realizarse una única vez.

Una vez obtenido el token, se crea un objeto (acá llamado consulta) de la clase ServicioWeb, donde se pasa por argumentos las credenciales del usuario.

In [2]:
consulta = bccr.ServicioWeb('Nombre', 'correo.electronico@servicio.com', 'TOKEN_BCCR')

2. Buscando una serie

Para importar una serie del servicio web, es necesario saber su código. Este código es el mismo que se ingresaría en el formulario disponible en la página del BCCR

formulario

En este enlace el Banco comparte los código de las variables: https://gee.bccr.fi.cr/Indicadores/Suscripciones/UI/ConsultaIndicadores/ObtenerArchivo

Para facilitar encontrar las series, la clase bccr.ServicioWeb provee la función buscar. Acá, por ejemplo, buscamos la frase 'medio circulante':

In [3]:
consulta.buscar(frase='medio circulante')
Out[3]:
DESCRIPCION descripcion Unidad Medida periodo
codigo
1445 Node(‘/BCCR/Sector Monetario y Financiero/Medio circulante sistema bancario nacional [1445]’) Medio circulante Colón Costarricense Millones Mensual
1479 Node(‘/BCCR/Sector Monetario y Financiero/Medio circulante sistema financiero nacional [1479]’) Medio circulante Colón Costarricense Millones Mensual
2936 Node(‘/BCCR/Sector Monetario y Financiero/Medio circulante sistema financiero nacional [1479]/Otros activos netos [2… Otros activos netos Colón Costarricense Millones Mensual

El resultado nos indica que los códigos 1445,1479 y 2936 corresponden a series que incluyen la frase exacta “medio circulante” en su descripción. Si no sabemos la frase exacta pero sí varias palabras que deben aparecer en la descripción (en cualquier orden), usamos buscar con la opción todos

In [4]:
consulta.buscar(todos='numerario poder público')
Out[4]:
DESCRIPCION descripcion Unidad Medida periodo
codigo
1365 Node(‘/BCCR/Sector Monetario y Financiero/Numerario en poder del público [1365]’) ND Colón Costarricense Millones Mensual
1489 Node(‘/BCCR/Sector Monetario y Financiero/Numerario en poder del sistema financiero [1489]’) Numerario en Poder del Público Colón Costarricense Millones Mensual

También tenemos la opción de buscar series donde solo algunos de los términos aparecen en la descrición. Podemos además filtrar los resultados por la frecuencia de los datos (A anual, 6M semestral, Q trimestral, M mensual, W semanal, y Ddiaria.

In [5]:
consulta.buscar(algunos='japón yen', frecuencia='D')
Out[5]:
DESCRIPCION descripcion Unidad Medida periodo
codigo
325 Node(‘/BCCR/Tipos de cambio/Yen Japonés [325]’) Yen japonés Yen Japonés NO DEFINIDO Diaria
41454 Node(‘/BCCR/Tipos de cambio/Japón (yen) [41454]’) Japón (yen) Nivel Unidades Diaria

3. Descargando datos

3.1 Descargando una serie

Supongamos que queremos descargar datos del medio circulante (sistema bancario nacional). Arriba encontramos que su código es el 1445. Para ello usamos la función datos:

In [6]:
M1 = consulta.datos(1445).rename(columns={'1445':'M1'})
M1.plot()
Out[6]:
<matplotlib.axes._subplots.AxesSubplot at 0x1c4186590c8>

En la celda anterior, la parte .rename(columns={'1445':'M1'}) es opcional, la utilizamos acá para cambiar el nombre de la serie. Observe que si bien podemos buscar la serie por código con un entero 1445 o un texto '1445', el resultado siempre dará el nombre de la variable como texto; por ello para renombrarla con .rename() es necesario usar un texto.

3.2 Descargando dos series de la misma frecuencia

Es posible además pasarle varios códigos a datos de una vez, ya sea en una lista [1365,1445] o tupla (1365, 1445) o bien las llaves de un diccionario (como se ilustra en la siguiente celda). Acá descargamos, además del medio circulante, en numerario en poder del público. El resultado será una tabla pandas.DataFrame, donde cada columna corresponde a una variable.

In [7]:
series = {'1365':'NPP', '1445':'M1'}
dinero = consulta.datos(series.keys()).rename(columns=series)
dinero.plot()
Out[7]:
<matplotlib.axes._subplots.AxesSubplot at 0x1c419f3d308>

3.3 Descargando varias series de distinta frecuencia

La función datos permite descargar variables de distinta frecuencia, convirtiéndolos a una frecuencia común. Por ejemplo, suponga que desea, además de los datos anteriores, la serie de la tasa básica pasiva:

In [8]:
consulta.buscar(frase='tasa básica pasiva calculada')
Out[8]:
DESCRIPCION descripcion Unidad Medida periodo
codigo
423 Node(‘/BCCR/Tasas de interés/Tasa básica pasiva calculada por el BCCR [423]’) Tasa Básica pasiva bruta calculada por el Banco Central. Porcentaje NO DEFINIDO Diaria
430 Node(‘/BCCR/Tasas de interés/Tasa básica pasiva calculada por el BCCR [430]’) Tasa basica pasiva bruta a fin de cada mes calculada por el Banco Central de Costa Rica. Porcentaje NO DEFINIDO Mensual
19654 Node(‘/BCCR/Tasas de interés/Tasa básica pasiva calculada por el BCCR [19654]’) Tasa Básica pasiva bruta calculada por el Banco Central. Porcentaje NO DEFINIDO Nueva semanal

Vemos que el código 423 es de una serie diaria, mientras que los datos de M1y NPP eran mensuales. En la siguiente celda, le indicamos a datos que debe convertir los datos de mayor a menor frecuencia usando un promedio (func=np.mean). Es posible además restringir el rango de los datos con los parámetros FechaInicio= y FechaFinal=.

In [9]:
series = {'1365':'NPP', '1445':'M1', '423':'Tasa básica'}
datos = consulta(series.keys(), FechaInicio=2015, func=np.mean).rename(columns=series)
datos.plot(subplots=True, figsize=[12,6]);
In [10]:
datos.tail()
Out[10]:
variable NPP M1 Tasa básica
2019-08 772528.602067 3.112189e+06 5.804839
2019-09 775677.647724 3.234048e+06 5.720000
2019-10 786508.920312 3.140635e+06 5.630645
2019-11 801081.163185 3.425608e+06 5.591667
2019-12 NaN NaN 5.586364

La frecuencia de los datos puede controlarse con el parámetro freq=. Si no se indica, se obtienen los datos de menor frecuencia. Es posible además indicar distintos métodos de conversión para func=, pasando un diccionario de la forma {código1: función1, código2: función2, ,...}.

4. Buscar información

4.1 Buscar información de una variable

Suponga que deseamos una variable que muestre todos estos términos

In [11]:
consulta.buscar(todos='exportaciones importaciones encadenado original')
Out[11]:
DESCRIPCION descripcion Unidad Medida periodo
codigo
33471 Node(‘/BCCR/Sector Real/PIB y gasto, volumen encadenado, serie original [33438]/IMPORTACIONES DE BIENES Y SERVICIOS … EXPORTACIONES DE BIENES Y SERVICIOS (P6) Colón Costarricense Constantes Millones Trimestral
33472 Node(‘/BCCR/Sector Real/PIB y gasto, volumen encadenado, serie original [33439]/IMPORTACIONES DE BIENES Y SERVICIOS … EXPORTACIONES DE BIENES Y SERVICIOS (P6) Porcentaje Variación Interanual Millones Trimestral

El resultado obtenido nos deja una duda, porque en DESCRIPCION indica que se trata de importaciones pero en descripcion menciona exportaciones. Para obtener más información de quien es una variable:

In [12]:
consulta.quien(33472)
Variable 33472 >>>
   Nombre      : IMPORTACIONES DE BIENES Y SERVICIOS (P7).
   Descripcion : EXPORTACIONES DE BIENES Y SERVICIOS (P6).
   Unidad      : Porcentaje Variación Interanual (Millones).
   Periodicidad: Trimestral.

|--- Sector Real
|------ PIB y gasto, volumen encadenado, serie original [33439]
|--------- IMPORTACIONES DE BIENES Y SERVICIOS (P7) [33472]'


Lo anterior nos indica que la variable 33472 está ligada a la 33439. Para ver todas las sub-variables de 33439, usamos la función subcuentas:

In [13]:
consulta.subcuentas(33439);
PIB y gasto, volumen encadenado, serie original [33439]
├── DEMANDA INTERNA [33442]
│   ├── Gasto de consumo final (P3/P4) [33445]
│   │   ├── Gasto de consumo final de los hogares e ISFLSH [33448]
│   │   └── Gasto de consumo final del Gobierno General [33451]
│   └── Formación bruta de capital fijo [33454]
│       └── Formación bruta de capital fijo (P51g) [33457]
├── EXPORTACIONES DE BIENES Y SERVICIOS (P6) [33463]
│   ├── Exportaciones de bienes f.o.b. (P61) [33466]
│   └── Exportaciones de servicios (P62) [33469]
└── IMPORTACIONES DE BIENES Y SERVICIOS (P7) [33472]
    ├── Importaciones de bienes f.o.b. (P71) [33475]
    └── Importaciones de servicios (P72) [33478]

Lo anterior nos permite deducir que en realidad 33472 se trata de datos de importaciones.

4.2 Buscar series relacionadas

El ejemplo anterior ilustró el uso de subcuentas para encontrar series relacionadas.

In [14]:
consulta.buscar(todos='Producto Interno Bruto volumen encadenado original', frecuencia='Q')
Out[14]:
DESCRIPCION descripcion Unidad Medida periodo
codigo
33438 Node(‘/BCCR/Sector Real/PIB y gasto, volumen encadenado, serie original [33438]’) Producto interno bruto a precios de mercado Colón Costarricense Constantes Millones Trimestral
33439 Node(‘/BCCR/Sector Real/PIB y gasto, volumen encadenado, serie original [33439]’) Producto interno bruto a precios de mercado Porcentaje Variación Interanual Millones Trimestral

En este caso concreto, nos interesa conocer componentes del PIb en colones (en vez de su variación interanual). Las subcuentas de 33438 nos ayuda a encontrar los códigos relevantes, a partir de lo cual podemos hacer un diccionario de las variables de interés:

In [15]:
consulta.quien(33438)
Variable 33438 >>>
   Nombre      : PIB y gasto, volumen encadenado, serie original.
   Descripcion : Producto interno bruto a precios de mercado.
   Unidad      : Colón Costarricense Constantes (Millones).
   Periodicidad: Trimestral.

|--- Sector Real
|------ PIB y gasto, volumen encadenado, serie original [33438]'


In [16]:
ctas = consulta.subcuentas(33438)
PIB y gasto, volumen encadenado, serie original [33438]
├── DEMANDA INTERNA [33441]
│   ├── Gasto de consumo final (P3/P4) [33444]
│   │   ├── Gasto de consumo final de los hogares e ISFLSH [33447]
│   │   └── Gasto de consumo final del Gobierno General [33450]
│   └── Formación bruta de capital fijo [33453]
│       └── Formación bruta de capital fijo (P51g) [33456]
├── EXPORTACIONES DE BIENES Y SERVICIOS (P6) [33462]
│   ├── Exportaciones de bienes f.o.b. (P61) [33465]
│   └── Exportaciones de servicios (P62) [33468]
└── IMPORTACIONES DE BIENES Y SERVICIOS (P7) [33471]
    ├── Importaciones de bienes f.o.b. (P71) [33474]
    └── Importaciones de servicios (P72) [33477]
In [17]:
series = {'33438':'PIB',
         '33441':'Demanda Interna',
         '33444':'Gasto',
         '33447': 'C',
         '33450':'G',
         '33453':'FBKF',
         '33456': 'I',
         '33462': 'X', '33465':'Xb', '33468':'Xs',
         '33471': 'M', '33474':'Mb', '33477':'Ms',
         }
In [18]:
cuentas_nacionales = consulta.datos(ctas).rename(columns=series)
No se obtuvieron datos de indicador 33441. Servidor respondio con mensaje  OK

No se obtuvieron datos de indicador 33444. Servidor respondio con mensaje  OK

No se obtuvieron datos de indicador 33453. Servidor respondio con mensaje  OK

No se obtuvieron datos de indicador 33462. Servidor respondio con mensaje  OK

No se obtuvieron datos de indicador 33471. Servidor respondio con mensaje  OK

Al parecer, el servicio web no proporciona directamente los datos para las variables sub-totales. Los demás datos los graficamos a continuación:

In [19]:
cuentas_nacionales.plot(figsize=[12,5])
Out[19]:
<matplotlib.axes._subplots.AxesSubplot at 0x1c41a1e7ac8>

5. Exportando datos

Finalmente, podemos exportar los datos de pandas a otros formatos; aquí se muestran los comandos para obtener archivos CSV (to_csv), Excel (to_excel) y Latex (to_latex):

In [20]:
cuentas_nacionales.to_csv('cuentas.csv')
cuentas_nacionales.to_excel('cuentas.xlsx')
cuentas_nacionales.to_latex('cuentas.tex')

También podemos exportarlos a Stata (to_stata), aunque primero es necesario hacer un par de ajustes (indexar los datos por fechas en vez de períodos y quitar espacios y usar solo caracteres ASCII en los nombres de las columnas)

In [21]:
cuentas_nacionales.index = cuentas_nacionales.index.to_timestamp()
cuentas_nacionales.to_stata('cuentas.dta')

Advertencia

Este paquete ha sido desarrollado por Randall Romero Aguilar, y se ha compartido para facilitar la obtención de datos del BCCR a quien así lo necesite.
NO es un paquete oficial del Banco Central de Costa Rica, ni cuenta con aprobación o patrocinio del BCCR.

El paquete se ofrece gratuitamente pero SIN NINGUNA GARANTIA acerca de su correcto funcionamiento.Aunque he puesto el mayor esfuerzo en que este paquete funcione correctamente, algunos errores pueden persistir. Si encuentra alguno, o bien si tiene sugerencias acerca de futuras mejoras, por favor envíeme un correo a randall.romero@outlook.com.

© Randall Romero Aguilar, 2015-2019