Este API REST remplaza la funcionalidad del servicio SOAP "DgieWS" ubicado en: http://www.banxico.org.mx/DgieWSWeb/DgieWS?WSDL Series de tiempo

El uso de esta API para la consulta de series de tiempo es muy sencillo. A continuación se muestran algunos ejemplos de cómo se puede acceder a la información publicada en el SIE.

Cabe mencionar que es muy recomendable que las aplicaciones que utilicen este servicio descarguen la información y la almacenen en un cache, con el fin de evitar que el token de consulta pueda ser bloqueado.

Ver límites de consultas




Consulta de series de tiempo con JavaScript


En este ejemplo se pretende realizar una consulta del dato oportuno de 4 series (SP74665, SF61745, SF60634, SF43773). Previamente se debieron de haber obtenido estos identificadores del catálogo de series. También es necesario contar con un token de consulta para poder tener acceso al API. En los ejemplos se utiliza un token únicamente para fines ilustrativos, el cual no es válido para realizar consultas.

Obtener token

Consideraciones iniciales, se va a realizar una consulta con JavaScript hacia un sitio externo por lo cual se utilizará JSONP (el API cuenta con soporte para este formato). Se utilizará jQuery para realizar la consulta.

La URL para consultar el último dato publicado (oportuno) es la siguiente:


https://www.banxico.org.mx/SieAPIRest/service/v1/series/:idSerie/datos/oportuno


Se coloca en la URL los identificadores de series a consultar (máximo 20):


https://www.banxico.org.mx/SieAPIRest/service/v1/series/SP74665,SF61745,SF60634,SF43773/datos/oportuno


Utilizando jQuery se hace una petición GET a la URL anterior:


$.ajax({
	url : "https://www.banxico.org.mx/SieAPIRest/service/v1/series/SP74665,SF61745,SF60634,SF43773/datos/oportuno?token=6e3bd0938be9fff6e4f4811b7b413d111f96a8c9a0ae60abef4029b681e9b8a9",
	jsonp : "callback",
	dataType : "jsonp", //Se utiliza JSONP para realizar la consulta cross-site
	success : function(response) {  //Handler de la respuesta
		var series=response.bmx.series;
		
		//Se carga una tabla con los registros obtenidos
		for (var i in series) {
			  var serie=series[i];
			  var reg=""+serie.titulo+""+serie.datos[0].fecha+""+serie.datos[0].dato+""
			  $("#result").append(reg);
		}
	}
});


La URL devuelve la información en JSONP y jQuery se encarga de transformar la respuesta en objetos JavaScript. Con estos objetos se construye una tabla parecida a esta:


Valores gubernamentales, Resultados de la subasta semanal Cetes a 91 días - Tasa de rendimiento - Fecha subasta19/07/20164.3800
Tasa de fondeo bancario Promedio ponderado Tasa de interés en por ciento anual15/07/20153.05
Tasa objetivo15/07/20153.0000
Inflación No subyacente (nueva definición) Anual01/06/20154.6300


Ejemplo completo

<!DOCTYPE html>
<html>
<head>
<style>
	td {
		background-color: #E8E8E8;
		padding: 5px;
	}
	table { 
    	border-spacing: 5px;
    	border-collapse: separate;
	}
</style>
<script
	src='https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js'></script>
<script>
$(function(){
	$.ajax({
		url : 'https://www.banxico.org.mx/SieAPIRest/service/v1/series/SP74665,SF61745,SF60634,SF43773/datos/oportuno?token=6e3bd0938be9fff6e4f4811b7b413d111f96a8c9a0ae60abef4029b681e9b8a9',
		jsonp : 'callback',
		dataType : 'jsonp', //Se utiliza JSONP para realizar la consulta cross-site
		success : function(response) {  //Handler de la respuesta
			var series=response.bmx.series;
			
			//Se carga una tabla con los registros obtenidos
			for (var i in series) {
				  var serie=series[i];
				  var reg='<tr><td>'+serie.titulo+'</td><td>'+serie.datos[0].fecha+'</td><td>'+serie.datos[0].dato+'</td></tr>'
				  $('#result').append(reg);
			}
		}
	});
});
</script>
</head>
<body>
<table id='result'>
</table>
</body>
</html>


Consulta de serie de Cetes utilizando java.net.URL y Jackson


En este ejemplo se realizará la consulta de los datos de la serie de tiempo de Cetes a 28 días, para el periodo correspondiente al mes de Mayo de 2011. El API permite consultar todos los datos históricos de hasta veinte series, pudiendo limitar esta consulta a un rango específico de fechas.

Para poder realizar la consulta, es necesario contar con un token de consulta, en el código presentado se utiliza un token de ejemplo que no es válido para realizar consultas, se debe usar el propio.

Como primer paso se debe obtener el identificador de serie, ya sea del SIE o del catálogo de series. Para el caso de Cetes a 28 días, el identificador es el SF43936.


La URL para consultar un periodo de datos de una serie es:

https://www.banxico.org.mx/SieAPIRest/service/v1/series/:idSerie/datos/:fechaI/:fechaF


Se coloca en la URL los identificadores de series a consultar (máximo 20) y las fechas del periodo de datos a consultar (en este caso Mayo de 2011):

https://www.banxico.org.mx/SieAPIRest/service/v1/series/SF43936/datos/2011-05-01/2011-05-31

Es requerido que la fecha esté en el formato yyyy-MM-dd.

A continuación se definen las clases que corresponderán a la estructura JSON devuelta por el servicio:


Serie.java
import java.util.List;

public class Serie {
	private String idSerie;
	
	private String titulo;
	
	private List<DataSerie>datos;

	public String getIdSerie() {
		return idSerie;
	}

	public void setIdSerie(String idSerie) {
		this.idSerie = idSerie;
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public List<DataSerie> getDatos() {
		return datos;
	}

	public void setDatos(List<DataSerie> datos) {
		this.datos = datos;
	}
	
}
DataSerie.java
public class DataSerie {

	private String fecha;
	
	private String dato;

	public String getFecha() {
		return fecha;
	}


	public void setFecha(String fecha) {
		this.fecha = fecha;
	}

	public String getDato() {
		return dato;
	}


	public void setDato(String dato) {
		this.dato = dato;
	}
	
}
SeriesResponse.java
import java.util.List;

public class SeriesResponse {

	private List<Serie>series;

	public List<Serie> getSeries() {
		return series;
	}

	public void setSeries(List<Serie> series) {
		this.series = series;
	}
	
}
Response.java
public class Response {
	private SeriesResponse bmx;

	public SeriesResponse getBmx() {
		return bmx;
	}

	public void setBmx(SeriesResponse bmx) {
		this.bmx = bmx;
	}

}

Con estas clases se podrá realizar un mapeo entre la cadena JSON devuelta por el API y objetos de Java. Para llevar acabo esto se utiliza la biblioteca Jackson. La dependencia de Maven es la siguiente:


<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.8.5</version>
</dependency>

Ahora se define el código que realiza la petición al API:


//La URL a consultar con los parametros de idSerie y fechas
URL url = new URL("https://www.banxico.org.mx/SieAPIRest/service/v1/series/SF43936/datos/2011-05-01/2011-05-31");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//Se realiza una petición GET
conn.setRequestMethod("GET");
//Se solicita que la respuesta esté en formato JSON
conn.setRequestProperty("Content-Type", "application/json");
//Se envía el header Bmx-Token con el token de consulta
//Modificar por el token de consulta propio
conn.setRequestProperty("Bmx-Token", "6e3bd0938be9fff6e4f4811b7b413d111f96a8c9a0ae60abef4029b681e9b8a9");

//En caso de ser exitosa la petición se devuelve un estatus HTTP 200
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
	throw new RuntimeException("HTTP error code : "+ conn.getResponseCode());
}

De esta forma se obtiene el JSON de la respuesta en una cadena. Esta cadena puede ser mapeada a objetos Java de la siguiente forma:


//Se utiliza Jackson para mapear el JSON a objetos Java
		ObjectMapper mapper = new ObjectMapper();
		Response response=mapper.readValue(conn.getInputStream(), Response.class);

Teniendo la estructura de la respuesta en objetos Java se puede proceder a presentar los datos de la serie buscada o almacenarlos en un cache, o cualquier otro procesamiento que requiera el cliente.


El ejemplo completo


import java.net.HttpURLConnection;
import java.net.URL;

import org.codehaus.jackson.map.ObjectMapper;

public class Series {

	public static Response readSeries() throws Exception {

		//La URL a consultar con los parametros de idSerie y fechas 
		URL url = new URL("https://www.banxico.org.mx/SieAPIRest/service/v1/series/SF43936/datos/2011-05-01/2011-05-31");
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		//Se realiza una petición GET
		conn.setRequestMethod("GET");
		//Se solicita que la respuesta esté en formato JSON
		conn.setRequestProperty("Content-Type", "application/json");
		//Se envía el header Bmx-Token con el token de consulta
		//Modificar por el token de consulta propio
		conn.setRequestProperty("Bmx-Token", "d1c08da5f04ff3b275890ecef52faed53f8020b997c575a1ca7705af28704e39");

		//En caso de ser exitosa la petición se devuelve un estatus HTTP 200
		if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
			throw new RuntimeException("HTTP error code : "+ conn.getResponseCode());
		}

		//Se utiliza Jackson para mapear el JSON a objetos Java
		ObjectMapper mapper = new ObjectMapper();
		Response response=mapper.readValue(conn.getInputStream(), Response.class);

		conn.disconnect();

		return response;

	}

	public static void main(String[] args) {
		try {
			Response response=readSeries();
			Serie serie=response.getBmx().getSeries().get(0);
			System.out.println("Serie: "+serie.getTitulo());
			for(DataSerie data:serie.getDatos()){
				//Se omiten las observaciones sin dato (N/E)
				if(data.getDato().equals("N/E")) continue;
				System.out.println("Fecha: "+data.getFecha());
				System.out.println("Dato: "+data.getDato());
			}
			
		} catch(Exception e) {
			System.out.println("ERROR: "+e.getMessage());
		}
	}

}

Salida del programa:


Serie: Valores gubernamentales Resultados de la subasta semanal Tasa de rendimiento Cetes a 28 días
Fecha: 05/05/2011
Dato: 4.24
Fecha: 12/05/2011
Dato: 4.27
Fecha: 19/05/2011
Dato: 4.34
Fecha: 26/05/2011
Dato: 4.39

Consulta de la Tasa objetivo utilizando C#


En este ejemplo se realizará la consulta de un dato histórico específico de la serie de tiempo de la tasa objetivo, para el 6 de Agosto de 2011. El API permite consultar todos los datos históricos de hasta veinte series, pudiendo limitar esta consulta a un sólo día.

Para poder realizar la consulta, es necesario contar con un token de consulta, en el código presentado se utiliza un token de ejemplo que no es válido para realizar consultas, se debe usar el propio.

Como primer paso se debe obtener el identificador de serie, ya sea del SIE o del catálogo de series. Para el caso de la tasa objetivo, el identificador es el SF61745.


La URL para consultar un periodo de datos de una serie es:

https://www.banxico.org.mx/SieAPIRest/service/v1/series/:idSerie/datos/:fechaI/:fechaF


Se coloca en la URL los identificadores de series a consultar (máximo 20) y la fecha histórica a consultar (en este caso 6 de Agosto de 2011):

https://www.banxico.org.mx/SieAPIRest/service/v1/series/SF61745/datos/2011-08-06/2011-08-06

Es requerido que la fecha esté en el formato yyyy-MM-dd.

A continuación se define las clases que corresponderán al contrato de datos:


using System.Runtime.Serialization;

namespace EjemploClienteRest
{
    [DataContract]
    class Serie
    {
        [DataMember(Name = "titulo")]
        public string Title { get; set; }

        [DataMember(Name = "idSerie")]
        public string IdSerie { get; set; }

        [DataMember(Name = "datos")]
        public DataSerie[] Data { get; set; }

    }

    [DataContract]
    class DataSerie
    {
        [DataMember(Name = "fecha")]
        public string Date { get; set; }

        [DataMember(Name = "dato")]
        public string Data { get; set; }
    }

    [DataContract]
    class SeriesResponse
    {
        [DataMember(Name = "series")]
        public Serie[] series { get; set; }
    }

    [DataContract]
    class Response
    {
        [DataMember(Name = "bmx")]
        public SeriesResponse seriesResponse { get; set; }
    }
}

Con estas clases se podrá realizar un mapeo de la cadena JSON devuelta por el API.


Ahora se define el código que realiza la petición al API:


string url = "https://www.banxico.org.mx/SieAPIRest/service/v1/series/SF61745/datos/2011-08-06/2011-08-06";
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Accept = "application/json";
request.Headers["Bmx-Token"] = "d1c08da5f04ff3b275890ecef52faed53f8020b997c575a1ca7705af28704e39";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;

De esta forma se obtiene el JSON de la respuesta en una cadena. Esta cadena puede ser mapeada a objetos de la siguiente forma:


DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Response));
object objResponse = jsonSerializer.ReadObject(response.GetResponseStream());
Response jsonResponse = objResponse as Response;

Teniendo la estructura de la respuesta en objetos se puede proceder a presentar los datos de la serie buscada o almacenarlos en un cache, o cualquier otro procesamiento que requiera el cliente.


El ejemplo completo


using System;
using System.Net;
using System.Runtime.Serialization.Json;

namespace EjemploClienteRest
{
    class Program
    {
        public static Response ReadSerie()
        {
            try
            {
                string url = "https://www.banxico.org.mx/SieAPIRest/service/v1/series/SF61745/datos/2011-08-06/2011-08-06";
                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                request.Accept = "application/json";
                request.Headers["Bmx-Token"] = "d1c08da5f04ff3b275890ecef52faed53f8020b997c575a1ca7705af28704e39";
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                if (response.StatusCode != HttpStatusCode.OK)
                    throw new Exception(String.Format(
                    "Server error (HTTP {0}: {1}).",
                    response.StatusCode,
                    response.StatusDescription));
                DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Response));
                object objResponse = jsonSerializer.ReadObject(response.GetResponseStream());
                Response jsonResponse = objResponse as Response;
                return jsonResponse;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            return null;
        }

        static void Main(string[] args)
        {
            Response response = ReadSerie();
            Serie serie = response.seriesResponse.series[0];
            Console.WriteLine("Serie: {0}", serie.Title);
            foreach (DataSerie dataSerie in serie.Data) {
                if (dataSerie.Data.Equals("N/E")) continue;
                Console.WriteLine("Fecha: {0}", dataSerie.Date);
                Console.WriteLine("Dato: {0}", dataSerie.Data);
            }
            Console.ReadLine();
        }
    }
}

Salida del programa:


Serie: Tasa objetivo
Fecha: 06/08/2011
Dato: 4.5000

Graficación de series


Para consultar series de tiempo del SIE en R, existe un paquete que encapsula la lógica necesaria para conectarse al API. Este paquete se llama siebanxicor. Para instalarlo se procede normalmente:

install.packages("siebanxicor")

En el siguiente ejemplo se consultarán y graficarán 3 series de tipo de cambio. Para crear la gráfica es necesario instalar previamente el paquete “ggplot2”.

El primer paso es incluir el paquete para poder usarlo:

library("siebanxicor")

Ahora se debe especificar el token de consulta. (Más información del token aquí). Sólo es necesario indicar el token de consulta una vez por sesión:

setToken("6e3bd0938be9fff6e4f4811b7b413d111f96a8c9a0ae60abef4029b681e9b8a9")

Posteriormente se realiza la consulta de las series, en este caso para el periodo del 01/01/2016 al 12/07/2018:

idSeries <- c("SF43718","SF46410","SF46407")
series <- getSeriesData(idSeries, '2016-01-01','2018-07-12')

Hasta este punto, ya tenemos los datos de las series en memoria. Ahora sólo falta generar la gráfica de la siguiente manera:

ggplot(NULL, aes(x=date, y=value)) +
    geom_line(color="#ff1a1a", data = getSerieDataFrame(series, "SF43718")) +
    geom_line(color="#0000b3", data = getSerieDataFrame(series, "SF46410")) +
    geom_line(color="#00b300", data = getSerieDataFrame(series, "SF46407"))

Ejemplo completo:

graficaTiposCambio <- function() {
    setToken("6e3bd0938be9fff6e4f4811b7b413d111f96a8c9a0ae60abef4029b681e9b8a9")

    idSeries <- c("SF43718","SF46410","SF46407")
    series <- getSeriesData(idSeries, '2016-01-01','2018-07-12')

    ggplot(NULL, aes(x=date, y=value)) +
    geom_line(color="#ff1a1a", data = getSerieDataFrame(series, "SF43718")) +
    geom_line(color="#0000b3", data = getSerieDataFrame(series, "SF46410")) +
    geom_line(color="#00b300", data = getSerieDataFrame(series, "SF46407"))
}

Más información del paquete aquí.