Demo: Usando la clase ServicioWeb del paquete bccr

Demo: Usando la clase ServicioWeb del paquete bccr

Randall Romero Aguilar

Primera versión: 21 de diciembre de 2019

Esta actualización: 8 de abril de 2020.


 

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 opcional 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()
o bien, utilizando sus propias credenciales,
 
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 llamamos el objeto directamente:

In [6]:
# M1 = consulta(1445) # más rápido, si no se desea cambiar el nombre de la serie
M1 = consulta({'1445':'M1'})  # pasando un diccionario para renombrar las series
M1.plot();
Out[6]:
 
 

En la celda anterior, pasar el indicador como diccionario {'1445':'M1'} es opcional, lo hacemos 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.

 

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(series)
dinero.plot();
Out[7]:<matplotlib.axes._subplots.AxesSubplot at 0x1c419f3d308>
 
 

3.3 Descargando varias series de distinta frecuencia

El objeto consulta permite también 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 consulta 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, FechaInicio=2015, func=np.mean)
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')

6. Obteniendo ayuda

 

Para terminar, en caso de que olvidemos cómo utilizar un objeto de la clase ServicioWeb, basta con visualizarlo para obtener un pequeño resumen de este tutorial :

In [22]:
consulta
 
CLASE ServicioWeb

Esta clase permite buscar y descargar datos de indicadores del servicio web del Banco Central de Costa Rica.
Suponiendo que el objeto de clase ServicioWeb se llama "consulta":
    * para buscar indicadores, utilice 
        *consulta.buscar()
    * para saber más detalles del indicador 8 (por ejemplo)
        * consulta.quien(8)
    * para buscar las subcuentas de un indicador, digamos el 784
        * consulta.subcuentas(784)      
    * para descargar datos de indicadors 4, 7 y 231 (por ejemplo), hay varias formas de hacerlo 
        * consulta(4, 7, 231)   # pasando los códigos directamente
        * consulta([4, 7, 231]) # pasando los códigos en una lista
        * consulta({'4':'indicA', '7':'indicB', '231':'indicC'} # pasando los códigos en un diccionario, en 
        cuyo caso los indicadores son renombrados como 'indicA', 'indicB' y 'indicC', respectivamente.
 

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-2020