From 2c37f06b0dc16a86d9cdbf254c68809844a02315 Mon Sep 17 00:00:00 2001 From: "Daniel.Kalioudjoglou" <daniel.kalioudjoglou@developpement-durable.gouv.fr> Date: Wed, 26 Mar 2025 20:11:35 +0000 Subject: [PATCH] =?UTF-8?q?integration=20des=20donn=C3=A9es=20ptz=20depuis?= =?UTF-8?q?=20serveur=20rstudio=20cgdd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- R/cogifier_it.R | 6 +- R/poster_doc_post_cogifier.R | 11 +- R/poster_documenter_data.R | 34 ++-- R/poster_documenter_ind.R | 29 +-- data-raw/chargement_ptz.R | 367 +++++++++++++++++++++++++---------- data-raw/cogification_ptz.R | 70 +------ data-raw/indicateur_ptz.R | 143 ++++++++++++++ 7 files changed, 454 insertions(+), 206 deletions(-) create mode 100644 data-raw/indicateur_ptz.R diff --git a/R/cogifier_it.R b/R/cogifier_it.R index 039df16..c9f73b8 100644 --- a/R/cogifier_it.R +++ b/R/cogifier_it.R @@ -2,7 +2,7 @@ library(dplyr) library(COGiter) library(datalibaba) -cogifier_it <- function(nom_source = "besoins_chaleur_cerema", ...){ +cogifier_it <- function(nom_source = "besoins_chaleur_cerema", user = "does", serveur = NULL, secret = FALSE, ...){ df_source <- importer_data(db = "datamart", schema = "portrait_territoires", table = paste0("source_", nom_source)) %>% @@ -18,8 +18,8 @@ cogifier_it <- function(nom_source = "besoins_chaleur_cerema", ...){ pk = c("TypeZone", "Zone", "CodeZone", "date"), post_row_name = FALSE, overwrite = TRUE, - droits_schema = TRUE, - user = "does") + droits_schema = !secret, + user = user) return(df_cogifie) } diff --git a/R/poster_doc_post_cogifier.R b/R/poster_doc_post_cogifier.R index 8913a8e..5d026d6 100644 --- a/R/poster_doc_post_cogifier.R +++ b/R/poster_doc_post_cogifier.R @@ -4,17 +4,18 @@ library(dplyr) # une fonction pour propager les commentaires de tables et de champs à la table cogifiée -poster_documenter_post_cogifier <- function(source = "combustible_principal_rp") { +poster_documenter_post_cogifier <- function(source = "combustible_principal_rp", user = "does", serveur = NULL) { # creation du nom des tables tbl_source <- paste0("source_", source) tbl_cogifiee <- paste0("cogifiee_", source) # récupération des commentaires de la table source dico_var <- get_table_comments( + server = serveur, db = "datamart", schema = "portrait_territoires", table = tbl_source, - user = "does") + user = user) # commentaire de la table comm_table <- filter(dico_var, is.na(nom_col)) %>% @@ -22,11 +23,12 @@ poster_documenter_post_cogifier <- function(source = "combustible_principal_rp") gsub("\nCommentaire.*$", "", .) commenter_table( + server = serveur, comment = comm_table, db = "datamart", schema = "portrait_territoires", table = tbl_cogifiee, - user = "does" + user = user ) # commentaire des variables @@ -43,10 +45,11 @@ poster_documenter_post_cogifier <- function(source = "combustible_principal_rp") post_dico_attr( dico = comm_champ, + server = serveur, db = "datamart", schema = "portrait_territoires", table = tbl_cogifiee, - user = "does" + user = user ) } diff --git a/R/poster_documenter_data.R b/R/poster_documenter_data.R index c719eca..924d10d 100644 --- a/R/poster_documenter_data.R +++ b/R/poster_documenter_data.R @@ -1,7 +1,7 @@ library(datalibaba) library(googlesheets4) -poster_documenter_it <- function(df = pop10, nom_table_sgbd = "source_pop_rgp_insee", +poster_documenter_it <- function(df = pop10, nom_table_sgbd = "source_pop_rgp_insee", user = "does", serveur = NULL, secret = FALSE, comm_source_en_plus = "T\u00e9l\u00e9chargement depuis...") { # Vérif clé primaire : une ligne par commune et par date @@ -13,15 +13,15 @@ poster_documenter_it <- function(df = pop10, nom_table_sgbd = "source_pop_rgp_in # CHARGEMENT de la table dans le SGBD - datalibaba::poster_data(data = df, - db = "datamart", - schema = "portrait_territoires", - table = nom_table_sgbd, - post_row_name = FALSE, - overwrite = TRUE, - droits_schema = TRUE, - pk = c("depcom", "date"), # déclaration d'une clé primaire sur la table postée : on ne doit pas avoir deux lignes avec à la fois le même code commune et la meme date - user = "does") + datalibaba::poster_data(data = df, server = serveur, + db = "datamart", + schema = "portrait_territoires", + table = nom_table_sgbd, + post_row_name = FALSE, + overwrite = TRUE, + droits_schema = !secret, + pk = c("depcom", "date"), # déclaration d'une clé primaire sur la table postée : on ne doit pas avoir deux lignes avec à la fois le même code commune et la meme date + user = user) # RECUPERATION DES METADONNEES @@ -65,9 +65,9 @@ poster_documenter_it <- function(df = pop10, nom_table_sgbd = "source_pop_rgp_in "V\u00e9rifier si df contient bien toutes les variables attendues et adpatez le r\u00e9f\u00e9rentiel des indicateurs au besoin.")) - ## Envoi des libellés de variable dans le SGBD + ## Envoi des libellés de variable en commentaire de champ dans le SGBD datalibaba::post_dico_attr(dico = metadata_indicateur, table = nom_table_sgbd, schema = "portrait_territoires", - db = "datamart", user = "does") + db = "datamart", user = user, server = serveur) ## Récupération des métadonnées de la source nom_sce <- stringr::str_replace(nom_script_sce, "chargement_|ref_|specifique_", "") %>% @@ -84,12 +84,12 @@ poster_documenter_it <- function(df = pop10, nom_table_sgbd = "source_pop_rgp_in ## commentaires de la table - datalibaba::commenter_table(comment = metadata_source, - db = "datamart", - schema = "portrait_territoires", - table = nom_table_sgbd, - user = "does") + db = "datamart", + server = serveur, + schema = "portrait_territoires", + table = nom_table_sgbd, + user = user) } diff --git a/R/poster_documenter_ind.R b/R/poster_documenter_ind.R index cacdb64..25d80b0 100644 --- a/R/poster_documenter_ind.R +++ b/R/poster_documenter_ind.R @@ -2,7 +2,7 @@ library(datalibaba) library(googlesheets4) poster_documenter_ind <- function(df = indicateur_bimotor_menages, nom_table_sgbd = "indicateur_bimotor_menages", - comm_source_en_plus = "", nom_script_sce = NULL) { + comm_source_en_plus = "", nom_script_sce = NULL, user = "does", serveur = NULL, secret = FALSE) { # Vérif clé primaire : une ligne par commune et par date doublons <- df %>% @@ -14,14 +14,15 @@ poster_documenter_ind <- function(df = indicateur_bimotor_menages, nom_table_sgb # CHARGEMENT de la table dans le SGBD datalibaba::poster_data(data = df, - db = "datamart", - schema = "portrait_territoires", - table = nom_table_sgbd, - post_row_name = FALSE, - overwrite = TRUE, - droits_schema = TRUE, - pk = c("TypeZone", "CodeZone", "date"), # déclaration d'une clé primaire sur la table postée : on ne doit pas avoir deux lignes avec à la fois la même zone et la meme date - user = "does") + server = serveur, + db = "datamart", + schema = "portrait_territoires", + table = nom_table_sgbd, + post_row_name = FALSE, + overwrite = TRUE, + droits_schema = !secret, + pk = c("TypeZone", "CodeZone", "date"), # déclaration d'une clé primaire sur la table postée : on ne doit pas avoir deux lignes avec à la fois la même zone et la meme date + user = user) # RECUPERATION DES METADONNEES @@ -76,7 +77,7 @@ poster_documenter_ind <- function(df = indicateur_bimotor_menages, nom_table_sgb ## Envoi des libellés de variable dans le SGBD datalibaba::post_dico_attr(dico = metadata_indicateur, table = nom_table_sgbd, schema = "portrait_territoires", - db = "datamart", user = "does") + db = "datamart", server = serveur, user = user) ## Récupération des métadonnées de la source nom_sce <- stringr::str_replace(nom_script_sce, "chargement_|ref_|specifique_", "") %>% @@ -96,10 +97,10 @@ poster_documenter_ind <- function(df = indicateur_bimotor_menages, nom_table_sgb ## commentaires de la table datalibaba::commenter_table(comment = metadata_source, - db = "datamart", - schema = "portrait_territoires", - table = nom_table_sgbd, - user = "does") + db = "datamart", + schema = "portrait_territoires", + table = nom_table_sgbd, + user = user, server = serveur) } diff --git a/data-raw/chargement_ptz.R b/data-raw/chargement_ptz.R index f67798a..829652d 100644 --- a/data-raw/chargement_ptz.R +++ b/data-raw/chargement_ptz.R @@ -1,12 +1,10 @@ - -# chargement_ptz - +# chargement_ptz (1ere partie à exécuter sur le serveur Rstudiodu SDES) # librairies -------------- -library(readxl) library(tidyverse) -library(tricky) library(lubridate) +library(COGiter) +library(sf) library(DBI) library(RPostgreSQL) library(datalibaba) @@ -14,105 +12,264 @@ library(googlesheets4) rm(list = ls()) +# indicateurs utilisés +# cpfl = code postal +# cins = code insee +# cdco = code commune déclaré +# lcom = libéllé commune +# timm = type d'immeuble (1 = individuel, 2 = collectif) +# tope = type d'opération (neuf/ancien) +# surh = surface habitable (dans l'ancien, surface avant travaux) +# vtto = montant total de l'opération +# vtpr = montant de l'ensemble des prets +# vtpz = montant du pret à taux zero +# durt = durée total du pret à taux zero +# vtpp = montant du pret principal +# dtpp = durée totale du pret principal (mois) + +# paramêtres +millesime = 2023 #millesime du fichier +annee_conservee = 2013 # on supprime les années antérieures + + +BASE_PTZ_DHUP <- read_delim(paste0("/nfs/data/partage-PTZ-EPTZ/PTZ-EPTZ/BASE_PTZ_DHUP_",millesime,"_DREAL.csv"), + delim = ";", escape_double = FALSE, locale = locale(decimal_mark = ","), trim_ws = TRUE) + +# suppression des années anciennes +base_intermediaire <- BASE_PTZ_DHUP %>% + filter (an >= annee_conservee) %>% + # le code de statut de l’enregistrement (csen) est ‘V’ (validé) + filter (csen == "V") + + +# application de filtres conformément aux recommandations +# Dans les statistiques du bilan annuel de la SGFGAS, les données ne respectant pas ces critères +# sont considérées comme inexploitables : elles sont renseignées avec un ‘.’. +base_intermediaire <- base_intermediaire %>% + # # filtre sur le revenu annuel (rann) : non appliqué car indicateur non utilisé + # # le nombre de pièces (nppr) est inférieur ou égal à 10 : non appliqué car indicateur non utilisé + # mutate(nppr = case_when( + # nppr > 10 ~ NA, + # TRUE ~ nppr)) %>% + # la surface habitable (surh) est comprise entre 14 m2 et 350 m2 + mutate(surh = case_when( + surh < 14 ~ NA, + surh > 350 ~ NA, + TRUE ~ surh)) %>% + # # le nombre de personnes (nper) est inférieur ou égal à 10 : non appliqué car indicateur non utilisé + # mutate(nper = case_when( + # nper > 10 ~ NA, + # TRUE ~ nper)) %>% + # Pour les opérations de construction (avec ou sans l’achat du terrain, tope = 2 ou 3), + #si le type d’immeuble est collectif (timm=2), il est recommandé de le rectifier à individuel (timm=1) + mutate(timm = case_when( + timm == 2 & tope == 2 ~ 1, + timm == 2 & tope == 3 ~ 1, + TRUE ~ timm) + ) %>% +#le montant de l’opération (vtto) doit être compris entre 7 600 € et 450 000 € +mutate(vtto = case_when( #le montant de l’opération (vtto) doit être compris entre 7 600 € et 450 000 € + vtto < 7600 ~ NA, + vtto > 450000 ~ NA, + TRUE ~ vtto)) %>% +# le montant du prêt principal (vtpp) est compris entre 762 € et 350 000 € +mutate(vtpp = case_when( # le montant du prêt principal (vtpp) est compris entre 762 € et 350 000 € + vtpp < 762 ~ NA, + vtpp > 350000 ~ NA, + TRUE ~ vtpp)) %>% +# le montant de chacun des autres prêts est inférieur à 350 000 € + mutate(vtpz = case_when( # le montant du prêt à taux zéro (vtpz) est inférieur à 350 000 € + vtpz > 350000 ~ NA, + TRUE ~ vtpz)) %>% +# la durée des prêts (hors PTZ) est comprise entre 24 mois et 480 mois + mutate(dtpp = case_when( # la durée du prêt principal (dtpp) est compris entre 24 mois et 480 mois + dtpp < 24 ~ NA, + dtpp > 480 ~ NA, + TRUE ~ dtpp)) %>% +# le montant des travaux (vttr) est inférieur au coût de l’opération : non appliqué car indicateur non utilisé +# +# # le montant total des prêts (vtpr) est inférieur à 450 000 € et doit être supérieur à la somme des montants du prêt principal (vtpp) et du prêt à taux zéro (vtpz) +mutate(vtpr = case_when( + vtpr >= 450000 ~ NA, + vtpr < vtpp + vtpz ~ NA, + TRUE ~ vtpr)) +# le montant total de la première mensualité tous prêts confondus (vt1e) est comprise entre 15 € et 2 287 € : non appliqué car indicateur non utilisé +# +# le TEG du PTZ (tegz) est inférieur 12% : non appliqué car indicateur non utilisé +# +# les autres taux sont compris entre 1% et 12%, sauf à compter de 2017 où les taux peuvent être proche de 0% : non appliqué car indicateur non utilisé +# +# la durée du différé du prêt principal (ddpp) est inférieure à 60 mois : non appliqué car indicateur non utilisé +# + +# # filtres supplémentaires sur les montants +# base_intermediaire <- base_intermediaire %>% +# mutate(vtpr = case_when( +# vtpr < vtpp ~ NA, +# TRUE ~ vtpr)) %>% +# mutate(vtpp = case_when( +# vtpp < vtpz ~ NA, +# TRUE ~ vtpp)) + +base <- base_intermediaire %>% + # cpfl = code postal , cins = code insee, cdco = code commune déclaré + # lcom = libéllé commune, timm = type logement (1 = individuel, 2 = collectif) + # tope = type d'opération : + # 1 : achat neuf + # 2 : Construction de maison individuelle (achat du terrain compris) + # 3 : Construction de maison individuelle (hors achat du terrain) + # 4 : Acquisition amélioration pour les acquisitions seules + # 5 : Transformation de locaux non destinés à l’habitation en logement + # 6 : Levée d’option en location-accession, pour le 1er locataire + # 7 : Acquisition d’un logement avec travaux de remise à neuf + select (cpfl,cins,cdco,lcom,timm,tope,an,surh,vtto,vtpr,vtpp,vtpz,dtpp,durt) %>% + mutate(type_logt = case_when( + timm == 1 ~ "individuel", + timm == 2 ~ "collectif", + TRUE ~ "type_non_renseigne"), + etat_logt = case_when( + tope %in% c(1,2,3) ~ "neuf", + tope %in% c(4,5,6,7) ~ "ancien", + TRUE ~ "etat_non_renseigne") + ) %>% + rename(code_insee = cins) %>% + arrange(code_insee) + +# dénombrement croisements type et état +ptz_detail <- base %>% + group_by(an,code_insee,type_logt,etat_logt) %>% + summarise(valeur = length(code_insee)) %>% + ungroup() %>% + mutate(variable = paste0("nb_ptz.",type_logt,".",etat_logt)) %>% + select(code_insee,an,variable,valeur) %>% + pivot_wider(names_from = variable , + values_from = valeur) + +# dénombrement par type +ptz_type <- base %>% + group_by(an,code_insee,type_logt) %>% + summarise(valeur = length(code_insee)) %>% + ungroup() %>% + mutate(variable = paste0("nb_ptz.",type_logt)) %>% + select(code_insee,an,variable,valeur) %>% + pivot_wider(names_from = variable , + values_from = valeur) + +# dénombrement par état +ptz_etat <- base %>% + group_by(an,code_insee,etat_logt) %>% + summarise(valeur = length(code_insee) + ) %>% + ungroup() %>% + mutate(variable = paste0("nb_ptz.",etat_logt)) %>% + select(code_insee,an,variable,valeur) %>% + pivot_wider(names_from = variable , + values_from = valeur) + + +# prix total de l'opération (vtto) et surface (surh), pour le neuf +# Ces 2 variables ne seront utilisées que pour le calcul du prix au m2 de l'opération. +# La surface dans l'ancien (surh) étant la surface avant travaux et non la surface des travaux, +# le prix au m2 de l'opération ne sera calculé que pour le neuf (à partir du prix total +# de l'opération (vtto)). On ne calcule donc ces 2 variables que pour le neuf. +# De plus, le prix au m2 ne sera calculé que lorsque les 2 valeurs seront présentes. On filtre pour enlever les cas comportant NA. +ptz_etat_neuf <- base %>% + filter(etat_logt == "neuf", + !is.na(surh), + !is.na(vtto)) %>% + group_by(an,code_insee,etat_logt) %>% + summarise(n_vtto_neuf = sum(!is.na(vtto)), # nombre de vtto et de surfaces + vtto_neuf = sum(vtto,na.rm = TRUE), # prix total des opérations + # n_surh_neuf = sum(!is.na(surh)), + surh_neuf = sum(surh,na.rm = TRUE) # surfaces totales des opérations + ) %>% + ungroup() %>% + select(-etat_logt) + +# dénombrement total +ptz_total <- base %>% + group_by(an,code_insee) %>% + summarise(nb_ptz.total = length(code_insee), + # n_vtto = sum(!is.na(vtto)), # montant total des opérations: fait que pour le neuf + # vtto = sum(vtto,na.rm = TRUE), + n_vtpr = sum(!is.na(vtpr)), # nb de prets concernés par vtpr + vtpr = sum(vtpr,na.rm = TRUE), # valeur totale de l'ensemble des prets + n_vtpz = sum(!is.na(vtpz)), # nb de prets concernés par vtpz + vtpz = sum(vtpz,na.rm = TRUE), # valeur totale des ptz + n_vtpp = sum(!is.na(vtpp)), # nb de prets concernés par vtpp + vtpp = sum(vtpp,na.rm = TRUE), # valeur totale des prets principaux + n_durt = sum(!is.na(durt)), # nb de prets concernés par durt + durt = sum(durt,na.rm = TRUE), # durée totale des ptz + n_dtpp = sum(!is.na(dtpp)), # nb de prets concernés par dtpp + dtpp = sum(dtpp,na.rm = TRUE) # durée totale des prets principaux + ) + +# recapitulatif +ptz <- ptz_detail %>% + left_join(ptz_type, by = c("code_insee","an")) %>% + left_join(ptz_etat, by = c("code_insee","an")) %>% + left_join(ptz_total, by = c("code_insee","an")) %>% + left_join(ptz_etat_neuf, by = c("code_insee","an")) %>% + rename(date = an, DEPCOM=code_insee) %>% + mutate(date=make_date(date,12,31)) %>% + filter(!str_starts(DEPCOM,"97"),!str_starts(DEPCOM,"98"))%>% + pivot_longer(-c(DEPCOM, date), names_to = "variable", values_to = "valeur" ) + +rm(ptz_detail,ptz_etat,ptz_type,ptz_total,ptz_etat_neuf, base, base_intermediaire) + + +# liste des communes de France +liste_communes_france <- communes %>% + filter(!str_starts(DEPCOM,"97"), !str_starts(DEPCOM,"98"))%>% + select(DEPCOM) %>% pull() %>% as.character() + +ptz <- passer_au_cog_a_jour(ptz, code_commune = DEPCOM, aggrege = TRUE, garder_info_supra = FALSE, na.rm = FALSE) %>% + mutate(DEPCOM = forcats::fct_drop(DEPCOM)) %>% # enlève les facteurs inutiles + mutate(DEPCOM = fct_expand(DEPCOM, liste_communes_france)) %>% + complete(DEPCOM, date, variable, fill = list(valeur = 0)) %>% + mutate(DEPCOM = as.character(DEPCOM)) %>% + rename(depcom=DEPCOM) %>% + pivot_wider(names_from = variable, values_from = valeur) + +# versement dans le sgbd EcoSQL/datamart.portrait_territoires ------------- + +source("R/poster_documenter_data.R", encoding = "UTF-8") +poster_documenter_it( + df = ptz, + nom_table_sgbd = "source_ptz", + comm_source_en_plus = "Données chargées depuis le serveur RStudio du SDES pour les DREALs", + secret = TRUE, + user = "ecosql_stat", + serveur = Sys.getenv("server_ecosql") +) + + +#------------------------------------------------------------------------------------------------------------------ +#------------------------------------------------------------------------------------------------------------------ +# 2e partie, à éxécuter sur le PC de bureau (hors serveur SDES) +#------------------------------------------------------------------------------------------------------------------ +#------------------------------------------------------------------------------------------------------------------ + +# librairies ------ +library(dplyr) +library(COGiter) +library(datalibaba) + +rm(list = ls()) +source("R/poster_documenter_data.R", encoding = "UTF-8") + +# récupération des données sur EcoSQL +ptz <- importer_data(db = "datamart", + schema = "portrait_territoires", + table = "source_ptz", + user = "ecosql_stat", + server = Sys.getenv("server_ecosql")) -# chargement et calcul --------- -# chargement des données PTZ (Prêts à Taux Zéro) -------- -# fichier cree a partir d une requete geokit 3 : -# "Dossiers publics/geokit3/Regions Pays de la Loire/DREAL/INDICATEURS TER DATA LAB/gk3_ptz" -ptz <-bind_rows(read_excel("extdata/gk3_ptz.xlsx",sheet=1), - read_excel("extdata/gk3_ptz.xlsx",sheet=2), - read_excel("extdata/gk3_ptz.xlsx",sheet=3), - read_excel("extdata/gk3_ptz.xlsx",sheet=4)) - -names(ptz)<-c("depcom","date","typlog","etatlog","statutlog","valeur") -ptz$variable<-paste(substr(ptz$typlog,1,1),substr(ptz$etatlog,1,1),substr(ptz$statutlog,1,1),sep="") -ptz<-ptz %>% - select(depcom,date,variable,valeur) %>% - complete(date,depcom,variable) %>% - mutate_all(funs(ifelse(is.na(.),0,.))) - -ptz<-rbind( - cbind(aggregate(valeur~depcom+date,ptz,sum),variable="nb_ptz.total"), - cbind(aggregate(valeur~depcom+date,ptz[ptz$variable>100 & ptz$variable<200,],sum),variable="nb_ptz.individuel"), - cbind(aggregate(valeur~depcom+date,ptz[ptz$variable>200,],sum),variable="nb_ptz.collectif"), - cbind(aggregate(valeur~depcom+date,ptz[substr(ptz$variable,2,2)==1,],sum),variable="nb_ptz.ancien"), - cbind(aggregate(valeur~depcom+date,ptz[substr(ptz$variable,2,2)==2,],sum),variable="nb_ptz.neuf")) %>% - # filter(date>=2008)%>% - mutate(date=make_date(date,12,31))%>% - mutate_if(is.character,as.factor) %>% - complete(depcom,date,variable,fill = list(valeur = 0)) %>% - pivot_wider(names_from = variable,values_from = valeur) - - -# versement dans le sgbd/datamart.portrait_territoires ------------- -poster_data(data = ptz, - db = "datamart", - schema = "portrait_territoires", - table = "source_ptz", - post_row_name = FALSE, - overwrite = TRUE, - droits_schema = TRUE, - pk = c("depcom", "date"), # déclaration d'une clé primaire sur la table postée : on ne doit pas avoir deux lignes avec à la fois le même code commune et la meme date - user = "does") - -# METADONNEES------------------------------------ - -## On récupère la liste des variables qui sont à documenter dans le tableur google sheet à partir du jeu de données posté -var <- setdiff(names(ptz), c("depcom", "date")) - -## récupération du nom du présent script source pour filtrer ensuite le référentiel des indicateurs -nom_script_sce <- rstudioapi::getActiveDocumentContext()$path %>% # utilisation de rstudioapi pour récupérer le nom du présent script - basename() %>% # on enlève le chemin d'accès pour ne garder que le nom du fichier - gsub(pattern = ".R$", "", .) # on enlève l'extension '.R' - -## authentification google sheet grâce au .Renviron -gs4_auth_configure(api_key = Sys.getenv("google_api_key")) -gs4_deauth() - - - -## chargement du référentiel indicateurs google sheet -metadata_indicateur <- read_sheet("https://docs.google.com/spreadsheets/d/1n-dhtrJM3JwFVz5WSEGOQzQ8A0G7VT_VcxDe5gh6zSo/edit#gid=60292277", - sheet = "indicateurs") %>% - # on ne garde que les variables concernées par le présent script de chargement - filter(source == nom_script_sce) %>% - # on ajoute l'unité dans le libellé de la variable - mutate(libelle_variable = paste0(libelle_variable, " (unit\u00e9 : ", unite, ")")) %>% - select(variable, libelle_variable) %>% - # ajout des libellés pour depcom et date - bind_rows( - tribble( - ~variable, ~libelle_variable, - "depcom", "Code INSEE de la commune", - "date", "Millesime" - ) - ) - -## Vérification que la documentation des indicateurs est complète -all(var %in% metadata_indicateur$variable) # doit renvoyer TRUE - -## Envoi des libellés de variable dans le SGBD -post_dico_attr(dico = metadata_indicateur, table = "source_ptz", schema = "portrait_territoires", - db = "datamart", user = "does") - -## Récupération des métadonnées de la source -nom_sce <- str_replace(nom_script_sce, "chargement_|ref_|specifique_", "") %>% - str_replace("indicateur_", "") %>% - str_replace("_cogiter|_cog$", "") - -metadata_source <- read_sheet("https://docs.google.com/spreadsheets/d/1n-dhtrJM3JwFVz5WSEGOQzQ8A0G7VT_VcxDe5gh6zSo/edit#gid=60292277", - sheet = "sources") %>% - filter(source == nom_sce) %>% - mutate(com_table = paste0(source_lib, " - ", producteur, ".\n", descriptif_sources)) %>% - pull(com_table) %>% - # ajout de complement sur la généalogie - paste0(".\n", "Chargement des donn\u00e9es sur Geokit3") - -## commentaires de la table - -commenter_table(comment = metadata_source, - db = "datamart", - schema = "portrait_territoires", - table = "source_ptz", - user = "does") +# versement des données sur SGBD DREAL +poster_documenter_it( + df = ptz, + nom_table_sgbd = "source_ptz", + comm_source_en_plus = "Données chargées depuis le serveur RStudio du SDES pour les DREALs", + secret = TRUE +) diff --git a/data-raw/cogification_ptz.R b/data-raw/cogification_ptz.R index fe76802..0317a79 100644 --- a/data-raw/cogification_ptz.R +++ b/data-raw/cogification_ptz.R @@ -1,72 +1,16 @@ - -# cogification_ptz - +# cogification_ptz (a exécuter dans le contexte DREAL, tant que tout le datamart n'est pas passé sur EcoSQL) # librairies ------ -library(DBI) -library(RPostgreSQL) library(dplyr) library(COGiter) library(datalibaba) rm(list = ls()) +source("R/cogifier_it.R") +source("R/poster_doc_post_cogifier.R") -source_ptz <- importer_data(db = "datamart", - schema = "portrait_territoires", - table = "source_ptz") - -cogifiee_ptz<-cogifier(source_ptz %>% rename(DEPCOM=depcom))%>% - mutate_if(is.factor,as.character) - -poster_data(data = cogifiee_ptz, - db = "datamart", - schema = "portrait_territoires", - table = "cogifiee_ptz", - pk = c("TypeZone", "Zone", "CodeZone", "date"), - post_row_name = FALSE, - overwrite = TRUE, - droits_schema = TRUE, - user = "does") - -# commentaires de la table et des variables ------------- - -# récupération des commentaires de la table source -dico_var <- get_table_comments( - db = "datamart", - schema = "portrait_territoires", - table = "source_ptz", - user = "does") - -# commentaire de la table -comm_table <- filter(dico_var, is.na(nom_col)) %>% - pull(commentaire) %>% - gsub("\nCommentaire.*$", "", .) - -commenter_table( - comment = comm_table, - db = "datamart", - schema = "portrait_territoires", - table = "cogifiee_ptz", - user = "does" -) - -# commentaire des variables -comm_champ <- select(dico_var, nom_col, commentaire) %>% - filter(!is.na(nom_col), nom_col != "depcom") %>% - bind_rows( - tribble( - ~nom_col, ~commentaire, - "TypeZone", "Type de territoire", - "Zone", " Nom du territoire", - "CodeZone", "Code INSEE du territoire" - ) - ) - -post_dico_attr( - dico = comm_champ, - db = "datamart", - schema = "portrait_territoires", - table = "cogifiee_ptz", - user = "does" -) +# cogification et versement des données cogifiées dans le SGBD +cogifier_it(nom_source = "ptz", secret = TRUE) +# versement dans le sgbd/datamart.portrait_territoires et metadonnee ------------- +poster_documenter_post_cogifier(source = "ptz") diff --git a/data-raw/indicateur_ptz.R b/data-raw/indicateur_ptz.R new file mode 100644 index 0000000..4158041 --- /dev/null +++ b/data-raw/indicateur_ptz.R @@ -0,0 +1,143 @@ +# secret_ptz et creation des indicateurs (a exécuter dans le contexte DREAL, tant que tout le datamart n'est pas passé sur EcoSQL) + +# librairies ------------- +library(dplyr) +library(tidyr) +library(lubridate) +library(COGiter) +library(DBI) +library(RPostgreSQL) +library(datalibaba) +library(googlesheets4) +library(purrr) +library(stringr) + +rm(list=ls()) + +# chargement data ------------- +cogifiee_ptz <- importer_data(db = "datamart", schema = "portrait_territoires", table = "cogifiee_ptz") + +data_cogifiee <- pivot_longer(cogifiee_ptz, + cols = dtpp : vtto_neuf, + names_to = "variable", + values_to = "valeur") %>% + mutate_if(is.character,as.factor) + +## création de la table de correspondance des variables de secrétisation (plus simple à comprendre pour le relecteur du code) +tranches_ptz <- tribble( + ~variable, ~variable_associee, + 'dtpp', 'n_dtpp', + 'durt', 'n_durt', + 'vtpp', 'n_vtpp', + 'vtpr', 'n_vtpr', + 'vtpz', 'n_vtpz', + 'vtto_neuf', 'n_vtto_neuf', + 'surh_neuf', 'n_vtto_neuf' + ) + + +# table des données publiques -----pas utilisée pour les indicateurs----------------------- +# data_publique <- data_cogifiee %>% +# filter(grepl("^nb_ptz", variable)) %>% +# pivot_wider(names_from = variable, values_from = valeur) + + +# table des données à secrétiser ------------------------------------------------------------ +data_ptz_B <- data_cogifiee %>% + filter (!grepl("^nb_ptz",variable)) + +# distinction des données à secrétiser +# table des valeurs +data_ptz_B1 <- data_ptz_B %>% + filter (!grepl("^n_",variable)) +data_ptz_B1$variable_associe <- tranches_ptz$variable_associee[match(data_ptz_B1$variable,tranches_ptz$variable)] +data_ptz_B1 <- data_ptz_B1 %>% + mutate(code_ident=paste(TypeZone,CodeZone,date,variable_associe)) #création d'une colonne pour identifier zone, année et variable + +# table des nombres +data_ptz_B2 <- data_ptz_B %>% + filter (grepl("^n_",variable))%>% + mutate(code_ident=paste(TypeZone,CodeZone,date,variable)) #création d'une colonne pour identifier zone, année et variable + +# regroupement tables B1 et B2 ---------- +data_ptz_B1$nombre_prets <- data_ptz_B2$valeur[match(data_ptz_B1$code_ident,data_ptz_B2$code_ident)] +data_ptz_B<-data_ptz_B1 %>% + select(-variable_associe,-code_ident) + +data_ptz_B <- left_join(data_ptz_B, liste_zone, by= c("CodeZone","TypeZone","Zone")) %>% + mutate(DEP = map_chr(DEP, ~ paste(.x, collapse =","))) %>% # concatène les departements pour les Epci sur plusieurs départements + mutate(REG = map_chr(REG, ~ paste(.x, collapse =","))) %>% # concatène les régions pour les Epci sur plusieurs régions + mutate (zonage_supra = case_when( #affichage du zonage supra pour regroupements + TypeZone =="Communes" ~ EPCI, + TypeZone =="Epci" ~ DEP, + TypeZone =="Départements" ~ REG, + TypeZone =="Régions" ~ "FRANCE", + TRUE ~ NA)) + +#secret induit, pour une meme variable et un meme zonage supra, pour ne pas retrouver la valeur d'une zone +#en faisant la somme des autres zones +data_secret<-data_ptz_B %>% + select(-EPCI,-DEP,-REG,-NATURE_EPCI) %>% + mutate(nombre_prets2 = na_if(nombre_prets, 0)) %>% + group_by(TypeZone,variable,zonage_supra,date) %>% + mutate(A_nb_sup0_inf11=length(which(nombre_prets2<11)), #compte combien inférieur à 11 + A_rang=rank(nombre_prets2, ties.method = "first")) %>% #classe pour repérer les 2 plus petites valeurs + mutate(secret = case_when( + nombre_prets2<11 ~ 1, #secret pour toutes les nb_obs inférieurs à 11 + zonage_supra == "ZZZZZZZZZ" ~ 0, # pas de secret induit pour les communes qui ne sont pas dans un epci + A_nb_sup0_inf11==1 & A_rang <3 ~ 1, #secret sur les 2 communes avec valeurs les plus basses + TRUE ~ 0)) %>% + ungroup() +data_secret <-data_secret %>% #remplacement par NA si secret + mutate(valeur = case_when( + secret == 1 ~ NA, + TRUE ~ valeur) + ) %>% + mutate(nombre_prets = case_when( + secret == 1 ~ NA, + TRUE ~ nombre_prets) + ) %>% + select(TypeZone,Zone,CodeZone,date,variable,valeur,nombre_prets) + +# création des indicateurs calculés------------------------------------------------------------------------------------------ + +# cacul des indicateurs montant et durée moyens +data_indicateurs1 <- data_secret %>% + filter(variable != "surh_neuf" & variable != "vtto_neuf") %>% + mutate(valeur2 = round(valeur/nombre_prets,0)) %>% + # mutate(valeur2 = na_if(valeur2,NaN)) %>% + select(-valeur,-nombre_prets) %>% + mutate(variable=str_replace(variable,"dtpp","dur_moy_pp"), + variable=str_replace(variable,"durt","dur_moy_ptz"), + variable=str_replace(variable,"vtpp","mont_moy_pp"), + variable=str_replace(variable,"vtpz","mont_moy_ptz"), + variable=str_replace(variable,"vtpr","mont_moy_prets") + ) %>% + pivot_wider(names_from = variable, values_from = valeur2) + +# cacul de l'indicateur prix au m2 de l'opération pour le neuf +data_indicateurs2 <- data_secret %>% + filter(variable %in% c("surh_neuf","vtto_neuf")) %>% + select(-nombre_prets) %>% + pivot_wider(names_from = variable, values_from = valeur) %>% + mutate(prix_m2_op.neuf = round(vtto_neuf/surh_neuf,0)) %>% + # mutate(prix_m2_op.neuf = na_if(prix_m2_op.neuf,NaN)) %>% + select(-vtto_neuf,-surh_neuf) + +# REGROUPEMENT DES DONNEES------------------------------------------------------------------------------------------ + +indicateur_ptz <- data_indicateurs1 %>% + # left_join(data_publique,by =c("TypeZone","Zone","CodeZone","date")) %>% + left_join(data_indicateurs2,by =c("TypeZone","Zone","CodeZone","date")) %>% + mutate_if(is.factor,as.character) + +# save(indicateur_ptz, file="ptz_indicateur.RData") + +# versement dans le sgbd/datamart.portrait_territoires et metadonnées --------- +source("R/poster_documenter_ind.R", encoding = "UTF-8") +poster_documenter_ind( + df = indicateur_ptz, + nom_table_sgbd = "indicateur_ptz", + comm_source_en_plus = "Chargement des donn\u00e9es sur serveur rstudio CGDD" +) + -- GitLab