# ============================================================================= # Ejemplos de Uso de la API REST del Banco Central de Chile (R) # ============================================================================= # Este script muestra cómo usar directamente la API REST para consultar # series de la Base de Datos Estadísticos del Banco Central, construyendo # y utilizando las URLs de forma explícita. # # Funciones principales: # - SearchSeries: Buscar series por frecuencia # - GetSeries: Obtener datos de una serie específica # ============================================================================= library("rjson") library(httr) # --- API Key Token (reemplazar por el propio) ---------------------------------- token <- "tu_token" # ============================================================================= # EJEMPLO 1: CONSULTAR EL DÓLAR OBSERVADO # ============================================================================= cat("\n=== EJEMPLO 1: CONSULTAR EL DÓLAR OBSERVADO ===\n") # Paso 1: Buscar la serie cat("\nPaso 1: Buscar series relacionadas con 'dólar observado'\n") cat("Construyendo URL completa para SearchSeries con frequency=DAILY...\n") # URL completa para búsqueda de series diarias url_busqueda_dolar <- paste0("https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=", token, "&function=SearchSeries&frequency=DAILY") cat("URL utilizada:\n", url_busqueda_dolar, "\n\n") # Realizar la consulta json_data_dolar <- rjson::fromJSON(file = url_busqueda_dolar) # Filtrar series que contienen "dólar observado" # Nos quedamos con la información de SeriesInfos del JSON series_diarias <- as.data.frame(do.call(rbind, lapply(json_data_dolar$SeriesInfos, as.vector))) series_diarias$spanishTitle <- as.character(series_diarias$spanishTitle) idx_dolar <- grep("dólar observado", series_diarias$spanishTitle, ignore.case = TRUE) series_dolar <- series_diarias[idx_dolar, ] cat("Se encontraron", nrow(series_dolar), "series relacionadas con 'dólar observado'\n") cat("\nPrimeras coincidencias:\n") print(head(series_dolar, 3)) # Paso 2: Consultar los datos cat("\nPaso 2: Consultar datos del dólar observado (último año)\n") cat("Usaremos el código: F073.TCO.PRE.Z.D (dólar observado diario)\n") cat("Construyendo URL completa para GetSeries...\n") # URL completa para obtener datos de la serie url_datos_dolar <- paste0("https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=", token, "&function=GetSeries×eries=F073.TCO.PRE.Z.D&firstdate=2024-09-01&lastdate=2025-09-30") cat("URL utilizada:\n", url_datos_dolar, "\n\n") # Realizar la consulta json_data_serie <- rjson::fromJSON(file = url_datos_dolar) # Procesar las observaciones # Ocupamos Obs del JSON para acceder a al valor de las observaciones observaciones <- as.data.frame(do.call(rbind, lapply(json_data_serie$Series$Obs, as.vector))) observaciones$value <- as.numeric(observaciones$value) observaciones$indexDateString <- as.character(observaciones$indexDateString) cat("Datos obtenidos:", nrow(observaciones), "observaciones\n") cat("Período:", min(observaciones$indexDateString), "a", max(observaciones$indexDateString), "\n") cat("\nÚltimas 10 observaciones:\n") print(tail(observaciones, 10)) # Paso 3: Calcular estadísticas básicas cat("\nPaso 3: Estadísticas básicas del dólar observado\n") valores_validos <- observaciones$value[!is.na(observaciones$value)] cat("Valor mínimo: $", round(min(valores_validos), 2), "\n") cat("Valor máximo: $", round(max(valores_validos), 2), "\n") cat("Valor promedio: $", round(mean(valores_validos), 2), "\n") cat("Última observación: $", round(tail(valores_validos, 1), 2), "\n") # ============================================================================= # EJEMPLO 2: PIB E IMACEC CON FRECUENCIAS DISTINTAS # ============================================================================= cat("\n=== EJEMPLO 2: PIB E IMACEC CON FRECUENCIAS DISTINTAS ===\n") cat("En este ejemplo trabajaremos con dos indicadores económicos que tienen\n") cat("frecuencias diferentes: IMACEC (mensual) y PIB (trimestral).\n") # Paso 1: Buscar las series cat("\nPaso 1: Buscar las series\n") cat("Primero buscamos ambas series por separado según su frecuencia.\n") # Buscar IMACEC (mensual) cat("\nBuscando IMACEC (frecuencia MONTHLY):\n") url_busqueda_imacec <- paste0("https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=", token, "&function=SearchSeries&frequency=MONTHLY") json_data_imacec <- rjson::fromJSON(file = url_busqueda_imacec) series_mensuales <- as.data.frame(do.call(rbind, lapply(json_data_imacec$SeriesInfos, as.vector))) series_mensuales$spanishTitle <- as.character(series_mensuales$spanishTitle) idx_imacec <- grep("imacec empalmado", series_mensuales$spanishTitle, ignore.case = TRUE) series_imacec <- series_mensuales[idx_imacec, ] cat("Series encontradas para IMACEC:", nrow(series_imacec), "\n") cat("\nPrimeras coincidencias:\n") print(head(series_imacec, 5)) # Buscar PIB (trimestral) cat("\nBuscando PIB (frecuencia QUARTERLY):\n") url_busqueda_pib <- paste0("https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=", token, "&function=SearchSeries&frequency=QUARTERLY") json_data_pib <- rjson::fromJSON(file = url_busqueda_pib) series_trimestrales <- as.data.frame(do.call(rbind, lapply(json_data_pib$SeriesInfos, as.vector))) series_trimestrales$spanishTitle <- as.character(series_trimestrales$spanishTitle) idx_pib <- grep("PIB, volumen a precios del año anterior encadenado", series_trimestrales$spanishTitle, ignore.case = TRUE) series_pib <- series_trimestrales[idx_pib, ] cat("Series encontradas para PIB:", nrow(series_pib), "\n") cat("\nÚltimas coincidencias:\n") print(tail(series_pib, 10)) # Paso 2: Consultar cada serie por separado cat("\nPaso 2: Consultar cada serie individualmente\n") cat("De los resultados anteriores, utilizaremos:\n") cat("- IMACEC: F032.IMC.IND.Z.Z.EP18.Z.Z.0.M (frecuencia mensual)\n") cat("- PIB: F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T (frecuencia trimestral)\n") # Consultar IMACEC cat("\nConsultando IMACEC (mensual):\n") url_datos_imacec <- paste0("https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=", token, "&function=GetSeries×eries=F032.IMC.IND.Z.Z.EP18.Z.Z.0.M&firstdate=2024-01-01&lastdate=2025-09-30") json_imacec_datos <- rjson::fromJSON(file = url_datos_imacec) obs_imacec <- as.data.frame(do.call(rbind, lapply(json_imacec_datos$Series$Obs, as.vector))) obs_imacec$value <- as.numeric(obs_imacec$value) obs_imacec$indexDateString <- as.character(obs_imacec$indexDateString) colnames(obs_imacec)[colnames(obs_imacec) == "value"] <- "IMACEC" cat("IMACEC:", nrow(obs_imacec), "observaciones mensuales\n") cat("Período:", min(obs_imacec$indexDateString), "a", max(obs_imacec$indexDateString), "\n") print(tail(obs_imacec, 5)) # Consultar PIB cat("\nConsultando PIB (trimestral):\n") url_datos_pib <- paste0("https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=", token, "&function=GetSeries×eries=F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T&firstdate=2024-01-01&lastdate=2025-09-30") json_pib_datos <- rjson::fromJSON(file = url_datos_pib) obs_pib <- as.data.frame(do.call(rbind, lapply(json_pib_datos$Series$Obs, as.vector))) obs_pib$value <- as.numeric(obs_pib$value) obs_pib$indexDateString <- as.character(obs_pib$indexDateString) colnames(obs_pib)[colnames(obs_pib) == "value"] <- "PIB" cat("PIB:", nrow(obs_pib), "observaciones trimestrales\n") cat("Período:", min(obs_pib$indexDateString), "a", max(obs_pib$indexDateString), "\n") print(obs_pib) # Paso 3: Combinar ambas series en un DataFrame cat("\nPaso 3: Combinar ambas series con frecuencias distintas\n") cat("La API REST permite consultar series con diferentes frecuencias.\n") cat("Creamos un DataFrame combinado para mostrar ambas series:\n") # Preparar fechas para el merge obs_imacec$fecha_date <- as.Date(obs_imacec$indexDateString, format = "%d-%m-%Y") obs_pib$fecha_date <- as.Date(obs_pib$indexDateString, format = "%d-%m-%Y") # Crear secuencia de fechas mensuales para el período completo fechas_completas <- seq(from = as.Date("2024-01-01"), to = as.Date("2025-08-01"), by = "month") # DataFrame base con todas las fechas mensuales datos_combinados <- data.frame( fecha = format(fechas_completas, "%d-%m-%Y"), fecha_date = fechas_completas, stringsAsFactors = FALSE ) # Agregar IMACEC (mensual - tendrá valores en todas las fechas) datos_combinados <- merge(datos_combinados, obs_imacec[, c("fecha_date", "IMACEC")], by = "fecha_date", all.x = TRUE) # Agregar PIB (trimestral - solo en enero, abril, julio, octubre) datos_combinados <- merge(datos_combinados, obs_pib[, c("fecha_date", "PIB")], by = "fecha_date", all.x = TRUE) # Seleccionar columnas finales datos_combinados <- datos_combinados[, c("fecha", "IMACEC", "PIB")] cat("Datos combinados (frecuencia original):\n") cat("El IMACEC tiene valores mensuales, mientras que el PIB solo tiene valores\n") cat("trimestrales (enero, abril, julio, octubre). Por eso aparecen NA en las\n") cat("fechas intermedias para el PIB.\n\n") print(head(datos_combinados, 8))