From ffccb6e4de4ca2e032fcbaeefc46186e7d69781b Mon Sep 17 00:00:00 2001
From: Juliette Engelaere-Lefebvre
 <juliette.engelaere@developpement-durable.gouv.fr>
Date: Tue, 4 Mar 2025 14:08:56 +0100
Subject: [PATCH] Mise en base rpls 2024, la collecte se base sur la fonction
 de dataprep du package propre.rpls

---
 R/dataprep_all.R           | 211 -------------------------------------
 data-raw/chargement_rpls.R |  40 ++++---
 2 files changed, 26 insertions(+), 225 deletions(-)
 delete mode 100644 R/dataprep_all.R

diff --git a/R/dataprep_all.R b/R/dataprep_all.R
deleted file mode 100644
index 2870b60..0000000
--- a/R/dataprep_all.R
+++ /dev/null
@@ -1,211 +0,0 @@
-# Fonction pour la source RPLS adaptée de puis https://gitlab.com/rdes_dreal/propre.rpls/-/blob/master/R/dataprep.R?ref_type=heads
-
-#' Phase de datapreparation pour la publication
-#'
-#' @description Consolidation des indicateurs aux differentes échelles 
-#'
-#' @param test TRUE si on souhaite tester dataprep() sur 100 communes choisies au hasard.
-#'
-#' @return Un dataframe d'indicateurs : une ligne par entite geographique et millesime
-#' @importFrom COGiter cogifier ajouter_zonage
-#' @importFrom dplyr select full_join mutate vars starts_with mutate filter case_when across pull group_by ungroup lag arrange
-#' @importFrom forcats fct_relevel
-#' @importFrom rlang .data
-#' @importFrom tidyr replace_na expand_grid
-#' @export
-#'
-
-dataprep_all <- function(test = FALSE) {
-  
-  if (test) {
-    liste_depcom <- propre.rpls::tab_result %>%
-      dplyr::pull("DEPCOM") %>%
-      sample(size = 100)
-    tab_result <- propre.rpls::tab_result %>%
-      dplyr::filter(.data$DEPCOM %in% liste_depcom) %>%
-      dplyr::mutate(millesime = factor(.data$millesime),
-                    DEPCOM = factor(.data$DEPCOM))
-    lgt_rp <- propre.rpls::lgt_rp %>%
-      dplyr::filter(DEPCOM %in% liste_depcom)
-  } else {
-    liste_depcom <- COGiter::communes %>% dplyr::pull("DEPCOM")
-    tab_result <- propre.rpls::tab_result %>%
-      dplyr::mutate(millesime = factor(.data$millesime),
-                    DEPCOM = factor(.data$DEPCOM))
-    lgt_rp <- propre.rpls::lgt_rp
-  }
-  
-  mil_disp <- dplyr::select(tab_result, "millesime") %>%
-    dplyr::pull("millesime") %>%
-    unique()
-  # Le df de départ, une ligne par commune à jour et millésime
-  df <- tidyr::expand_grid(DEPCOM = liste_depcom, millesime = mil_disp)
-  
-  # un df intermediaire pour pouvoir calculer les indicateurs de densite LS / RP pour toutes les annees
-  # (on duplique les données du RP pour chaque millesime disponible)
-  lgt_rp_mil <- dplyr::full_join(df, lgt_rp, by = "DEPCOM") %>%
-    dplyr::select(-"mil_RP", -"mil_RP_old", -"nb_an_evol_rp")
-  # une variable globale pour le nb d'annees d'ecart entre les mil du RP les plus récents pour le calcul des evolutions comparées RP/RPLS dans un dplyr::lag
-  ecart_an_rp <- lgt_rp$nb_an_evol_rp[1]
-  
-  # etape de construction du résultat :
-  # 1 - pour les indicateurs non sommables, on recalcule les composantes sommables
-  # 2 - pour les indicateurs à NA, on complète à 0
-  # 3 - passage des données tab_result sur le COG 2020
-  # 4 - fusion avec le fichier rp complet sur la liste des communes
-  # 5 - pour les communes non présentes dans tab_result, on met les indicateurs à 0
-  # 6 - cogification
-  # 7 - filtrage des données sur la région
-  # 8 - calcul des indicatrices pertinentes pour filtrer les données ensuite : Zone_ref et select_prov_drom
-  # 9 - recalcule des indicateurs non sommables
-  # 10 - suppression des variables non nécessaires
-  res <- tab_result %>%
-    dplyr::mutate(dplyr::across(where(is.numeric), ~ tidyr::replace_na(., 0))) %>%
-    COGiter::passer_au_cog_a_jour(garder_info_supra = FALSE) %>%
-    dplyr::full_join(lgt_rp_mil, by = c("DEPCOM", "millesime")) %>%
-    dplyr::mutate(dplyr::across(where(is.numeric), ~ tidyr::replace_na(., 0))) %>%
-    COGiter::cogifier(
-      communes = TRUE, epci = TRUE, departements = TRUE, regions = TRUE,
-      metro = TRUE, metrodrom = TRUE, franceprovince = TRUE, drom = TRUE) %>%
-    # COGiter::ajouter_zonage(zonage_df = propre.rpls::zonage_spe %>% dplyr::select(-"REG")) %>%
-    # dplyr::filter(!(TypeZone %in% c("Communes","D\u00e9partements", "EPT")) | CodeZone %in% communes_departement_a_garder)  %>%
-    # dplyr::mutate(
-    #   Zone_ref = dplyr::case_when(
-    #     .data$TypeZone == "R\u00e9gions" & .data$CodeZone == id_reg ~ TRUE,
-    #     .data$TypeZone == "D\u00e9partements" ~ TRUE,
-    #     .data$TypeZone == "France" ~ TRUE,
-    #     .data$TypeZone == "EPT" ~ TRUE,
-    #     .data$CodeZone %in% epci_choisis ~ TRUE,
-    #     TRUE ~ FALSE),
-    #   select_prov_drom = dplyr::case_when(
-  #     id_reg %in% paste0("0", 1:6) & .data$CodeZone %in% c("FRMETRO", "FRPROV") ~ FALSE,
-  #     id_reg %in% paste0("0", 1:6) & .data$TypeZone == "D\u00e9partements" ~ FALSE,
-  #     !(id_reg %in% paste0("0", 1:6)) & .data$CodeZone %in% c("DROM", "FRMETRODROM") ~ FALSE,
-  #     TRUE ~ TRUE),
-  #   TypeZone = forcats::fct_relevel(.data$TypeZone, "Communes", "Epci", "EPT", "D\u00e9partements", "R\u00e9gions", "France"),
-  #   # Mettre au bon endroit les levels ajoutes avec ajouter_zonage
-  #   CodeZone = forcats::fct_relevel(.data$CodeZone, sort)
-  # ) %>%
-  # dplyr::filter(.data$select_prov_drom) %>%
-  dplyr::arrange(.data$TypeZone,.data$Zone,.data$CodeZone,.data$millesime) %>%
-    dplyr::group_by(.data$TypeZone,.data$Zone,.data$CodeZone)
-  res2 <- res %>%
-    # reconstitution des variables intensives
-    dplyr::mutate(
-      age_moyen =  .data$age_somme / .data$nb_ls_age_connu,
-      age_moyen_qpv = .data$age_somme_qpv / .data$nb_ls_qpv_age_connu,
-      part_dpe_realise = .data$nb_ls_dpe_realise / .data$nb_ls_actif * 100,
-      age_dpe_ener_A = .data$age_somme_dpe_ener_A / .data$nb_ls_age_connu_dpe_ener_A * 100,
-      age_dpe_ener_B = .data$age_somme_dpe_ener_B / .data$nb_ls_age_connu_dpe_ener_B * 100,
-      age_dpe_ener_C = .data$age_somme_dpe_ener_C / .data$nb_ls_age_connu_dpe_ener_C * 100,
-      age_dpe_ener_D = .data$age_somme_dpe_ener_D / .data$nb_ls_age_connu_dpe_ener_D * 100,
-      age_dpe_ener_E = .data$age_somme_dpe_ener_E / .data$nb_ls_age_connu_dpe_ener_E * 100,
-      age_dpe_ener_F = .data$age_somme_dpe_ener_F / .data$nb_ls_age_connu_dpe_ener_F * 100,
-      age_dpe_ener_G = .data$age_somme_dpe_ener_G / .data$nb_ls_age_connu_dpe_ener_G * 100,
-      age_dpe_ener_new_A = .data$age_somme_dpe_ener_new_A / .data$nb_ls_age_connu_dpe_ener_new_A * 100,
-      age_dpe_ener_new_B = .data$age_somme_dpe_ener_new_B / .data$nb_ls_age_connu_dpe_ener_new_B * 100,
-      age_dpe_ener_new_C = .data$age_somme_dpe_ener_new_C / .data$nb_ls_age_connu_dpe_ener_new_C * 100,
-      age_dpe_ener_new_D = .data$age_somme_dpe_ener_new_D / .data$nb_ls_age_connu_dpe_ener_new_D * 100,
-      age_dpe_ener_new_E = .data$age_somme_dpe_ener_new_E / .data$nb_ls_age_connu_dpe_ener_new_E * 100,
-      age_dpe_ener_new_F = .data$age_somme_dpe_ener_new_F / .data$nb_ls_age_connu_dpe_ener_new_F * 100,
-      age_dpe_ener_new_G = .data$age_somme_dpe_ener_new_G / .data$nb_ls_age_connu_dpe_ener_new_G * 100,
-      densite_ls_rp = .data$nb_ls_actif * 100 / .data$nb_rp,
-      densite_ls_loues_rp = .data$nb_ls_loue * 100 / .data$nb_rp,
-      evolution_rp =  (.data$nb_rp - .data$nb_rp_old) * 100 / .data$nb_rp_old,
-      evolution_n_nmoins1 =  (.data$nb_ls_actif - dplyr::lag(.data$nb_ls_actif)) * 100 / dplyr::lag(.data$nb_ls_actif),
-      evolution_annees_rp = (.data$nb_ls_actif - dplyr::lag(.data$nb_ls_actif, ecart_an_rp)) * 100 / dplyr::lag(.data$nb_ls_actif, ecart_an_rp),
-      nb_ls_recent = .data$nb_piece_1_recent + .data$nb_piece_2_recent + .data$nb_piece_3_recent + .data$nb_piece_4_recent + .data$nb_piece_5_plus_recent,
-      part_ls_qpv = .data$nb_ls_qpv / .data$nb_ls_actif * 100,
-      part_ls_ind = .data$nb_ls_ind / .data$nb_ls_actif * 100,
-      part_ls_coll = .data$nb_ls_coll / .data$nb_ls_actif * 100,
-      part_ls_etu = .data$nb_ls_etu / .data$nb_ls_actif * 100,
-      part_ls_oph = .data$nb_ls_oph / .data$nb_ls_actif * 100,
-      part_ls_esh = .data$nb_ls_esh / .data$nb_ls_actif * 100,
-      part_ls_sem = .data$nb_ls_sem / .data$nb_ls_actif * 100,
-      part_ls_loue = .data$nb_ls_loue / .data$nb_ls_actif * 100,
-      part_ls_vacant = .data$nb_ls_vacant / .data$nb_ls_actif * 100,
-      part_ls_vide = .data$nb_ls_vide / .data$nb_ls_actif * 100,
-      part_ls_association = .data$nb_ls_association / .data$nb_ls_actif * 100,
-      part_ls_autre = .data$nb_ls_autre / .data$nb_ls_actif * 100,
-      part_ls_recent =  .data$nb_ls_recent / .data$nb_ls_actif * 100,
-      part_ls_ind_recent = .data$nb_ls_ind_recent / .data$nb_ls_recent * 100,
-      part_ls_coll_recent = .data$nb_ls_coll_recent / .data$nb_ls_recent * 100,
-      part_ls_etu_recent =  .data$nb_ls_etu_recent / .data$nb_ls_recent * 100,
-      part_ls_qpv_ind = .data$nb_ls_ind_qpv / .data$nb_ls_qpv * 100,
-      part_ls_qpv_coll = .data$nb_ls_coll_qpv / .data$nb_ls_qpv * 100,
-      part_ls_qpv_etu = .data$nb_ls_etu_qpv / .data$nb_ls_qpv * 100,
-      part_ls_1p = .data$nb_piece_1 / .data$nb_ls_actif * 100,
-      part_ls_recent_1p = .data$nb_piece_1_recent / .data$nb_ls_recent * 100,
-      part_ls_2p = .data$nb_piece_2 / .data$nb_ls_actif * 100,
-      part_ls_recent_2p = .data$nb_piece_2_recent / .data$nb_ls_recent * 100,
-      part_ls_3p = .data$nb_piece_3 / .data$nb_ls_actif * 100,
-      part_ls_recent_3p = .data$nb_piece_3_recent / .data$nb_ls_recent * 100,
-      part_ls_4p = .data$nb_piece_4 / .data$nb_ls_actif * 100,
-      part_ls_recent_4p = .data$nb_piece_4_recent / .data$nb_ls_recent * 100,
-      part_ls_5pp = .data$nb_piece_5_plus / .data$nb_ls_actif * 100,
-      part_ls_recent_5pp = .data$nb_piece_5_plus_recent / .data$nb_ls_recent * 100,
-      part_mes_qpv = .data$nb_mes_qpv / .data$nb_mes * 100,
-      part_ls_age_0_4 = .data$nb_ls_age_0_5 / .data$nb_ls_actif * 100,
-      part_ls_age_5_9 = .data$nb_ls_age_5_10 / .data$nb_ls_actif * 100,
-      part_ls_age_10_19 = .data$nb_ls_age_10_20 / .data$nb_ls_actif * 100,
-      part_ls_age_20_39 = .data$nb_ls_age_20_40 / .data$nb_ls_actif * 100,
-      part_ls_age_40_59 = .data$nb_ls_age_40_60 / .data$nb_ls_actif * 100,
-      part_ls_age_60p = .data$nb_ls_age_60_plus / .data$nb_ls_actif * 100,
-      nb_ls_loues_proploc =  .data$nb_ls_loue + .data$nb_ls_vacant,
-      taux_vacance_tot = .data$nb_ls_vacant / .data$nb_ls_loues_proploc * 100,
-      taux_vacance_str = .data$nb_ls_vacant_3 / .data$nb_ls_loues_proploc * 100,
-      taux_mobilite = .data$num_mob / .data$denom_mob *100,
-      taux_mobilite_1p = .data$num_mob_1_piece / .data$denom_mob_1_piece *100,
-      taux_mobilite_2p = .data$num_mob_2_piece / .data$denom_mob_2_piece *100,
-      taux_mobilite_3p = .data$num_mob_3_piece / .data$denom_mob_3_piece *100,
-      taux_mobilite_4p = .data$num_mob_4_piece / .data$denom_mob_4_piece *100,
-      taux_mobilite_5pp = .data$num_mob_5_piece / .data$denom_mob_5_piece *100,
-      taux_vacance_str_0_4ans = .data$num_vac_struct_age_0_5 / .data$denom_vac_struct_age_0_5 * 100,
-      taux_vacance_str_5_9ans = .data$num_vac_struct_age_5_10 / .data$denom_vac_struct_age_5_10 * 100,
-      taux_vacance_str_10_19ans = .data$num_vac_struct_age_10_20 / .data$denom_vac_struct_age_10_20 * 100,
-      taux_vacance_str_20_39ans = .data$num_vac_struct_age_20_40 / .data$denom_vac_struct_age_20_40 * 100,
-      taux_vacance_str_40_59ans = .data$num_vac_struct_age_40_60 / .data$denom_vac_struct_age_40_60 * 100,
-      taux_vacance_str_60ans_plus = .data$num_vac_struct_age_60_plus / .data$denom_vac_struct_age_60_plus * 100,
-      taux_vacance_str_qpv = .data$num_vac_struct_qpv / .data$denom_vac_struct_qpv * 100,
-      taux_vacance_str_hors_qpv = .data$num_vac_struct_horsqpv / .data$denom_vac_struct_horsqpv * 100,
-      part_mes_plai = .data$nb_plai / .data$nb_mes * 100,
-      part_mes_plus = .data$nb_plus / .data$nb_mes * 100,
-      part_mes_pls = .data$nb_pls / .data$nb_mes * 100,
-      part_mes_pli = .data$nb_pli / .data$nb_mes * 100,
-      loyer_m2_plai = .data$somme_loyer_nb_plai / .data$somme_surface_nb_plai,
-      loyer_m2_plus = .data$somme_loyer_nb_plus / .data$somme_surface_nb_plus,
-      loyer_m2_pls = .data$somme_loyer_nb_pls / .data$somme_surface_nb_pls,
-      loyer_m2_pli = .data$somme_loyer_nb_pli / .data$somme_surface_nb_pli,
-      loyer_m2_plai_recent = .data$somme_loyer_nb_plai_recent / .data$somme_surface_nb_plai_recent,
-      loyer_m2_plus_recent = .data$somme_loyer_nb_plus_recent / .data$somme_surface_nb_plus_recent,
-      loyer_m2_pls_recent = .data$somme_loyer_nb_pls_recent / .data$somme_surface_nb_pls_recent,
-      loyer_m2_pli_recent = .data$somme_loyer_nb_pli_recent / .data$somme_surface_nb_pli_recent,
-      loyer_m2_plai_mes = .data$somme_loyer_nb_plai_mes / .data$somme_surface_nb_plai_mes,
-      loyer_m2_plus_mes = .data$somme_loyer_nb_plus_mes / .data$somme_surface_nb_plus_mes,
-      loyer_m2_pls_mes = .data$somme_loyer_nb_pls_mes / .data$somme_surface_nb_pls_mes,
-      loyer_m2_pli_mes = .data$somme_loyer_nb_pli_mes / .data$somme_surface_nb_pli_mes,
-      loyer_m2 = .data$somme_loyer / .data$somme_surface,
-      loyer_m2_recent = .data$somme_loyer_recent / .data$somme_surface_recent,
-      loyer_m2_qpv = .data$somme_loyer_enqpv / .data$somme_surface_enqpv,
-      loyer_m2_mes = (.data$somme_loyer_nb_plai_mes + .data$somme_loyer_nb_plus_mes + .data$somme_loyer_nb_pls_mes + .data$somme_loyer_nb_pli_mes ) /
-        (.data$somme_surface_nb_plai_mes + .data$somme_surface_nb_plus_mes + .data$somme_surface_nb_pls_mes + .data$somme_surface_nb_pli_mes),
-      loyer_m2_0_4ans = .data$somme_loyer_age_inf_5 / .data$somme_surface_age_inf_5,
-      loyer_m2_5_9ans = .data$somme_loyer_age_5_10 / .data$somme_surface_age_5_10,
-      loyer_m2_10_19ans = .data$somme_loyer_age_10_20 / .data$somme_surface_age_10_20,
-      loyer_m2_20_39ans = .data$somme_loyer_age_20_40 / .data$somme_surface_age_20_40,
-      loyer_m2_40_59ans = .data$somme_loyer_age_40_60 / .data$somme_surface_age_40_60,
-      loyer_m2_60ans_et_plus = .data$somme_loyer_age_60_plus / .data$somme_surface_age_60_plus,
-      part_mes_qpv_plai = .data$nb_mes_plai_qpv / .data$nb_mes_qpv * 100,
-      part_mes_qpv_plus = .data$nb_mes_plus_qpv / .data$nb_mes_qpv * 100,
-      part_mes_qpv_pls = .data$nb_mes_pls_qpv / .data$nb_mes_qpv * 100,
-      part_mes_qpv_pli = .data$nb_mes_pli_qpv / .data$nb_mes_qpv * 100,
-      part_plai_acq_av_travaux = .data$nb_plai_acq_av_travaux / .data$nb_plai * 100,
-      part_plai_acq_ss_travaux = .data$nb_plai_acq_ss_travaux / .data$nb_plai * 100,
-      part_plai_acq_vefa = .data$nb_plai_acq_vefa / .data$nb_plai * 100,
-      part_plai_construit_org = .data$nb_plai_construit_org / .data$nb_plai * 100
-    ) %>%
-    dplyr::ungroup()
-  
-  return(res2)
-  
-}
diff --git a/data-raw/chargement_rpls.R b/data-raw/chargement_rpls.R
index f734009..dfe9c3e 100644
--- a/data-raw/chargement_rpls.R
+++ b/data-raw/chargement_rpls.R
@@ -3,34 +3,46 @@
 
 rm(list = ls())
 
-library(magrittr) # pour le %>% 
+library(dplyr) # pour le %>% 
+library(propre.rpls)
 
-source(file = "R/dataprep_all.R")
 
-rpls_prep <- dataprep_all() %>% 
+rpls_prep <- dataprep(nom_reg = "", choix_epci = "1- Tous les EPCI de la zone", annee = 2024) %>% 
   dplyr::filter(!is.na(millesime))
 
-# # liste des communes des EPCI de la région Pays de la Loire
-# communes_region52 <- COGiter::communes %>%
-#   dplyr::filter(grepl("52", REGIONS_DE_L_EPCI)) %>%
-#   dplyr::mutate(DEPCOM = as.character(DEPCOM))  %>%
-#   dplyr::pull(DEPCOM)
-
 rpls <- rpls_prep %>%
-  # dplyr::filter(TypeZone %in% c("Départements", "Régions", "Epci", "France") | CodeZone %in% communes_region52 ) %>%
   dplyr::mutate(
     date = lubridate::make_date(as.character(millesime), 01, 01),
-    dplyr::across(tidyselect::where(is.character), as.factor)
+    dplyr::across(tidyselect::where(is.factor), as.character)
     ) %>%
-  dplyr::select(-millesime) %>%
-  dplyr::mutate_if(is.factor, as.character)
+  dplyr::select(-millesime)
+
+# liste des variables
+liste_var_avec_libelle <- utils::read.csv2(propre.rpls::propre.rpls_file('rstudio/templates/project/ressources/extdata/dico_var.csv'), 
+                                           fileEncoding = "UTF-8")
+liste_var_avec_libelle_compl <- utils::read.csv2(propre.rpls::propre.rpls_file('rstudio/templates/project/ressources/extdata/dico_var_compl.csv'),
+                                                 fileEncoding = "UTF-8")
+liste_var_avec_libelle_rp <- utils::read.csv2(propre.rpls::propre.rpls_file('rstudio/templates/project/ressources/extdata/dico_var_rp.csv'), 
+                                              fileEncoding = "UTF-8") %>%
+  # suppression des variables sur les millésimes du RP, qui ne figurent pas dans le resultat de dataprep()
+  dplyr::filter(!(.data$nom_court %in% c("mil_RP", "mil_RP_old", "nb_an_evol_rp")))
+liste_var_avec_libelle <- dplyr::bind_rows(liste_var_avec_libelle, liste_var_avec_libelle_compl, liste_var_avec_libelle_rp) %>%
+  select(-Chapitre, -usage)
+  
+
+# verif tout ok : quels sont les noms de rpls qui ne sont pas libellés dans liste_var_avec_libelle ?
+setdiff(names(rpls), liste_var_avec_libelle$nom_court)
+# réponse attendue : "TypeZone" "Zone"     "CodeZone" "date"    
+
+readr::write_csv2(x = liste_var_avec_libelle, file = "metadata/dico_rpls.csv")
 
 # versement et documentation dans le sgbd/datamart.portrait_territoires ------
 source("R/poster_documenter_ind.R", encoding = "UTF-8")
 poster_documenter_ind(
   df = rpls,
   nom_table_sgbd = "cogifiee_rpls", 
-  comm_source_en_plus = "Chargement des donn\u00e9es sur le package propre.rpls"
+  comm_source_en_plus = "Chargement des donn\u00e9es sur le package propre.rpls",
+  nom_script_sce = "chargement_rpls"
   )
 
 rm(list = ls()) 
-- 
GitLab