From 72d6be5b141e078256ef08021636a6af7564efc9 Mon Sep 17 00:00:00 2001 From: Johan-rosa Date: Wed, 4 Mar 2026 16:29:32 -0400 Subject: [PATCH 1/6] feat: get operaciones interbancarias --- R/operaciones_interbancarias.R | 61 ++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 R/operaciones_interbancarias.R diff --git a/R/operaciones_interbancarias.R b/R/operaciones_interbancarias.R new file mode 100644 index 0000000..95b7004 --- /dev/null +++ b/R/operaciones_interbancarias.R @@ -0,0 +1,61 @@ +get_tasa_interbancaria <- function() { + url <- paste0( + "https://cdn.bancentral.gov.do/documents/", + "estadisticas/sector-monetario-y-financiero/", + "documents/Tasas_Interbancarias_Promedio_por_Plazos.xlsm" + ) + + file <- tempfile(fileext = ".xlsm") + + tryCatch( + download.file(url, file, mode = "wb", quiet = TRUE), + error = function(e) { + stop("No se pudo descargar el archivo de tasas interbancarias.") + } + ) + + headers_oi <- c( + "year_mes", + "monto_operaciones_interbancarias", + "tasa_promedio_ponderado", + "monto_depositos_vista", + "tasa_depositos_vista", + "monto_d_1_7", "tasa_d_1_7", + "monto_d_8_30", "tasa_d_8_30", + "monto_d_31_60", "tasa_d_31_60", + "monto_d_61_90", "tasa_d_61_90", + "monto_d_91_120", "tasa_d_91_120", + "monto_d_121_180", "tasa_d_121_180", + "monto_d_181_365", "tasa_d_181_365", + "monto_mas_365_dias", "tasa_mas_365_dias" + ) + + readxl::read_excel( + file, + skip = 11, + col_names = FALSE + ) |> + stats::setNames(headers_oi) |> + dplyr::filter(!is.na(year_mes)) |> + dplyr::mutate( + year = as.integer(stringr::str_extract(year_mes, "20\\d{2}")), + year_mes = stringr::str_remove(year_mes, "\\*") + ) |> + tidyr::fill(year) |> + dplyr::filter(!stringr::str_detect(year_mes, "Acumulad")) |> + dplyr::mutate( + dplyr::across( + -c(year_mes, year), + readr::parse_number + ) + ) |> + dplyr::filter(!is.na(monto_operaciones_interbancarias)) |> + dplyr::distinct(year, year_mes, .keep_all = TRUE) |> + dplyr::mutate( + mes = databcrd::crear_mes(year_mes), + date = lubridate::make_date(year, mes, 1) + ) |> + dplyr::relocate(date, year, mes) |> + suppressMessages() |> + suppressWarnings() +} From de130ce27fd4d6d17a163173380471d7e072a3ac Mon Sep 17 00:00:00 2001 From: Johan-rosa Date: Wed, 4 Mar 2026 16:42:46 -0400 Subject: [PATCH 2/6] tests: test get_tasa_interbancaria --- NAMESPACE | 1 + R/operaciones_interbancarias.R | 40 +++++++++ man/get_tasa_interbancaria.Rd | 49 +++++++++++ .../test-operaciones_interbancarias.R | 83 +++++++++++++++++++ 4 files changed, 173 insertions(+) create mode 100644 man/get_tasa_interbancaria.Rd create mode 100644 tests/testthat/test-operaciones_interbancarias.R diff --git a/NAMESPACE b/NAMESPACE index 534ad48..66f2f71 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -22,6 +22,7 @@ export(get_pib_gasto) export(get_pib_sectores) export(get_prestamos_osd) export(get_remesas) +export(get_tasa_interbancaria) export(get_tasas_activas) export(get_tasas_pasivas) export(get_tc) diff --git a/R/operaciones_interbancarias.R b/R/operaciones_interbancarias.R index 95b7004..1bbfaa4 100644 --- a/R/operaciones_interbancarias.R +++ b/R/operaciones_interbancarias.R @@ -1,3 +1,43 @@ +#' Obtener tasas interbancarias promedio por plazos +#' +#' Descarga y procesa el archivo oficial de Tasas Interbancarias Promedio +#' por Plazos publicado por el Banco Central de la República Dominicana. +#' +#' La función: +#' \itemize{ +#' \item Descarga el archivo .xlsm desde el CDN institucional. +#' \item Limpia encabezados y filas agregadas (acumulados). +#' \item Convierte montos y tasas a formato numérico. +#' \item Construye variables temporales (`year`, `mes`, `date`). +#' } +#' +#' @return Un `tibble` con frecuencia mensual que incluye: +#' \describe{ +#' \item{date}{Fecha tipo Date (primer día del mes).} +#' \item{year}{Año numérico.} +#' \item{mes}{Mes numérico (1–12).} +#' \item{monto_operaciones_interbancarias}{Monto total de operaciones interbancarias.} +#' \item{tasa_promedio_ponderado}{Tasa promedio ponderada de operaciones interbancarias.} +#' \item{monto_depositos_vista}{Monto de depósitos a la vista.} +#' \item{tasa_depositos_vista}{Tasa de depósitos a la vista.} +#' \item{monto_d_*}{Montos por tramo de plazo (días).} +#' \item{tasa_d_*}{Tasas por tramo de plazo (días).} +#' } +#' +#' @details +#' Requiere que la estructura del archivo fuente no cambie (salto de 11 filas +#' iniciales y orden de columnas fijo). Si el formato publicado por el Banco +#' Central cambia, la función podría fallar. +#' +#' @source Banco Central de la República Dominicana. +#' +#' @examples +#' \dontrun{ +#' tasas <- get_tasa_interbancaria() +#' dplyr::glimpse(tasas) +#' } +#' +#' @export get_tasa_interbancaria <- function() { url <- paste0( "https://cdn.bancentral.gov.do/documents/", diff --git a/man/get_tasa_interbancaria.Rd b/man/get_tasa_interbancaria.Rd new file mode 100644 index 0000000..316cc75 --- /dev/null +++ b/man/get_tasa_interbancaria.Rd @@ -0,0 +1,49 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/operaciones_interbancarias.R +\name{get_tasa_interbancaria} +\alias{get_tasa_interbancaria} +\title{Obtener tasas interbancarias promedio por plazos} +\source{ +Banco Central de la República Dominicana. +} +\usage{ +get_tasa_interbancaria() +} +\value{ +Un \code{tibble} con frecuencia mensual que incluye: +\describe{ +\item{date}{Fecha tipo Date (primer día del mes).} +\item{year}{Año numérico.} +\item{mes}{Mes numérico (1–12).} +\item{monto_operaciones_interbancarias}{Monto total de operaciones interbancarias.} +\item{tasa_promedio_ponderado}{Tasa promedio ponderada de operaciones interbancarias.} +\item{monto_depositos_vista}{Monto de depósitos a la vista.} +\item{tasa_depositos_vista}{Tasa de depósitos a la vista.} +\item{monto_d_\emph{}{Montos por tramo de plazo (días).} +\item{tasa_d_}}{Tasas por tramo de plazo (días).} +} +} +\description{ +Descarga y procesa el archivo oficial de Tasas Interbancarias Promedio +por Plazos publicado por el Banco Central de la República Dominicana. +} +\details{ +La función: +\itemize{ +\item Descarga el archivo .xlsm desde el CDN institucional. +\item Limpia encabezados y filas agregadas (acumulados). +\item Convierte montos y tasas a formato numérico. +\item Construye variables temporales (\code{year}, \code{mes}, \code{date}). +} + +Requiere que la estructura del archivo fuente no cambie (salto de 11 filas +iniciales y orden de columnas fijo). Si el formato publicado por el Banco +Central cambia, la función podría fallar. +} +\examples{ +\dontrun{ +tasas <- get_tasa_interbancaria() +dplyr::glimpse(tasas) +} + +} diff --git a/tests/testthat/test-operaciones_interbancarias.R b/tests/testthat/test-operaciones_interbancarias.R new file mode 100644 index 0000000..dec4d25 --- /dev/null +++ b/tests/testthat/test-operaciones_interbancarias.R @@ -0,0 +1,83 @@ +data <- get_tasa_interbancaria() |> + dplyr::mutate(fecha = date) + +test_that("There aren't dates in the future", { + testthat::expect_true(max(data$fecha) <= lubridate::today()) +}) + +test_that("There aren't haps between dates", { + test_nmonths <- data |> + dplyr::arrange(fecha) |> + dplyr::mutate(lag_fecha = dplyr::lag(fecha)) |> + dplyr::filter(!is.na(lag_fecha)) |> + dplyr::mutate(one_month_diff = fecha == lag_fecha + months(1)) + + testthat::expect_true(all(test_nmonths$one_month_diff)) +}) + +test_that("No missing columns", { + any_missing_columns <- data |> + sapply(function(x) all(is.na(x))) |> + all() + + testthat::expect_false(any_missing_columns) +}) + +test_that("No missing rows", { + empty_rows <- data |> + apply(MARGIN = 1, FUN = function(x) all(is.na(x))) |> + all() + + testthat::expect_false(empty_rows) +}) + +test_that("Dates are unique", { + testthat::expect_equal(nrow(data), dplyr::n_distinct(data$fecha)) +}) + +test_that("Dates are ordered after arrange", { + ordered_data <- data |> dplyr::arrange(fecha) + testthat::expect_true(all(diff(ordered_data$fecha) > 0)) +}) + +test_that("Year and month are consistent with date", { + testthat::expect_true( + all(lubridate::year(data$fecha) == data$year) + ) + testthat::expect_true( + all(lubridate::month(data$fecha) == data$mes) + ) +}) + +test_that("Montos are non-negative", { + monto_cols <- names(data)[stringr::str_detect(names(data), "^monto")] + + non_negative <- data |> + dplyr::select(dplyr::all_of(monto_cols)) |> + sapply(function(x) all(is.na(x) | x >= 0)) |> + all() + + testthat::expect_true(non_negative) +}) + +test_that("Tasas are within reasonable bounds", { + tasa_cols <- names(data)[stringr::str_detect(names(data), "^tasa")] + + reasonable_range <- data |> + dplyr::select(dplyr::all_of(tasa_cols)) |> + sapply(function(x) all(is.na(x) | (x >= 0 & x <= 100))) |> + all() + + testthat::expect_true(reasonable_range) +}) + +test_that("No duplicated year-month combinations", { + testthat::expect_equal( + nrow(data), + dplyr::n_distinct(data$year, data$mes) + ) +}) + +test_that("Dataset has at least 12 observations", { + testthat::expect_gte(nrow(data), 12) +}) From 264873e3756610dabdbf04fcd6e6798f67c4d60e Mon Sep 17 00:00:00 2001 From: Johan-rosa Date: Wed, 4 Mar 2026 16:48:52 -0400 Subject: [PATCH 3/6] docs: english documentation --- R/operaciones_interbancarias.R | 48 +++++++++++++++++----------------- man/get_tasa_interbancaria.Rd | 48 +++++++++++++++++----------------- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/R/operaciones_interbancarias.R b/R/operaciones_interbancarias.R index 1bbfaa4..f8af406 100644 --- a/R/operaciones_interbancarias.R +++ b/R/operaciones_interbancarias.R @@ -1,40 +1,40 @@ -#' Obtener tasas interbancarias promedio por plazos +#' Get average interbank interest rates by maturity #' -#' Descarga y procesa el archivo oficial de Tasas Interbancarias Promedio -#' por Plazos publicado por el Banco Central de la República Dominicana. +#' Downloads and processes the official Average Interbank Rates by Maturity +#' file published by the Central Bank of the Dominican Republic. #' -#' La función: +#' The function: #' \itemize{ -#' \item Descarga el archivo .xlsm desde el CDN institucional. -#' \item Limpia encabezados y filas agregadas (acumulados). -#' \item Convierte montos y tasas a formato numérico. -#' \item Construye variables temporales (`year`, `mes`, `date`). +#' \item Downloads the .xlsm file from the institutional CDN. +#' \item Cleans headers and aggregated rows (cumulative values). +#' \item Converts amounts and interest rates to numeric format. +#' \item Builds time variables (`year`, `mes`, `date`). #' } #' -#' @return Un `tibble` con frecuencia mensual que incluye: +#' @return A monthly-frequency `tibble` including: #' \describe{ -#' \item{date}{Fecha tipo Date (primer día del mes).} -#' \item{year}{Año numérico.} -#' \item{mes}{Mes numérico (1–12).} -#' \item{monto_operaciones_interbancarias}{Monto total de operaciones interbancarias.} -#' \item{tasa_promedio_ponderado}{Tasa promedio ponderada de operaciones interbancarias.} -#' \item{monto_depositos_vista}{Monto de depósitos a la vista.} -#' \item{tasa_depositos_vista}{Tasa de depósitos a la vista.} -#' \item{monto_d_*}{Montos por tramo de plazo (días).} -#' \item{tasa_d_*}{Tasas por tramo de plazo (días).} +#' \item{date}{Date object (first day of the month).} +#' \item{year}{Numeric year.} +#' \item{mes}{Numeric month (1–12).} +#' \item{monto_operaciones_interbancarias}{Total interbank transaction amount.} +#' \item{tasa_promedio_ponderado}{Weighted average interbank interest rate.} +#' \item{monto_depositos_vista}{Demand deposits amount.} +#' \item{tasa_depositos_vista}{Demand deposits interest rate.} +#' \item{monto_d_*}{Amounts by maturity bucket (days).} +#' \item{tasa_d_*}{Interest rates by maturity bucket (days).} #' } #' #' @details -#' Requiere que la estructura del archivo fuente no cambie (salto de 11 filas -#' iniciales y orden de columnas fijo). Si el formato publicado por el Banco -#' Central cambia, la función podría fallar. +#' Requires the source file structure to remain unchanged (11 initial rows skipped +#' and fixed column order). If the format published by the Central Bank changes, +#' the function may fail. #' -#' @source Banco Central de la República Dominicana. +#' @source Central Bank of the Dominican Republic. #' #' @examples #' \dontrun{ -#' tasas <- get_tasa_interbancaria() -#' dplyr::glimpse(tasas) +#' rates <- get_tasa_interbancaria() +#' dplyr::glimpse(rates) #' } #' #' @export diff --git a/man/get_tasa_interbancaria.Rd b/man/get_tasa_interbancaria.Rd index 316cc75..f5bdc9e 100644 --- a/man/get_tasa_interbancaria.Rd +++ b/man/get_tasa_interbancaria.Rd @@ -2,48 +2,48 @@ % Please edit documentation in R/operaciones_interbancarias.R \name{get_tasa_interbancaria} \alias{get_tasa_interbancaria} -\title{Obtener tasas interbancarias promedio por plazos} +\title{Get average interbank interest rates by maturity} \source{ -Banco Central de la República Dominicana. +Central Bank of the Dominican Republic. } \usage{ get_tasa_interbancaria() } \value{ -Un \code{tibble} con frecuencia mensual que incluye: +A monthly-frequency \code{tibble} including: \describe{ -\item{date}{Fecha tipo Date (primer día del mes).} -\item{year}{Año numérico.} -\item{mes}{Mes numérico (1–12).} -\item{monto_operaciones_interbancarias}{Monto total de operaciones interbancarias.} -\item{tasa_promedio_ponderado}{Tasa promedio ponderada de operaciones interbancarias.} -\item{monto_depositos_vista}{Monto de depósitos a la vista.} -\item{tasa_depositos_vista}{Tasa de depósitos a la vista.} -\item{monto_d_\emph{}{Montos por tramo de plazo (días).} -\item{tasa_d_}}{Tasas por tramo de plazo (días).} +\item{date}{Date object (first day of the month).} +\item{year}{Numeric year.} +\item{mes}{Numeric month (1–12).} +\item{monto_operaciones_interbancarias}{Total interbank transaction amount.} +\item{tasa_promedio_ponderado}{Weighted average interbank interest rate.} +\item{monto_depositos_vista}{Demand deposits amount.} +\item{tasa_depositos_vista}{Demand deposits interest rate.} +\item{monto_d_\emph{}{Amounts by maturity bucket (days).} +\item{tasa_d_}}{Interest rates by maturity bucket (days).} } } \description{ -Descarga y procesa el archivo oficial de Tasas Interbancarias Promedio -por Plazos publicado por el Banco Central de la República Dominicana. +Downloads and processes the official Average Interbank Rates by Maturity +file published by the Central Bank of the Dominican Republic. } \details{ -La función: +The function: \itemize{ -\item Descarga el archivo .xlsm desde el CDN institucional. -\item Limpia encabezados y filas agregadas (acumulados). -\item Convierte montos y tasas a formato numérico. -\item Construye variables temporales (\code{year}, \code{mes}, \code{date}). +\item Downloads the .xlsm file from the institutional CDN. +\item Cleans headers and aggregated rows (cumulative values). +\item Converts amounts and interest rates to numeric format. +\item Builds time variables (\code{year}, \code{mes}, \code{date}). } -Requiere que la estructura del archivo fuente no cambie (salto de 11 filas -iniciales y orden de columnas fijo). Si el formato publicado por el Banco -Central cambia, la función podría fallar. +Requires the source file structure to remain unchanged (11 initial rows skipped +and fixed column order). If the format published by the Central Bank changes, +the function may fail. } \examples{ \dontrun{ -tasas <- get_tasa_interbancaria() -dplyr::glimpse(tasas) +rates <- get_tasa_interbancaria() +dplyr::glimpse(rates) } } From 7ebce30884d520dd5d4790b96f382bc69143d612 Mon Sep 17 00:00:00 2001 From: Johan-rosa Date: Wed, 4 Mar 2026 16:57:01 -0400 Subject: [PATCH 4/6] chore: ignore words --- inst/WORDLIST | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/inst/WORDLIST b/inst/WORDLIST index 321bd1f..98453b7 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -52,3 +52,7 @@ clase grupo subclase subgrupo +interbank +Interbank +xlsm + From ed1d80e7a468353461ee68da8cdcf0b0a573b9b9 Mon Sep 17 00:00:00 2001 From: Johan-rosa Date: Wed, 4 Mar 2026 17:17:35 -0400 Subject: [PATCH 5/6] ignore word --- inst/WORDLIST | 1 + 1 file changed, 1 insertion(+) diff --git a/inst/WORDLIST b/inst/WORDLIST index 98453b7..ebec528 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -55,4 +55,5 @@ subgrupo interbank Interbank xlsm +CDN From 37b2a35ced35af65faf0e626683eef8931a8be3c Mon Sep 17 00:00:00 2001 From: Johan-rosa Date: Wed, 4 Mar 2026 17:28:17 -0400 Subject: [PATCH 6/6] docs: add dependency --- DESCRIPTION | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index bab63f2..9ee633a 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -19,7 +19,8 @@ Imports: stringr, usethis, tidyr, - yaml + yaml, + readr Suggests: urca, tsibble,