Skip to content

Commit

Permalink
Merge pull request #13 from cbobinec/fix_new_catalog
Browse files Browse the repository at this point in the history
Adaptations au nouveau portail des API et au retour JSON structuré différemment
  • Loading branch information
FaureME authored Dec 17, 2024
2 parents c4e3668 + 2e7dbe9 commit 54685a1
Show file tree
Hide file tree
Showing 8 changed files with 139 additions and 181 deletions.
7 changes: 3 additions & 4 deletions DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Package: inseeLocalData
Title: Accès aux données locales de l'Insee via le catalogue des API
Version: 0.0.0.9000
Version: 0.0.2
Authors@R:
c(person(given = "Marie-Emmanuelle",
family = "FAURE",
Expand All @@ -13,14 +13,13 @@ License: GPL-3
Encoding: UTF-8
LazyData: true
Roxygen: list(markdown = TRUE)
RoxygenNote: 7.1.1
RoxygenNote: 7.3.1
Language: fr
Suggests:
rstudioapi,
testthat,
vcr
Imports:
dplyr,
Imports:
httr,
stringr,
jsonlite,
Expand Down
7 changes: 7 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# inseeLocalData 0.0.2
- Prise en compte des impacts dus au changement de portail des API :
- Changement d'URL (plus de V0.1)
- Plus besoin de token
- Structure du retour JSON légèrement différent

# inseeLocalData 0.0.1
97 changes: 30 additions & 67 deletions R/get_dataset.R
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#' Fonction permettant d'importer les données de l'API 'données locales' pour un couple de paramètre
#'
#' @param jeton Access token (jeton) généré sur le catalogue des API de l'Insee
#' @param jeu_donnees code jeu de données se composant du nom de la source, du millésime des données et parfois du millésime géographique de diffusion
#' @param croisement sélection de variables (composée d'une variable ou de plusieurs)
#' @param modalite modalités souhaitées pour les variables (dans le même ordre)
Expand All @@ -18,36 +17,7 @@
#'
#' @examples
#' \donttest{
#' # Remplace jeton par la valeur du jeton genere sur le catalogue des API :
#' if (exists("jeton")) {
#' get_dataset(jeton,
#' "GEO2017REE2017",
#' "NA5_B-ENTR_INDIVIDUELLE",
#' "all.all",
#' "COM",
#' "51108")
#' }
#'
#' # Genere une fenetre dans laquelle vous pouvez renseigner le jeton genere sur le catalogue des API
#' # Permet de ne pas stocker le jeton en clair dans le programme
#' if (interactive() && identical(Sys.getenv("RSTUDIO"), "1")) {
#' get_dataset(rstudioapi::askForPassword("jeton:"),
#' "GEO2017REE2017",
#' "NA5_B-ENTR_INDIVIDUELLE",
#' "all.all",
#' "COM",
#' "51108")
#' }
#'
#' # Necessite la modification du fichier .Renviron en ajoutant
#' # une ligne jeton = "la valeur du jeton genere sur le catalogue des API"
#' # Pour acceder facilement au fichier .Renviron, vous pouvez
#' # utiliser la commande usethis::edit_r_environ("user")
#' # Necessite de redemarer R après avoir fait la modification
#' # Ce parametre doit etre mis a jour à chaque fois qu'un nouveau jeton est genere
#' if (!is.na(Sys.getenv("jeton", NA))) {
#' get_dataset(Sys.getenv("jeton"),
#' "GEO2017REE2017",
#' get_dataset("GEO2017REE2017",
#' "NA5_B-ENTR_INDIVIDUELLE",
#' "all.all",
#' "COM",
Expand All @@ -56,25 +26,20 @@



get_dataset <- function(jeton, jeu_donnees, croisement, modalite, nivgeo, codgeo, temporisation = NA){
get_dataset <- function(jeu_donnees, croisement, modalite, nivgeo, codgeo, temporisation = NA){

modalite <- stringr::str_replace_all(modalite, '\\+', '%2B')

auth_header <- httr::add_headers('Authorization'= paste('Bearer',jeton))
req <- paste0("https://api.insee.fr/donnees-locales/donnees/geo-",
croisement, "@", jeu_donnees, "/", nivgeo, "-", codgeo, ".", modalite)

res <- httr::content(httr::GET(paste0("https://api.insee.fr/donnees-locales/V0.1/donnees/geo-",
croisement, "@", jeu_donnees, "/", nivgeo, "-", codgeo, ".", modalite),
auth_header),
message(req)

res <- httr::content(httr::GET(req),
as="text", httr::content_type_json(), encoding='UTF-8')

if (stringr::str_detect(res, "Invalid Credentials. Make sure you have given the correct access token")){
print('Erreur - Jeton invalide')
} else if (stringr::str_detect(res, "Aucune cellule ne correspond a la requ\u00eate")){
if (stringr::str_detect(res, "Aucune cellule ne correspond a la requ\u00eate")){
print('Erreur - Param\u00e8tre(s) de la requ\u00eate incorrect(s)')
} else if (stringr::str_detect(res, "Resource forbidden ")){
print("Erreur - Scouscription a l API donn\u00e9es locales non r\u00e9alis\u00e9e")
} else if (stringr::str_detect(res, "quota")==T){
print("Erreur- Trop de requ\u00eates, faire une pause")
} else{

res <- jsonlite::fromJSON(res)
Expand All @@ -86,46 +51,46 @@ get_dataset <- function(jeton, jeu_donnees, croisement, modalite, nivgeo, codgeo
nb_var <- stringr::str_count(croisement, "-") + 1

zone <- res$Zone
info_zone <- as.data.frame(cbind(zone$'@codgeo',zone$'@nivgeo',do.call("cbind", zone$Millesime)), stringsAsFactors = FALSE)
colnames(info_zone) <- c("codgeo","libgeo","millesime_geo","libelle_sans_article","code_article")
info_zone <- as.data.frame(cbind(zone$'codgeo',zone$'nivgeo', stringsAsFactors = FALSE))
colnames(info_zone) <- c("codgeo","libgeo")

croisement <- res$Croisement
source <- as.data.frame(do.call("cbind", croisement$JeuDonnees), stringsAsFactors = FALSE)
colnames(source) <- c("jeu_donnees", "millesime_donnees", "lib_jeu_donnees","lib_source")

source <- cbind(source, info_zone$millesime_geo)
colnames(source)[colnames(source) =="info_zone$millesime_geo"] <- "millesime_geo"
source$source <- paste0("Insee, ", source$lib_source, " ", source$millesime_donnees,
", g\u00e9ographie au 01/01/", source$millesime_geo)
colnames(source) <- c("code", "Libelle", "Annee","Source")

variable <- res$Variable
temp <- variable$Modalite
info_modalite <- as.data.frame(cbind(variable$'@code',variable$Libelle), stringsAsFactors = FALSE)
info_modalite <- as.data.frame(cbind(variable$'code',variable$Libelle), stringsAsFactors = FALSE)

liste_code <- NULL
if (nb_var > 1) {
for (i in 1:length(temp)) {
if (dim(as.data.frame(temp[[i]]))[1]>1){
liste_code_temp <- data.frame(info_modalite[i,]$V1, info_modalite[i,]$V2, temp[[i]][,'@code'], temp[[i]][,'Libelle'],
liste_code_temp <- data.frame(info_modalite[i,]$V1,
info_modalite[i,]$V2,
temp[[i]][,'code'],
stringsAsFactors = FALSE)
colnames(liste_code_temp) <- c("variable", "lib_varible", "modalite", "lib_modalite")
colnames(liste_code_temp) <- c("variable", "lib_variable", "modalite")
} else {
liste_code_temp <- data.frame(info_modalite[i,]$V1, info_modalite[i,]$V2,temp[[i]]['@code'],temp[[i]]['Libelle'],stringsAsFactors = FALSE)
colnames(liste_code_temp) <- c("variable", "lib_varible", "modalite", "lib_modalite")
liste_code_temp <- data.frame(info_modalite[i,]$V1,
info_modalite[i,]$V2,
temp[[i]]['code'],
stringsAsFactors = FALSE)
colnames(liste_code_temp) <- c("variable", "lib_variable", "modalite")
}

liste_code <- rbind(liste_code_temp, liste_code)
}
} else {
if (dim(as.data.frame(temp))[1]>1){
liste_code <- data.frame(cbind(info_modalite,temp[,'@code'], temp[,'Libelle']),
liste_code <- data.frame(cbind(info_modalite,temp[,'code']),
stringsAsFactors = FALSE)
} else {
liste_code <- data.frame(cbind(info_modalite,temp['@code'], temp['Libelle']),
liste_code <- data.frame(cbind(info_modalite,as.data.frame(temp)$code),
stringsAsFactors = FALSE)
}

colnames(liste_code) <- c("variable", "lib_varible", "modalite", "lib_modalite")
colnames(liste_code) <- c("variable", "lib_variable", "modalite")
}

cellule <- as.data.frame(res$Cellule)
Expand All @@ -138,24 +103,22 @@ get_dataset <- function(jeton, jeu_donnees, croisement, modalite, nivgeo, codgeo
}
colnames(var_tot) <- c(t(var[[1]][2]))

donnees <- cbind(cellule$Zone, cellule$Mesure, var_tot, cellule$Valeur)
colnames(donnees) <- c("codgeo", "nivgeo", "mesure", "lib_mesure", c(t(var[[1]][2])), "valeur")
donnees <- cbind(cellule$Zone$codgeo, cellule$Zone$nivgeo, var_tot, cellule$Valeur)
colnames(donnees) <- c("codgeo", "nivgeo", c(t(var[[1]][2])), "valeur")

donnees <- as.data.frame(donnees)

} else {
if (dim(as.data.frame(cellule))[1]>1){
donnees <- do.call("cbind",cellule)
donnees <- data.frame(donnees[,'Zone.@codgeo'], donnees[,'Zone.@nivgeo'],
donnees[,'Mesure.@code'], donnees[,'Mesure.$'],
donnees[,'Modalite.@code'], donnees[,'Valeur'], stringsAsFactors = FALSE)
colnames(donnees) <- c("codgeo", "nivgeo", "mesure", "lib_mesure", var[[2]][2], "valeur")
donnees <- data.frame(donnees[,'Zone.codgeo'], donnees[,'Zone.nivgeo'],
donnees[,'Modalite.code'], donnees[,'Valeur'], stringsAsFactors = FALSE)
colnames(donnees) <- c("codgeo", "nivgeo", var[[2]][2], "valeur")
} else {
var <- as.character(cellule[,'Modalite..variable'])
donnees <- data.frame(cellule['Zone..codgeo'], cellule[,'Zone..nivgeo'],
cellule[,'Mesure..code'], cellule[,'Mesure..'],
cellule[,'Modalite..code'], cellule[,'Valeur'], stringsAsFactors = FALSE)
colnames(donnees) <- c("codgeo", "nivgeo", "mesure", "lib_mesure", var, "valeur")
colnames(donnees) <- c("codgeo", "nivgeo", var, "valeur")
}
}

Expand Down
35 changes: 5 additions & 30 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,7 @@
<!-- README.md is generated from README.Rmd. Please edit that file -->

# inseeLocalData

<!-- badges: start -->

[![R-CMD-check](https://github.com/InseeFrLab/inseeLocalData/workflows/R-CMD-check/badge.svg)](https://github.com/InseeFrLab/inseeLocalData/actions)
[![Lifecycle: experimental](https://img.shields.io/badge/lifecycle-experimental-orange.svg)](https://www.tidyverse.org/lifecycle/#experimental)
[![CRAN status](https://www.r-pkg.org/badges/version/inseeLocalData)](https://cran.r-project.org/package=inseeLocalData)
<!-- badges: end -->

L’[API ‘Données
locales’](https://api.insee.fr/catalogue/site/themes/wso2/subthemes/insee/pages/item-info.jag?name=DonneesLocales&version=V0.1&provider=insee)
locales’](https://portail-api.insee.fr/catalog/api/3d577cf9-d081-4054-977c-f9d081b054b2?aq=ALL)
permet d’accéder aux données localisées à la commune, diffusées sur
insee.fr dans la rubrique ‘chiffres détaillés’, sous forme de cubes
prédéfinis.
Expand Down Expand Up @@ -48,22 +39,6 @@ remotes::install_github("inseefrlab/inseeLocalData")
```

## Utilisation

Dans les différents exemples, il est nécessaire d’avoir généré
préalablement un jeton sur le catalogue des API. Ensuite plusieurs
possibilités s’offrent à vous :

- Remplacer jeton par la valeur du jeton généré sur le catalogue des
API ;
- Générer une fenêtre dans laquelle vous pouvez renseigner le jeton
généré sur le catalogue des API (.rs.askForPassword(“jeton:”) ;
- Modifier le fichier .Renviron en ajoutant une ligne jeton = “la
valeur du jeton genere sur le catalogue des API”. Pour accéder
facilement au fichier .Renviron, vous pouvez utiliser la commande
usethis::edit\_r\_environ(“user”). Il est nécessaire de redémarer R
après avoir fait la modification. Attention, ce paramètre doit être
mis a jour à chaque fois qu’un nouveau jeton est généré.

### Exemple d’utilisation simple :

Cet exemple permet d’utiliser l’API pour un croisement et un code
Expand All @@ -78,7 +53,7 @@ nivgeo <- "COM"
codgeo <- "51108"
modalite <- "all.all"

donneesAPI <- get_dataset(jeton, jeu_donnees, croisement, modalite, nivgeo, codgeo)
donneesAPI <- get_dataset(jeu_donnees, croisement, modalite, nivgeo, codgeo)

donnees <- donneesAPI$donnees # pour accéder aux données
liste_code <- donneesAPI$liste_code # pour accéder aux nomenclatures
Expand All @@ -100,7 +75,7 @@ jeu_donnees <- "GEO2017REE2017"
modalite <- "all.all"

sortie <- mapply(get_dataset,
jeton, jeu_donnees, croisement,
jeu_donnees, croisement,
modalite, liste_code$nivgeo, liste_code$codgeo,USE.NAMES = TRUE)

donnees <- NULL
Expand All @@ -122,12 +97,12 @@ différente). Les paramètres sont renseignés au préalable dans un
data.frame ‘fichier’, ayant pour variables jeu\_donnees, croisement,
modalite, nivgeo et codgeo. Le paramètre temporisation est utilisé pour
faire une pause de 2 secondes entre chaque requêtes afin de ne pas
dépasser le quota de 30 requêtes par minute.
dépasser le quota de requêtes par minute du portail des API de l'Insee.

``` r
fichier <- 'mon fichier'
sortie <- mapply(get_dataset,
jeton, fichier$jeu_donnees, fichier$croisement,
fichier$jeu_donnees, fichier$croisement,
fichier$modalite, fichier$nivgeo, fichier$codgeo,2,USE.NAMES = TRUE)

# pour le 1er croisement renseigné dans le fichier en entrée
Expand Down
35 changes: 1 addition & 34 deletions man/get_dataset.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 54685a1

Please sign in to comment.