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.
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 subasta | 26/01/2023 | 11.05 |
| Tasa de fondeo bancario Promedio ponderado Tasa de interés en por ciento anual | 01/12/2022 | 10.31 |
| Tasa objetivo | 31/01/2023 | 10.5 |
| Inflación No subyacente (nueva definición) Anual | 01/12/2022 | 6.27 |
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 Enero de 2023. 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/:fechaFSe 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 Enero de 2023):
https://www.banxico.org.mx/SieAPIRest/service/v1/series/SF43936/datos/2023-01-01/2023-01-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.14.2</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
String url="https://www.banxico.org.mx/SieAPIRest/service/v1/series/SF43718/datos/2023-01-01/2023-01-31";
//Se especifica la versión del protocolo TLS 1.3
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory (
SSLContexts.createDefault(),
new String [] {"TLSv1.3"},null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
Response response;
try (CloseableHttpClient httpclient =
HttpClients.custom().setSSLSocketFactory(sslsf).build()) {
//Se realiza una petición GET
HttpGet getMethod = new HttpGet(url);
//Se solicita que la respuesta esté en formato JSON
getMethod.setHeader("Content-Type", "application/json");
//Se envía el header Bmx-Token con el token de consulta
//Modificar por el token de consulta propio
getMethod.setHeader("Bmx-Token",
"6e3bd0938be9fff6e4f4811b7b413d111f96a8c9a0ae60abef4029b681e9b8a9");
HttpResponse httResponse = httpclient.execute(getMethod);
StatusLine statusLine = httResponse.getStatusLine();
//En caso de ser exitosa la petición se devuelve un estatus HTTP 200
if (statusLine.getStatusCode() != HttpStatus.SC_OK) {
System.out.println("Mensaje de error "+statusLine.getReasonPhrase() );
throw new RuntimeException ("Http codigo de error: "+statusLine);
}
//Se utiliza Jackson para mapear el JSON a objetos Java
ObjectMapper mapper = new ObjectMapper();
response = mapper.readValue(httResponse.getEntity().getContent(),
Response.class);
httpclient.close();
}
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 com.fasterxml.jackson.databind.ObjectMapper;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.StatusLine;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
public class Series {
public static Response readSeries() throws Exception {
//La URL a consultar con los parametros de idSerie y fechas
String url="https://www.banxico.org.mx/SieAPIRest/service/v1/series/SF43718/datos/2023-01-01/2023-01-31";
//Se especifica la versión del protocolo TLS 1.3
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory (
SSLContexts.createDefault(),
new String [] {"TLSv1.3"},null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
Response response;
try (CloseableHttpClient httpclient =
HttpClients.custom().setSSLSocketFactory(sslsf).build()) {
//Se realiza una petición GET
HttpGet getMethod = new HttpGet(url);
//Se solicita que la respuesta esté en formato JSON
getMethod.setHeader("Content-Type", "application/json");
//Se envía el header Bmx-Token con el token de consulta
//Modificar por el token de consulta propio
getMethod.setHeader("Bmx-Token", "6e3bd0938be9fff6e4f4811b7b413d111f96a8c9a0ae60abef4029b681e9b8a9");
HttpResponse httResponse = httpclient.execute(getMethod);
StatusLine statusLine = httResponse.getStatusLine();
//En caso de ser exitosa la petición se devuelve un estatus HTTP 200
if (statusLine.getStatusCode() != HttpStatus.SC_OK) {
System.out.println("Mensaje de error "+statusLine.getReasonPhrase() );
throw new RuntimeException ("Http codigo de error: "+statusLine);
}
//Se utiliza Jackson para mapear el JSON a objetos Java
ObjectMapper mapper = new ObjectMapper();
response = mapper.readValue(httResponse.getEntity().getContent(),Response.class);
httpclient.close();
}
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/01/2023
Dato: 10.49
Fecha: 12/01/2023
Dato: 10.46
Fecha: 19/01/2023
Dato: 10.70
Fecha: 26/01/2023
Dato: 10.80
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 31 de Enero de 2023. 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/:fechaFSe coloca en la URL los identificadores de series a consultar (máximo 20) y la fecha histórica a consultar (en este caso 31 de Enero de 2023):
https://www.banxico.org.mx/SieAPIRest/service/v1/series/SF61745/datos/2023-01-31/2023-01-31
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/2023-01-31/2023-01-31";
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/2023-01-31/2023-01-31";
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: 31/01/2023
Dato: 10.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/2020 al 31/01/2023:
idSeries <- c("SF43718","SF46410","SF46407")
series <- getSeriesData(idSeries, '2020-01-01','2023-01-31')
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, '2020-01-01','2023-01-31')
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í.