Skip to content

Instantly share code, notes, and snippets.

@jrosell
Last active July 26, 2024 02:10
Show Gist options
  • Save jrosell/6467bacf15816ffafb4194029d4c6bb8 to your computer and use it in GitHub Desktop.
Save jrosell/6467bacf15816ffafb4194029d4c6bb8 to your computer and use it in GitHub Desktop.
debug <- FALSE
#' @noRd
preparations <- \() {
cat(glue::glue("preparations")); cat("\n")
if(!"rlang" %in% installed.packages()){
if(!interactive()) { stop("The package \"rlang\" is required.") }
cat("The package \"rlang\" is required.\n✖ Would you like to install it?\n\n1: Yes\n2: No\n\nSelection:")
if (readLines(n = 1) == "1"){
install.packages("rlang")
}
}
rlang::check_installed(
"jrrosell (>= 0.0.0.9006)",
action = \(pkg,...) {
if("jrrosell" %in% installed.packages()){ remove.packages("jrrosell") }
pak::pak("jrosell/jrrosell")
}
)
jrrosell::check_installed_gihub("tidyverse/dplyr")
jrrosell::check_installed_gihub("tidyverse/ggplot2")
jrrosell::check_installed_gihub("tidymodels/tune")
jrrosell::check_installed_gihub("tidymodels/recipes")
jrrosell::check_installed_gihub("tidymodels/workflows")
jrrosell::check_installed_gihub("tidymodels/parsnip")
jrrosell::check_installed_gihub("business-science/modeltime")
jrrosell::check_installed_gihub("business-science/timetk")
jrrosell::check_installed_gihub("plotly/plotly.R")
library(tidyverse)
library(testthat)
library(jrrosell)
jrrosell::theme_set_roboto_darkblue()
!dir.exists("data") && dir.create("data")
invisible(NULL)
}
if (debug && interactive()) {
test_that("preparations funciona", {
expect_no_error(preparations())
})
}
#' @noRd
download_year_ejecucion_presupuestaria <- \(year) {
cat(glue::glue("download_year_ejecucion_presupuestaria({year})")); cat("\n")
destfile <- paste0("data/", year, ".xlsx")
try_to_download <- possibly(download.file, otherwise = -1, quiet = TRUE)
suppressWarnings(suppressMessages({
r <- -1
if (r != 0){
url <- glue::glue("https://www.igae.pap.hacienda.gob.es/sitios/igae/es-ES/Contabilidad/ContabilidadPublica/CPE/EjecucionPresupuestaria/Documents/DISTRIBUCI%C3%93N%20TERRITORIAL%20DE%20LA%20INVERSI%C3%93N%20SEGUNDO%20SEMESTRE%20{year}%20(EXCEL).xlsx")
r <- try_to_download(url, destfile = destfile)
}
if (r != 0){
url <- glue::glue("https://www.igae.pap.hacienda.gob.es/sitios/igae/es-ES/Contabilidad/ContabilidadPublica/CPE/EjecucionPresupuestaria/Documents/DISTRIBUCI%C3%93N%20TERRITORIAL%20DE%20LA%20INVERSI%C3%93N%20SEGUNDO%20SEMESTRE%20{year}%20(EXCEL)%20(DEFINITIVO).xlsx")
r <- try_to_download(url, destfile = destfile)
}
if (r != 0){
url <- glue::glue("https://www.igae.pap.hacienda.gob.es/sitios/igae/es-ES/Contabilidad/ContabilidadPublica/CPE/EjecucionPresupuestaria/Documents/DISTRIBUCI%C3%93N%20TERRITORIAL%20DE%20LA%20INVERSI%C3%93N%20SEGUNDO%20SEMESTRE%20{year}%20(EXCEL)%20DEFINITIVO.xlsx")
r <- try_to_download(url, destfile = destfile)
}
if (r != 0){
url <- glue::glue("https://www.igae.pap.hacienda.gob.es/sitios/igae/es-ES/Contabilidad/ContabilidadPublica/CPE/EjecucionPresupuestaria/Documents/DISTRIBUCI%C3%93N%20TERRITORIAL%20DE%20LA%20INVERSI%C3%93N%20SEGUNDO%20SEMESTRE%20{year}%20(DEFINITIVO).xlsx")
r <- try_to_download(url, destfile = destfile)
}
if (r != 0){
url <- glue::glue("https://www.igae.pap.hacienda.gob.es/sitios/igae/es-ES/Contabilidad/ContabilidadPublica/CPE/EjecucionPresupuestaria/Documents/DISTRIBUCI%C3%93N%20TERRITORIAL%20DE%20LA%20INVERSI%C3%93N%20SEGUNGO%20SEMESTRE%20{year}%20(DEFINITIVO).xlsx")
r <- try_to_download(url, destfile = destfile)
}
if (r != 0){
url <- glue::glue("https://www.igae.pap.hacienda.gob.es/sitios/igae/es-ES/Contabilidad/ContabilidadPublica/CPE/EjecucionPresupuestaria/Documents/DISTRIBUCI%C3%93N%20TERRITORIAL%20DE%20LA%20INVERSION%20SEGUNDO%20SEMESTRE%20{year}%20(DEFINITIVO).xlsx")
r <- try_to_download(url, destfile = destfile)
}
}))
}
if (debug && interactive()) {
test_that("download_year_ejecucion_presupuestaria funciona de 2009 a 2021", {
walk(2009:2021, \(year) {
ruta <- paste0("data/", year, ".xlsx")
if(file.exists(ruta)) unlink(ruta)
download_year_ejecucion_presupuestaria(year)
expect_true(file.exists(ruta))
})
})
}
#' @noRd
read_year_ejecucion_presupuestaria <- \(year){
cat(glue::glue("read_year_ejecucion_presupuestaria({year})")); cat("\n")
xlsxFile <- paste0("data/", year, ".xlsx")
df <- jrrosell::read_xlsx(xlsxFile, startRow = 8) |>
as_tibble() |>
janitor::clean_names()
slice_head(df, n = which(df$comunidad == "Total general") - 1)
}
if (debug && interactive()) {
test_that("read_year_ejecucion_presupuestaria funciona a 2021", {
result <- map(2009:2021, \(year) {
ruta <- paste0("data/", year, ".xlsx")
if(!file.exists(ruta)) download_year_ejecucion_presupuestaria(year)
df <- read_year_ejecucion_presupuestaria(year) |>
mutate(year = year)
expect_true(length(df$comunidad) >= 19)
df
})
expect_true(length(result) == length(2009:2021))
})
}
#' @noRd
clean_ejecucion_presupuestaria <- \(df){
cat(glue::glue("clean_ejecucion_presupuestaria()")); cat("\n")
df |>
mutate(
comunidad2 = str_trim(if_else(
substr(comunidad, 3, 3) == " ",
substring(comunidad, 3),
x2
))
) |>
mutate(
comunidad2 = str_trim(if_else(
is.na(comunidad2),
substring(comunidad, 3),
comunidad2
))
) |>
mutate(comunidad = comunidad2 |>
str_replace("ANDALUCIA", "ANDALUCÍA") |>
str_replace("ARAGON", "ARAGÓN") |>
str_replace("CASTILLA Y LEON", "CASTILLA Y LEÓN") |>
str_replace("PAIS VASCO", "PAÍS VASCO") |>
str_replace("REGION DE MURCIA", "REGIÓN DE MURCIA") |>
str_replace("COMUNIDAD VALENCIANA", "COMUNITAT VALENCIANA")
) |>
select(-comunidad2, -x2)
}
if (debug && interactive()) {
test_that("clean_ejecucion_presupuestaria funciona a 2021", {
df_comunidades <- 2009:2021 |>
map(\(year) {
ruta <- paste0("data/", year, ".xlsx")
if(!file.exists(ruta)) download_year_ejecucion_presupuestaria(year)
read_year_ejecucion_presupuestaria(year) |> mutate(year = year)
}) |>
list_rbind() |>
clean_ejecucion_presupuestaria() |>
count(comunidad, sort = TRUE)
expect_true(
filter(count(df_comunidades, n, name = "nn"), n == 13)$nn == 21,
label = "Número de comunidades con 13 entradas == 21 debe ser cierto"
)
})
}
#' @noRd
preparar_ejecucion_presupuestaria <- \(years){
cat(glue::glue("preparar_ejecucion_presupuestaria")); cat("\n")
years |>
map(\(year) {
ruta <- paste0("data/", year, ".xlsx")
if(!file.exists(ruta)) download_year_ejecucion_presupuestaria(year)
read_year_ejecucion_presupuestaria(year) |> mutate(year = year)
}) |>
list_rbind() |>
clean_ejecucion_presupuestaria()
}
if (debug && interactive()) {
test_that("preparar_ejecucion_presupuestaria funciona de 2009 a 2021", {
result <- preparar_ejecucion_presupuestaria(2009:2021)
expect_true(all(
names(result) == c("comunidad", "credito_inicial", "obligaciones_reconocidas", "percent", "year")
))
})
}
#' Plot ejecución presupostaria
main <- \() {
preparations()
df_ejecucion_presupuestaria <- 2009:2021 |>
preparar_ejecucion_presupuestaria() |>
filter(!(comunidad %in% c("NO REGIONALIZABLE", "EXTRANJERO", "SERVICIOS CENTRALES", "VARIAS COMUNIDADES")))
p <- df_ejecucion_presupuestaria |>
ggplot(aes(year, obligaciones_reconocidas, colour = comunidad)) +
geom_line(linewidth = 1) +
scale_y_continuous(
labels = scales::unit_format(unit = "M €", scale = 1e-6, sep = "")
) +
scale_color_viridis_d(option = "turbo") +
facet_wrap("comunidad") +
labs(
title = "CAPÍTULO 6 \"INVERSIONES REALES\" DEL PRESUPUESTO DE GASTOS DE LA AGE",
subtitle = "Obligaciones reconocidas anualmente de 1 de enero a 31 de diciembre por comunidad",
caption = "Fuente: igae.pap.hacienda.gob.es | Autor: @jrosell",
y = "", x = "", colour = ""
) +
theme(legend.position = "none")
p
}
p <- main()
print(p)
# plotly::ggplotly(p)
df <- 2009:2021 |>
preparar_ejecucion_presupuestaria() |>
filter(comunidad %in% c("COMUNIDAD DE MADRID", "CATALUÑA"))
p1 <- df |>
ggplot(aes(year, obligaciones_reconocidas)) +
geom_col(fill = "darkblue") +
geom_text(nudge_y = -60000000, aes(label = paste0(round(obligaciones_reconocidas/1e6), "M €")), color = "white") +
scale_x_continuous(breaks = 2009:2021, trans = "reverse") +
scale_y_continuous(
labels = scales::unit_format(unit = "M €", scale = 1e-6, sep = "")
) +
facet_wrap("comunidad") +
coord_flip() +
labs(
title = "CAPÍTULO 6 \"INVERSIONES REALES\" DEL PRESUPUESTO DE GASTOS DE LA AGE",
subtitle = "Obligaciones reconocidas anualmente de 1 de enero a 31 de diciembre por comunidad",
caption = "Fuente: igae.pap.hacienda.gob.es | Autor: @jrosell",
y = "", x = "", colour = ""
)
p2 <- df |>
summarize(
.by = comunidad,
obligaciones_reconocidas = sum(obligaciones_reconocidas)
)|>
ggplot(aes(comunidad, obligaciones_reconocidas)) +
geom_col(fill = "darkblue") +
scale_y_continuous(
labels = scales::unit_format(unit = "M €", scale = 1e-6, sep = "")
) +
geom_text(nudge_y = -500000000, aes(label = scales::number(obligaciones_reconocidas, suffix = "M €", scale = 1e-6, sep = "")), color = "white") +
coord_flip() +
labs(
title = NULL,
subtitle = "Obligaciones reconocidas anualmente de 2009-2012 Comunidad de Madrid y Cataluña",
caption = "Fuente: igae.pap.hacienda.gob.es | Autor: @jrosell",
y = "", x = "", colour = ""
)
(p1 / p2)
@jrosell
Copy link
Author

jrosell commented Jul 25, 2024

plot

@jrosell
Copy link
Author

jrosell commented Jul 25, 2024

imatge

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment