diff --git a/NAMESPACE b/NAMESPACE index c52bc4d7aec300bb94e4b110685e1b71bbf81cb3..7e64f5e4bd1564f05533975fcc101861db5546d4 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,5 +1,6 @@ # Generated by roxygen2: do not edit by hand +export(add_code_analyse) export(add_code_prelevement) export(create_nitrate_analyse_table) export(create_nitrate_prelevement_table) diff --git a/R/add_code_analyse.R b/R/add_code_analyse.R new file mode 100644 index 0000000000000000000000000000000000000000..e78de949e9778eb9a83430acec347d73fc04a21a --- /dev/null +++ b/R/add_code_analyse.R @@ -0,0 +1,48 @@ +# WARNING - Generated by {fusen} from dev/flat_insert_ars_into_analyse.Rmd: do not edit by hand + +#' Ajouter une variable code_analyse au dataframe +#' +#' @description Cette fonction ajoute une nouvelle variable `code_analyse` +#' au dataframe en utilisant une séquence PostgreSQL dynamique. La séquence est +#' construite en fonction du paramètre `version` fourni. +#' +#' @param dataframe Un dataframe contenant les données sur lesquelles ajouter +#' la variable `code_analyse`. +#' @param version Une chaîne de caractères représentant la version de la +#' séquence à utiliser. +#' +#' @return Un dataframe avec une nouvelle colonne `code_analyse` contenant +#' les valeurs de la séquence PostgreSQL. +#' +#' @importFrom DBI dbGetQuery dbDisconnect +#' @importFrom dplyr mutate +#' @importFrom glue glue +#' @importFrom datalibaba connect_to_db +#' @export +add_code_analyse <- function(dataframe, version) { + # Établir une connexion à la base de données PostgreSQL + connexion <- datalibaba::connect_to_db(db = "si_eau", user = "admin") + + # Construire le nom de la séquence + sequence_name <- glue::glue("nitrates.nitrate_analyse_{version}_code_analyse_seq") + + # Initialiser une liste pour stocker les valeurs de la séquence + code_analyses <- c() + + # Pour chaque ligne du dataframe, obtenir une valeur de la séquence + for (i in 1:nrow(dataframe)) { + query <- glue::glue("SELECT nextval(\'{sequence_name}\') AS code_analyse") + result <- DBI::dbGetQuery(connexion, query) + code_analyses <- c(code_analyses, result$code_analyse) + } + + # Ajouter la nouvelle variable au dataframe + dataframe <- dataframe |> + dplyr::mutate(code_analyse = code_analyses) + + # Fermer la connexion à la base de données + DBI::dbDisconnect(connexion) + + return(dataframe) +} + diff --git a/dev/config_fusen.yaml b/dev/config_fusen.yaml index 9060038f32a7c30350f31266dc8df4d6fd61b355..15f23e36a7b34a4d3d99abd7aa979047680e651a 100644 --- a/dev/config_fusen.yaml +++ b/dev/config_fusen.yaml @@ -63,6 +63,19 @@ flat_import_hubeau_rw_data.Rmd: check: true document: true overwrite: ask +flat_insert_ars_into_analyse.Rmd: + path: dev/flat_insert_ars_into_analyse.Rmd + state: active + R: R/add_code_analyse.R + tests: [] + vignettes: vignettes/insertion-des-analyses-ars.Rmd + inflate: + flat_file: dev/flat_insert_ars_into_analyse.Rmd + vignette_name: Insertion des analyses ARS + open_vignette: true + check: true + document: true + overwrite: ask flat_insert_ars_into_prelevement.Rmd: path: dev/flat_insert_ars_into_prelevement.Rmd state: active diff --git a/dev/flat_insert_ars_into_analyse.Rmd b/dev/flat_insert_ars_into_analyse.Rmd new file mode 100644 index 0000000000000000000000000000000000000000..8c1a04d3d7b73f58344b964e5919fe65b6903eea --- /dev/null +++ b/dev/flat_insert_ars_into_analyse.Rmd @@ -0,0 +1,272 @@ +--- +title: "Insertion des analyses ARS" +output: html_document +editor_options: + chunk_output_type: console +--- + +```{r development, include=FALSE} +library(testthat) +library(datalibaba) +library(dplyr) +library(stringr) +library(glue) +library(DBI) +library(RPostgres) +``` + +```{r development-load} +# Load already included functions if relevant +pkgload::load_all(export_all = FALSE) +``` + +# Consolidation et insertion des données de l'ARS dans la table des prélèvements + +## Chargement des données ARS brutes + +La table des données brutes Nitrates de l'ARS est chargée : +```{r load-nitrate_data_analyse_ars, eval=FALSE} +# Charger la table nitrates.nitrate_data_analyse_ars +nitrate_data_analyse_ars <- datalibaba::importer_data( + table = "nitrate_data_analyse_ars", + schema = "nitrates", + db = "si_eau", + user = "admin" +) +``` + +## Consolidation des données ARS + +On supprime les enregistrements correspondants à des totaux : +```{r filter-param_nom_ars, eval=FALSE} +# Supprimer les lignes ne correspondant pas à une analyse +nitrate_analyse_ars <- nitrate_data_analyse_ars |> + dplyr::filter(!stringr::str_starts(param_nom, "Total")) + +``` + +On remplace les chaînes de caractère par NA dans la variable `ana_param_alpha_resultat` : +```{r replace-strings-with-na, eval=FALSE} +# Remplacer chaînes de caractère dans la colonne ana_param_alpha_resultat +nitrate_analyse_ars <- nitrate_analyse_ars |> + dplyr::mutate( + ana_param_alpha_resultat = dplyr::case_when( + ana_param_alpha_resultat %in% c("TRACES", "PRESENCE", "SEUIL", "ILLISIBL", "N.M.", "O", "?", ",", " ") ~ NA_character_, + TRUE ~ ana_param_alpha_resultat + ) + ) + +``` + +On remplace des valeurs dans ana_param_alpha_resultat et param_code: +```{r replace-dot_ana_param_alpha_resultat, eval=FALSE} +# Remplacer les valeurs dans les colonnes ana_param_alpha_resultat et param_code +nitrate_analyse_ars <- nitrate_analyse_ars |> + dplyr::mutate( + ana_param_alpha_resultat = stringr::str_replace(ana_param_alpha_resultat, "\\,", "."), + param_code = stringr::str_replace(param_code, "NO3", "1340") + ) + +``` + +On affecte le code_remarque et la valeur des variables resultat_analyse et limite_quantification : +```{r mutate-from_ana_param_alpha_resultat, eval=FALSE} +# Ajouter les colonnes code_remarque, resultat_analyse et limite_quantification +nitrate_analyse_ars <- nitrate_analyse_ars |> + mutate( + # Ajout de la colonne code_remarque selon la condition spécifiée + code_remarque = dplyr::case_when( + stringr::str_starts(ana_param_alpha_resultat, "<") ~ 10, + TRUE ~ 1 + ), + # Renommage conditionnel des colonnes + resultat_analyse = dplyr::case_when( + stringr::str_starts(ana_param_alpha_resultat, "<") ~ as.character(ana_param_valeur_traduite), + TRUE ~ ana_param_alpha_resultat + ), + limite_quantification = dplyr::case_when( + stringr::str_starts(ana_param_alpha_resultat, "<") ~ ana_param_alpha_resultat, + TRUE ~ NA_character_ # Utilisation de NA pour les valeurs non pertinentes + ) + ) +``` + +On sélectionne les champs utiles à la table des analyses : +```{r select-variables-ars, eval=FALSE} +# Sélectionner les variables +nitrate_analyse_ars <- nitrate_analyse_ars |> + dplyr::select(code_station = ins_code_national, + code_intervenant = geo_dept_ddass_gest_code, + date_prelevement = plv_date, + nom_parametre = param_nom, + date_analyse = anl_date_fin_analyse, + resultat_analyse, + code_parametre = param_code, + code_remarque, + limite_quantification) + +``` + +On supprime les caractères < et > dans les variables resultat_analyse et limite_quantification : +```{r replace-inferior_superior, eval=FALSE} +# Remplacer les valeurs dans les colonnes resultat_analyse et limite_quantification +nitrate_analyse_ars <- nitrate_analyse_ars |> + dplyr::mutate(resultat_analyse = + stringr::str_replace(resultat_analyse, ">", ""), + limite_quantification = + stringr::str_replace(limite_quantification, "<", "")) + +``` + +On modifie le type des variables resultat_analyse et limite_quantification : +```{r change-fieldtypes, eval=FALSE} +# Remplacer les valeurs dans les colonnes resultat_analyse et limite_quantification +nitrate_analyse_ars <- nitrate_analyse_ars |> + dplyr::mutate(resultat_analyse = as.numeric(resultat_analyse), + limite_quantification = as.numeric(limite_quantification), + code_parametre = as.integer(code_parametre)) + +``` + +# Jointure avec la table des prélèvements créée auparavant + +La table des prélèvements est chargée : +```{r load-nitrate_prelevement, eval=FALSE} +# Charger la table nitrates.nitrate_prelevement_v0_15 +nitrate_prelevement <- datalibaba::importer_data( + table = "nitrate_prelevement_v0_15", + schema = "nitrates", + db = "si_eau", + user = "admin" +) + +``` + +On dédoublonne les lignes en utilisant les champs `code_station` et `date_prelevement` +afin de ne conserver qu'un prélèvement par station et date donnée : +```{r select-distinct-rows-ars, eval=FALSE} +# Dédoublonner les lignes sur les colonnes code_station et date_prelevement +nitrate_analyse_ars <- nitrate_analyse_ars |> + dplyr::distinct(code_station, date_prelevement, .keep_all = TRUE) + +``` + +On joint le dataframe des prélèvements pour récupérer la variable code_prelevement : +```{r join-prelvement_ars, eval=FALSE} +# Joindre les dataframes nitrate_analyse_ars et nitrate_prelevement +nitrate_analyse_ars <- nitrate_analyse_ars |> + left_join(nitrate_prelevement |> + select(code_station, date_prelevement, code_prelevement), + by = c("code_station" = "code_station", "date_prelevement" = "date_prelevement")) +``` + +```{r function-add_code_analyse, eval=FALSE} +#' Ajouter une variable code_analyse au dataframe +#' +#' @description Cette fonction ajoute une nouvelle variable `code_analyse` +#' au dataframe en utilisant une séquence PostgreSQL dynamique. La séquence est +#' construite en fonction du paramètre `version` fourni. +#' +#' @param dataframe Un dataframe contenant les données sur lesquelles ajouter +#' la variable `code_analyse`. +#' @param version Une chaîne de caractères représentant la version de la +#' séquence à utiliser. +#' +#' @return Un dataframe avec une nouvelle colonne `code_analyse` contenant +#' les valeurs de la séquence PostgreSQL. +#' +#' @importFrom DBI dbGetQuery dbDisconnect +#' @importFrom dplyr mutate +#' @importFrom glue glue +#' @importFrom datalibaba connect_to_db +#' @export +add_code_analyse <- function(dataframe, version) { + # Établir une connexion à la base de données PostgreSQL + connexion <- datalibaba::connect_to_db(db = "si_eau", user = "admin") + + # Construire le nom de la séquence + sequence_name <- glue::glue("nitrates.nitrate_analyse_{version}_code_analyse_seq") + + # Initialiser une liste pour stocker les valeurs de la séquence + code_analyses <- c() + + # Pour chaque ligne du dataframe, obtenir une valeur de la séquence + for (i in 1:nrow(dataframe)) { + query <- glue::glue("SELECT nextval(\'{sequence_name}\') AS code_analyse") + result <- DBI::dbGetQuery(connexion, query) + code_analyses <- c(code_analyses, result$code_analyse) + } + + # Ajouter la nouvelle variable au dataframe + dataframe <- dataframe |> + dplyr::mutate(code_analyse = code_analyses) + + # Fermer la connexion à la base de données + DBI::dbDisconnect(connexion) + + return(dataframe) +} + +``` + +On ajoute un identifiant unique s'appuyant sur une séquence stockée en base : +```{r add_code_analyse_ars, eval=FALSE} +# Utiliser la fonction add_code_analyse_ars avec la version souhaitée +nitrate_analyse_ars <- add_code_analyse( + nitrate_analyse_ars, "v0_15") + +# Afficher le dataframe pour vérifier les modifications +print(nitrate_analyse_ars) + +``` + +# Chargement en base + +On corrige l'ordre des champs les champs utiles à la table des analyses : +```{r select-variables-ars-final, eval=FALSE} +# Sélectionner les variables dans l'ordre des champs de la table à alimenter +nitrate_analyse_ars <- nitrate_analyse_ars |> + dplyr::select(code_analyse, + code_intervenant, + code_prelevement, + code_parametre, + code_station, + date_analyse, + resultat_analyse, + code_remarque, + limite_quantification) + +``` + +On charge les données consolidées dans un table dédiée : +```{r insert-into_nitrate_prelevement_v0_15, eval=FALSE} +# Charger les données dans une nouvelle table en base +datalibaba::poster_data(data = nitrate_analyse_ars, + table = "nitrate_analyse_ars_v0_15", + schema = "nitrates", + db = "si_eau", + overwrite = TRUE, + pk = "code_analyse", + user = "admin") +``` + +# Insertion des données ARS du nouveau millésime en base dans la table globale + +On insère enfin les enregistrements de cette table dans la table globale : +```{r import_and_merge_tables_ars, eval=FALSE} +# Insérer les données de la table du dernier millésime vers la table complète +collectr::import_and_merge_tables(database = "si_eau", + source_table = "nitrate_analyse_ars_v0_15", + source_schema = "nitrates", + target_table = "nitrate_analyse_v0_15", + target_schema = "nitrates", + role = "admin") + +``` + +```{r development-inflate, eval=FALSE} +# Run but keep eval=FALSE to avoid infinite loop +# Execute in the console directly +fusen::inflate(flat_file = "dev/flat_insert_ars_into_analyse.Rmd", vignette_name = "Insertion des analyses ARS") +``` + diff --git a/man/add_code_analyse.Rd b/man/add_code_analyse.Rd new file mode 100644 index 0000000000000000000000000000000000000000..59d62eef5ee2af7648c5e514011a2baaf0829724 --- /dev/null +++ b/man/add_code_analyse.Rd @@ -0,0 +1,24 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/add_code_analyse.R +\name{add_code_analyse} +\alias{add_code_analyse} +\title{Ajouter une variable code_analyse au dataframe} +\usage{ +add_code_analyse(dataframe, version) +} +\arguments{ +\item{dataframe}{Un dataframe contenant les données sur lesquelles ajouter +la variable \code{code_analyse}.} + +\item{version}{Une chaîne de caractères représentant la version de la +séquence à utiliser.} +} +\value{ +Un dataframe avec une nouvelle colonne \code{code_analyse} contenant +les valeurs de la séquence PostgreSQL. +} +\description{ +Cette fonction ajoute une nouvelle variable \code{code_analyse} +au dataframe en utilisant une séquence PostgreSQL dynamique. La séquence est +construite en fonction du paramètre \code{version} fourni. +} diff --git a/vignettes/insertion-des-analyses-ars.Rmd b/vignettes/insertion-des-analyses-ars.Rmd new file mode 100644 index 0000000000000000000000000000000000000000..5f76b05a8ff87f7e25d2b036337086b010a01f47 --- /dev/null +++ b/vignettes/insertion-des-analyses-ars.Rmd @@ -0,0 +1,232 @@ +--- +title: "Insertion des analyses ARS" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{insertion-des-analyses-ars} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +```{r setup} +library(data.nitrates) +``` + +<!-- WARNING - This vignette is generated by {fusen} from dev/flat_insert_ars_into_analyse.Rmd: do not edit by hand --> + +# Consolidation et insertion des données de l'ARS dans la table des prélèvements + +## Chargement des données ARS brutes + +La table des données brutes Nitrates de l'ARS est chargée : + +```{r load-nitrate_data_analyse_ars, eval = FALSE} +# Charger la table nitrates.nitrate_data_analyse_ars +nitrate_data_analyse_ars <- datalibaba::importer_data( + table = "nitrate_data_analyse_ars", + schema = "nitrates", + db = "si_eau", + user = "admin" +) +``` + +## Consolidation des données ARS + +On supprime les enregistrements correspondants à des totaux : + +```{r filter-param_nom_ars, eval = FALSE} +# Supprimer les lignes ne correspondant pas à une analyse +nitrate_analyse_ars <- nitrate_data_analyse_ars |> + dplyr::filter(!stringr::str_starts(param_nom, "Total")) + +``` + +On remplace les chaînes de caractère par NA dans la variable `ana_param_alpha_resultat` : + +```{r replace-strings-with-na, eval = FALSE} +# Remplacer chaînes de caractère dans la colonne ana_param_alpha_resultat +nitrate_analyse_ars <- nitrate_analyse_ars |> + dplyr::mutate( + ana_param_alpha_resultat = dplyr::case_when( + ana_param_alpha_resultat %in% c("TRACES", "PRESENCE", "SEUIL", "ILLISIBL", "N.M.", "O", "?", ",", " ") ~ NA_character_, + TRUE ~ ana_param_alpha_resultat + ) + ) + +``` + +On remplace des valeurs dans ana_param_alpha_resultat et param_code: + +```{r replace-dot_ana_param_alpha_resultat, eval = FALSE} +# Remplacer les valeurs dans les colonnes ana_param_alpha_resultat et param_code +nitrate_analyse_ars <- nitrate_analyse_ars |> + dplyr::mutate( + ana_param_alpha_resultat = stringr::str_replace(ana_param_alpha_resultat, "\\,", "."), + param_code = stringr::str_replace(param_code, "NO3", "1340") + ) + +``` + +On affecte le code_remarque et la valeur des variables resultat_analyse et limite_quantification : + +```{r mutate-from_ana_param_alpha_resultat, eval = FALSE} +# Ajouter les colonnes code_remarque, resultat_analyse et limite_quantification +nitrate_analyse_ars <- nitrate_analyse_ars |> + mutate( + # Ajout de la colonne code_remarque selon la condition spécifiée + code_remarque = dplyr::case_when( + stringr::str_starts(ana_param_alpha_resultat, "<") ~ 10, + TRUE ~ 1 + ), + # Renommage conditionnel des colonnes + resultat_analyse = dplyr::case_when( + stringr::str_starts(ana_param_alpha_resultat, "<") ~ as.character(ana_param_valeur_traduite), + TRUE ~ ana_param_alpha_resultat + ), + limite_quantification = dplyr::case_when( + stringr::str_starts(ana_param_alpha_resultat, "<") ~ ana_param_alpha_resultat, + TRUE ~ NA_character_ # Utilisation de NA pour les valeurs non pertinentes + ) + ) +``` + +On sélectionne les champs utiles à la table des analyses : + +```{r select-variables-ars, eval = FALSE} +# Sélectionner les variables +nitrate_analyse_ars <- nitrate_analyse_ars |> + dplyr::select(code_station = ins_code_national, + code_intervenant = geo_dept_ddass_gest_code, + date_prelevement = plv_date, + nom_parametre = param_nom, + date_analyse = anl_date_fin_analyse, + resultat_analyse, + code_parametre = param_code, + code_remarque, + limite_quantification) + +``` + +On supprime les caractères < et > dans les variables resultat_analyse et limite_quantification : + +```{r replace-inferior_superior, eval = FALSE} +# Remplacer les valeurs dans les colonnes resultat_analyse et limite_quantification +nitrate_analyse_ars <- nitrate_analyse_ars |> + dplyr::mutate(resultat_analyse = + stringr::str_replace(resultat_analyse, ">", ""), + limite_quantification = + stringr::str_replace(limite_quantification, "<", "")) + +``` + +On modifie le type des variables resultat_analyse et limite_quantification : + +```{r change-fieldtypes, eval = FALSE} +# Remplacer les valeurs dans les colonnes resultat_analyse et limite_quantification +nitrate_analyse_ars <- nitrate_analyse_ars |> + dplyr::mutate(resultat_analyse = as.numeric(resultat_analyse), + limite_quantification = as.numeric(limite_quantification), + code_parametre = as.integer(code_parametre)) + +``` + +# Jointure avec la table des prélèvements créée auparavant + +La table des prélèvements est chargée : + +```{r load-nitrate_prelevement, eval = FALSE} +# Charger la table nitrates.nitrate_prelevement_v0_15 +nitrate_prelevement <- datalibaba::importer_data( + table = "nitrate_prelevement_v0_15", + schema = "nitrates", + db = "si_eau", + user = "admin" +) + +``` + +On dédoublonne les lignes en utilisant les champs `code_station` et `date_prelevement` +afin de ne conserver qu'un prélèvement par station et date donnée : + +```{r select-distinct-rows-ars, eval = FALSE} +# Dédoublonner les lignes sur les colonnes code_station et date_prelevement +nitrate_analyse_ars <- nitrate_analyse_ars |> + dplyr::distinct(code_station, date_prelevement, .keep_all = TRUE) + +``` + +On joint le dataframe des prélèvements pour récupérer la variable code_prelevement : + +```{r join-prelvement_ars, eval = FALSE} +# Joindre les dataframes nitrate_analyse_ars et nitrate_prelevement +nitrate_analyse_ars <- nitrate_analyse_ars |> + left_join(nitrate_prelevement |> + select(code_station, date_prelevement, code_prelevement), + by = c("code_station" = "code_station", "date_prelevement" = "date_prelevement")) +``` + +On ajoute un identifiant unique s'appuyant sur une séquence stockée en base : + +```{r add_code_analyse_ars, eval = FALSE} +# Utiliser la fonction add_code_analyse_ars avec la version souhaitée +nitrate_analyse_ars <- add_code_analyse( + nitrate_analyse_ars, "v0_15") + +# Afficher le dataframe pour vérifier les modifications +print(nitrate_analyse_ars) + +``` + +# Chargement en base + +On corrige l'ordre des champs les champs utiles à la table des analyses : + +```{r select-variables-ars-final, eval = FALSE} +# Sélectionner les variables dans l'ordre des champs de la table à alimenter +nitrate_analyse_ars <- nitrate_analyse_ars |> + dplyr::select(code_analyse, + code_intervenant, + code_prelevement, + code_parametre, + code_station, + date_analyse, + resultat_analyse, + code_remarque, + limite_quantification) + +``` + +On charge les données consolidées dans un table dédiée : + +```{r insert-into_nitrate_prelevement_v0_15, eval = FALSE} +# Charger les données dans une nouvelle table en base +datalibaba::poster_data(data = nitrate_analyse_ars, + table = "nitrate_analyse_ars_v0_15", + schema = "nitrates", + db = "si_eau", + overwrite = TRUE, + pk = "code_analyse", + user = "admin") +``` + +# Insertion des données ARS du nouveau millésime en base dans la table globale + +On insère enfin les enregistrements de cette table dans la table globale : + +```{r import_and_merge_tables_ars, eval = FALSE} +# Insérer les données de la table du dernier millésime vers la table complète +collectr::import_and_merge_tables(database = "si_eau", + source_table = "nitrate_analyse_ars_v0_15", + source_schema = "nitrates", + target_table = "nitrate_analyse_v0_15", + target_schema = "nitrates", + role = "admin") + +``` +