From 0ffe4a6c2bbb1ee45201e7b1273a539642b60a11 Mon Sep 17 00:00:00 2001
From: "daniel.kalioudjoglou"
 <daniel.kalioudjoglou@developpement-durable.gouv.fr>
Date: Tue, 8 Apr 2025 20:34:48 +0200
Subject: [PATCH] finalisation fonction recherche code insee dans eco ptz

---
 data-raw/chargement_eco_ptz.R | 180 +++++++++++++++++-----------------
 1 file changed, 91 insertions(+), 89 deletions(-)

diff --git a/data-raw/chargement_eco_ptz.R b/data-raw/chargement_eco_ptz.R
index 85adcd3..33a0066 100644
--- a/data-raw/chargement_eco_ptz.R
+++ b/data-raw/chargement_eco_ptz.R
@@ -59,78 +59,30 @@ BASE_ECO_PTZ_DHUP<- read_delim(paste0("/nfs/data/partage-PTZ-EPTZ/PTZ-EPTZ/BASE_
                           delim = ";", escape_double = FALSE, locale = locale(decimal_mark = ","), trim_ws = TRUE)
 
 
-# suppression des années anciennes
+
 base_intermediaire <- BASE_ECO_PTZ_DHUP %>%
   mutate(DATP = str_sub(DATP,1,4)) %>% 
-  filter (DATP >= annee_conservee) %>%
+  filter (DATP >= annee_conservee) %>%  # suppression des années anciennes
   select(DATP,CINS,CPLA,VILL,NALO,TTRV,CSEN,CTA1,CTA2,CTA3,CTA4,CTA5,CTA6,CTTA1,CTTA2,CTTA3,CTTA4,CTTA5,CTTA6,CTTA7) %>%  
 # application des filtres
-# CSEN est"V" (valide)
-# si type de travaux (TTRV) = 4 (réhabilitation de système d’assainissement non collectif),
-# la nature du logement (NALO) doit être égale à 1 (maison individuelle)
-  filter(CSEN == "V") %>%
-  mutate(NALO = case_when(
-    TTRV == "4" ~ 1,
-    TRUE~ NALO)) %>% 
-  select(-CSEN,-TTRV)
-
-
-#complétage du code insee--------------------------------------------------------
-communes2 <- communes %>%                 #table des communes
-  select(DEPCOM,NOM_DEPCOM,DEP) %>% 
-  mutate(NOM_DEPCOM = toupper(NOM_DEPCOM),  #met tout en majuscules
-         NOM_DEPCOM = iconv(NOM_DEPCOM, from = "UTF-8", to = "ASCII//TRANSLIT"),   #enlève les accents
-         NOM_DEPCOM = str_replace_all (NOM_DEPCOM,"[-']"," "), #remplace les tirets et apostrophes par des espaces
-         lien = paste(DEP,NOM_DEPCOM)) %>% 
-  select(lien, DEPCOM) 
-communes2a <- communes2 %>%   #creation d'une table dans laquelle on remplace "saint" par "st"
-  mutate(lien = str_replace (lien,"SAINTES","STES"),
-         lien = str_replace (lien,"SAINTE","STE"),
-         lien = str_replace (lien,"SAINTS","STS"),
-         lien = str_replace (lien,"SAINT","ST")
-  )
-communes2b <- communes2 %>%   #creation d'une table dans laquelle on remplace "saint" par "st"
-  mutate(lien = str_replace (lien,"LE ",""),
-         lien = str_replace (lien,"LES ",""),
-         lien = ifelse(str_detect(lien,"LA LONGEVILLE"), lien, str_replace (lien,"LA ","")),
-         lien = str_replace (lien,"L ","")  
-  )
-communes2 <- rbind(communes2,communes2a,communes2b) %>% 
-  unique()
-        
-base_intermediaire2 <- base_intermediaire %>%
+  filter(CSEN == "V") %>%  # CSEN est"V" (valide)
+  mutate(NALO = case_when(  
+    TTRV == "4" ~ 1,   # si type de travaux (TTRV) = 4 (réhabilitation de système d’assainissement non collectif)
+    TRUE~ NALO)) %>%   # la nature du logement (NALO) doit être égale à 1 (maison individuelle)
+  select(-CSEN,-TTRV) %>%
+# mise au format des noms de communes  
   mutate(VILL = iconv(VILL, from = "UTF-8", to = "ASCII//TRANSLIT"),
-         VILL = toupper(VILL)) %>%   #met tout en majuscules
-  mutate(lien = paste(ifelse(str_detect(CPLA,"^97"),str_sub(CPLA,1,3),str_sub(CPLA,1,2)),VILL)) %>% # SI DOM TOM (97) , prend les 3 premiers chiffres
-  mutate(lien = str_replace (lien,"SAINTES","STES"),
-         lien = str_replace (lien,"SAINTE","STE"),
-         lien = str_replace (lien,"SAINTS","STS"),
-         lien = str_replace (lien,"SAINT","ST"),
-         lien = str_replace_all (lien,"[-']"," "), #remplace les tirets et apostrophes par des espaces
-  ) %>% 
-  left_join(communes2, by = "lien") %>%
-  mutate(CINS = case_when(
-    is.na(CINS)~ DEPCOM,
-    TRUE~ CINS))
-#fin complétage du code insee--------------------------------------------------------
-# après complétage, 1554 codes insee ne sont pas complétés
-# à compléter pour tout remplir CINS
-    
+         VILL = toupper(VILL),  #met tout en majuscules
+         VILL = str_replace (VILL,"SAINTES","STES"),
+         VILL = str_replace (VILL,"SAINTE","STE"),
+         VILL = str_replace (VILL,"SAINTS","STS"),
+         VILL = str_replace (VILL,"SAINT","ST"),
+         VILL = str_replace_all (VILL,"[-']"," ") #remplace les tirets et apostrophes par des espaces
+         )  
+  # mutate(lien = paste(ifelse(str_detect(CPLA,"^97"),str_sub(CPLA,1,3),str_sub(CPLA,1,2)),VILL)) # SI DOM TOM (97) , prend les 3 premiers chiffres
 
 #---------------------------------------------------------------------------------------------  
-
-# #test reconnaissance : marche pas
-# 
-# 
-#
-
-
-
-
-
-
-
-# FONCTION QUI CHOISIT DANS UNE LISTE LE CODE INSEE DONT LE NOM DE LA COMMUNE EST LE PLUS PROCHE
+# Fonction qui à partir du code postal et du nom de commune, même approximatif, renvoie le code Insee de la commune
 retrouve_cinsee <- function(codepostal, ville){
   library(dplyr)
   library(httr)
@@ -158,9 +110,6 @@ retrouve_cinsee <- function(codepostal, ville){
     list_com <- c_insee2 %>% pull(nom) # liste des communes avec ce code postal
     list_code <- c_insee2 %>% pull(code) # liste des codes insee
     
-    #liste des communes avec le code postal
-    liste_communes <- c(list_com,list_code)
-    
     # recherche commune avec texte le plus proche 
     library(stringdist) 
     distances <- stringdist(ville,list_com,method ="jw")
@@ -174,32 +123,85 @@ retrouve_cinsee <- function(codepostal, ville){
     return(code_insee_proche)
   }
 }
-# 
-# df <- base_intermediaire3 %>% 
-#   mutate(comm100 = mapply(retrouve_cinsee(CPLA,VILL)))
-# #
-# base_intermediaire2b <- base_intermediaire2 %>% filter(is.na(CINS))
-# vecteur <- base_intermediaire2b %>%  select(CPLA) %>% pull()
-# vecteur2 <- sapply(vecteur, retrouve_cinsee)
-# vecteur2 <- unlist(sapply(vecteur, retrouve_cinsee))
-# 
-# aaa <- retrouve_cinsee("44680")   # ça ça fonctionne, mais pas pour la colonne
-# 
-# 
-# base_intermediaire20 <- base_intermediaire %>%
-#   mutate(VILL = iconv(VILL, from = "UTF-8", to = "ASCII//TRANSLIT"),
-#          VILL = toupper(VILL))
-# base_intermediaire30 <- base_intermediaire20 %>%
-#  mutate(cinsee20 = retrouve_cinsee("35800"))
-# base_intermediaire20$code_insee <- mapply(retrouve_cinsee, base_intermediaire20$CPLA)
-# base_intermediaire20 <- base_intermediaire20 %>%
-#   mutate(code_insee = retrouve_cinsee(CPLA))
+#-Remplissage de la colonne CINS (code insee)-------------------------------------------------------------------------------------------  
+
+#  séparation table remplie et table sans les codes insee
+base_inter_manquantes <- base_intermediaire %>% filter(is.na(CINS)) %>% 
+  select(-CINS)
+base_inter_complete <- base_intermediaire %>% filter(!is.na(CINS))
+
+# recherche des codes insee (on applique la fonction)
+base_inter_manquantes$CINS <- mapply(retrouve_cinsee, 
+                                           base_inter_manquantes$CPLA, 
+                                           base_inter_manquantes$VILL)
+# ATTENTION: OPERATION TRES LONGUE (30 minutes)
+
+# transformation de la colonne du format list en format texte
+base_inter_manquantes2 <- base_inter_manquantes
+base_inter_manquantes2$CINS <- lapply(base_inter_manquantes2$CINS, function(x) if (is.null(x)|| length(x) == 0) NA else x) # remplace les NULL ou character(0) par NA
+base_inter_manquantes2$CINS <- unlist(base_inter_manquantes2$CINS, use.names = FALSE)
+
+# regroupement des tables
+base_intermediaire2 <- bind_rows(base_inter_complete,base_inter_manquantes2)
+
+# nombre de lignes avec CINS = NA
+nb_na <- base_intermediaire2 %>% filter(is.na(CINS)) %>% nrow() %>% as.numeric()
+print(paste("il reste",nb_na,"lignes avec code insee non rempli"))
+
+#-----------remplir les lignes manquantes quand on n'a que le code postal (on met la commune principale)-------------
+#  ne s'effectue que s'il reste des lignes à NA
+if(nb_na == 0){
+}else{
+  base_intermediaire2a <- base_intermediaire2 %>% filter(is.na(CINS))
+  base_intermediaire2b <- base_intermediaire2 %>% filter(!is.na(CINS))
+  
+  retrouve_cinsee_pop_max <- function(codepostal){
+    library(dplyr)
+    library(httr)
+    library(jsonlite)
+    #récupère la table des communes avec ce code postal
+    url <- "https://geo.api.gouv.fr/communes"
+    response <- GET(url, query = list(codePostal = codepostal))
+    c_insee <- fromJSON(content(response, "text"))
+    
+    if (length(c_insee) == 0) {  # si pas de code insee ou code inexistant
+      return(NA)
+      # return(data[[1]]$code)
+    } else {
+      c_insee2 <- c_insee %>%
+        as.data.frame() %>%
+        filter(population == max(population)) %>%  # filtre sur la commune à la population la plus élevée
+        pull(code)  
+      
+      return(c_insee2) #renvoie le code insee de la commune la plus peuplée
+    }
+  }
+  
+  # recherche des codes insee (on applique la fonction)
+  base_intermediaire2a$CINS <- mapply(retrouve_cinsee_pop_max,base_intermediaire2a$CPLA)
+  
+  # transformation de la colonne du format list en format texte
+  base_intermediaire2a$CINS <- lapply(base_intermediaire2a$CINS, function(x) if (is.null(x)|| length(x) == 0) NA else x) # remplace les NULL ou character(0) par NA
+  base_intermediaire2a$CINS <- unlist(base_intermediaire2a$CINS, use.names = FALSE)
+  
+  # regroupement des tables
+  base_intermediaire2 <- bind_rows(base_intermediaire2a,base_intermediaire2b)  
+}
+
+# Vérification des lignes restantes sans code insee
+nb_na <- base_intermediaire2 %>% filter(is.na(CINS)) %>% nrow() %>% as.numeric() # nombre de lignes avec CINS = NA
+print(paste("il reste",nb_na,"lignes avec code insee non rempli")) 
+if(nb_na != 0){
+  stop("il reste des codes insee non remplis, si vous continuez, les lignes correspondantes seront supprimées")
+}
+base_intermediaire2 <- base_intermediaire2 %>% filter(!is.na(CINS)) # suppression des lignes avec CINS= NA
+
 
 #---------------------------------------------------------------------------------------------  
  
 base_intermediaire3 <- base_intermediaire2 %>% 
   filter(!is.na(CINS)) %>%  # filtre pour ne garder que les lignes avec code commune
-  select(-CPLA,-VILL,-lien,-DEPCOM) %>% 
+  select(-CPLA,-VILL) %>% 
   rename(date = "DATP",DEPCOM = "CINS", type_logt = "NALO") %>%
   mutate(type_logt = case_when(
     type_logt == 1 ~ "nb_eptz.maison_individuelle",
-- 
GitLab