Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • dreal-pdl/csd/eau-milieux-aquatiques/data.nitrates
1 result
Show changes
Commits on Source (2)
---
title: "Cr\u00e9ation des tables et des s\u00e9quences"
output: html_document
editor_options:
chunk_output_type: console
---
```{r development, include=FALSE}
library(testthat)
library(yaml)
library(glue)
library(DBI)
library(datalibaba)
```
```{r development-load}
# Load already included functions if relevant
pkgload::load_all(export_all = FALSE)
```
```{r config, eval=FALSE}
# Lire le fichier de configuration
config <- yaml::read_yaml("config.yml")
# Accéder aux valeurs pour version et last_year
version <- config$version
last_year <- config$last_year
```
# Présentation
Cette page contient les fonctions permettant :
- de créer en base la table `nitrates.nitrate_prelevement_analyse_version`,
- d'incrémenter la séquence correspondante au moment de l'import des données.
# Création de la table en base
## Création de la table des prélèvements et analyses et ajout des commentaires
```{r function-create_table_nitrate_prelevement_analyse, eval=FALSE}
#' Créer une table de prélèvements et analyses de nitrates
#'
#' @description Cette fonction crée une table dans une base de données PostgreSQL
#' pour stocker les informations relatives aux prélèvements et analyses de
#' nitrates, incluant les contraintes et les séquences nécessaires.
#'
#' @param version String. Version de la table (par exemple, 'v1').
#' @param last_year Integer. L'année la plus récente incluse dans les données de la table.
#'
#' @return String. Le script SQL utilisé pour créer la table.
#' @export
#' @importFrom datalibaba connect_to_db
create_table_nitrate_prelevement_analyse <- function(version, last_year) {
# Établir une connexion à la base de données PostgreSQL
connexion <- datalibaba::connect_to_db(db = "si_eau", user = "admin")
# Génération de la date du jour
date_now <- format(Sys.Date(), "%d/%m/%Y")
# Liste des requêtes SQL
sql_commands <- c(
glue::glue("CREATE TABLE IF NOT EXISTS nitrates.nitrate_prelevement_analyse_{version} (
code_prelevement_analyse serial NOT NULL,
code_intervenant character varying(20),
source character varying(10),
code_reseau character varying(254),
code_station character varying(10),
date_prelevement date,
heure_prelevement character varying(8),
code_support integer,
nature_eau character varying(3),
id_usage character varying(3),
id_prelevement_motif character varying(2),
commentaire character varying(254),
code_parametre bigint,
code_fraction_analysee integer,
date_analyse date,
resultat_analyse double precision,
code_remarque integer,
limite_detection double precision,
limite_quantification double precision,
CONSTRAINT pk_nitrate_prelevement_analyse_{version} PRIMARY KEY (code_prelevement_analyse),
CONSTRAINT fk_n_support FOREIGN KEY (code_support)
REFERENCES sandre.n_support (code_support) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE SET DEFAULT,
CONSTRAINT fk_parametre FOREIGN KEY (code_parametre)
REFERENCES qualite_cours_d_eau.parametre (code_parametre) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE SET DEFAULT,
CONSTRAINT fk_n_fraction_analysee FOREIGN KEY (code_fraction_analysee)
REFERENCES sandre.n_fraction_analysee (code_fraction_analysee) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE SET DEFAULT,
CONSTRAINT fk_n_remarque FOREIGN KEY (code_remarque)
REFERENCES sandre.n_remarque (code_remarque) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
) WITH (OIDS=FALSE);"),
glue::glue("ALTER TABLE nitrates.nitrate_prelevement_analyse_{version} OWNER TO adminpsql;"),
glue::glue("GRANT ALL ON TABLE nitrates.nitrate_prelevement_analyse_{version} TO adminpsql;"),
glue::glue("GRANT ALL ON TABLE nitrates.nitrate_prelevement_analyse_{version} TO writer_production;"),
glue::glue("GRANT SELECT ON TABLE nitrates.nitrate_prelevement_analyse_{version} TO reader_production;"),
glue::glue("COMMENT ON TABLE nitrates.nitrate_prelevement_analyse_{version} IS
'Table des prélèvements et analyses 2007-{last_year} (version {version} du {date_now})';"),
glue::glue("CREATE SEQUENCE IF NOT EXISTS nitrates.nitrate_prelevement_analyse_{version}_code_prelevement_seq
INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1;"),
glue::glue("ALTER SEQUENCE nitrates.nitrate_prelevement_analyse_{version}_code_prelevement_seq
OWNER TO adminpsql;")
)
# Ajout des commentaires sur chaque champ
comments_sql <- c(
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_prelevement_analyse IS 'Identifiant du prélèvement';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_intervenant IS 'Identifiant de l''intervenant';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.source IS 'Source de la donnée';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_reseau IS 'Identifiant du réseau';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_station IS 'Identifiant de la station';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.date_prelevement IS 'Date du prélèvement';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.heure_prelevement IS 'Heure du prélèvement';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_support IS 'Code du support de prélèvement';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.nature_eau IS 'Nature de l''eau du prélèvement (ESO/ESU)';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.id_usage IS 'Code de l''usage du prélèvement';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.id_prelevement_motif IS 'Code du motif du prélèvement';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.commentaire IS 'Commentaire';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_parametre IS 'Identifiant du paramètre analysé';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_fraction_analysee IS 'Identifiant de la fraction analysée';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.date_analyse IS 'Date de l''analyse';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.resultat_analyse IS 'Résultat de l''analyse';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_remarque IS 'Code validant la donnée';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.limite_detection IS 'Limite de détection';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.limite_quantification IS 'Limite de quantification';")
)
# Exécuter chaque commande SQL
for (sql in c(sql_commands, comments_sql)) {
DBI::dbExecute(connexion, sql)
}
# Fermeture de la connexion à la base de données
DBI::dbDisconnect(connexion)
# Retourne toutes les commandes exécutées
return(c(sql_commands, comments_sql))
}
```
Création de la table `nitrates.nitrate_prelevement_version` :
```{r create_create_table_nitrate_prelevement_analyse, eval=FALSE}
# Création du script SQL avec la version choisie
sql <- create_table_nitrate_prelevement_analyse(version, last_year)
```
# Incrémentation de la séquence
## Incrémentation de la table des prélèvements et des analyses
```{r function-add_code_prelevement_analyse, eval=FALSE}
#' Ajouter une variable code_prelevement_analyse au dataframe
#'
#' @description Cette fonction ajoute une nouvelle variable
#' `code_prelevement_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_prelevement_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_prelevement_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_prelevement_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_prelevement_analyse_{version}_code_prelevement_seq")
# Initialiser une liste pour stocker les valeurs de la séquence
code_prelevements <- 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_prelevement")
result <- DBI::dbGetQuery(connexion, query)
code_prelevements <- c(code_prelevements, result$code_prelevement)
}
# Ajouter la nouvelle variable au dataframe
dataframe <- dataframe |>
dplyr::mutate(code_prelevement = code_prelevements)
# Fermer la connexion à la base de données
DBI::dbDisconnect(connexion)
return(dataframe)
}
```
La fonction est utilisée au moment d'importer les données des différentes
sources dans la table `nitrates.nitrate_prelevement_analyse_version` :
```{r example_add_code_prelevement_analyse, eval=FALSE}
# Crée un dataframe fictif avec les colonnes nécessaires pour l'exemple
dataframe <- data.frame(
id_prelevement = 1:5,
autre_colonne = sample(letters, 5)
)
# Définir une version pour l'exemple
version <- "v1"
# Utiliser la fonction add_code_prelevement() avec la version souhaitée
dataframe <- code_prelevement_analyse(
dataframe, version)
```
```{r development-skeleton-dir, eval=FALSE}
# Créer de l'arborescence et des fichiers du template
usethis::use_rmarkdown_template(
template_name = "Cr\u00e9ation de la table et de la s\u00e9quence",
template_dir = "creation-de-la-table-et-de-la-sequence",
template_description = "Cr\u00e9ation de la table et de la s\u00e9quence",
template_create_dir = TRUE
)
```
```{r development-skeleton-copy, eval=FALSE}
# Définir les chemins source et destination
source_file <- "dev/flat_create_tables_sequences.Rmd"
destination_dir <- "inst/rmarkdown/templates/creation-de-la-table-et-de-la-sequence/skeleton"
destination_file <- file.path(destination_dir, "skeleton.Rmd")
# Copier et renommer le fichier
file.copy(from = source_file, to = destination_file, overwrite = TRUE)
message("File copied and renamed successfully.")
```
```{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_create_table_sequence.Rmd", vignette_name = "creation-de-la-table-et-de-la-sequence")
```
......@@ -63,7 +63,7 @@ r_station_mesure_p_2024_r52 <- datalibaba::importer_data(
On ajoute les variables `source` et `code_support` :
```{r add_source_code_support, eval=FALSE}
# Ajouter les variables source et code_support
nitrate_data_analyse_ars <- nitrate_data_analyse_ars |>
nitrate_prelevement_analyse_ars <- nitrate_data_analyse_ars |>
dplyr::mutate(
source = "ARS",
code_support = 3
......@@ -73,14 +73,14 @@ nitrate_data_analyse_ars <- nitrate_data_analyse_ars |>
On remplace "h" par ":" dans la variable `plv_heure` :
```{r replace_in_plv_heure, eval=FALSE}
# Remplacer "h" par ":" dans la colonne plv_heure
nitrate_data_analyse_ars <- nitrate_data_analyse_ars |>
nitrate_prelevement_analyse_ars <- nitrate_prelevement_analyse_ars |>
dplyr::mutate(plv_heure = stringr::str_replace_all(plv_heure, "h", ":"))
```
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 |>
nitrate_prelevement_analyse_ars <- nitrate_prelevement_analyse_ars |>
dplyr::filter(!stringr::str_starts(param_nom, "Total"))
```
......@@ -88,7 +88,7 @@ nitrate_analyse_ars <- nitrate_data_analyse_ars |>
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 |>
nitrate_prelevement_analyse_ars <- nitrate_prelevement_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_,
......@@ -101,7 +101,7 @@ nitrate_analyse_ars <- nitrate_analyse_ars |>
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 |>
nitrate_prelevement_analyse_ars <- nitrate_prelevement_analyse_ars |>
dplyr::mutate(
ana_param_alpha_resultat = stringr::str_replace(ana_param_alpha_resultat, "\\,", "."),
param_code = stringr::str_replace(param_code, "NO3", "1340")
......@@ -112,7 +112,7 @@ nitrate_analyse_ars <- nitrate_analyse_ars |>
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 |>
nitrate_prelevement_analyse_ars <- nitrate_prelevement_analyse_ars |>
dplyr::mutate(
# Ajout de la colonne code_remarque selon la condition spécifiée
code_remarque = dplyr::case_when(
......@@ -121,7 +121,7 @@ nitrate_analyse_ars <- nitrate_analyse_ars |>
),
# Renommage conditionnel des colonnes
resultat_analyse = dplyr::case_when(
stringr::str_starts(ana_param_alpha_resultatdev, "<") ~ as.character(ana_param_valeur_traduite),
stringr::str_starts(ana_param_alpha_resultat, "<") ~ as.character(ana_param_valeur_traduite),
TRUE ~ ana_param_alpha_resultat
),
limite_quantification = dplyr::case_when(
......@@ -135,7 +135,7 @@ nitrate_analyse_ars <- nitrate_analyse_ars |>
On sélectionne les champs utiles à la table des prélèvements et analyse :
```{r select_variables, eval=FALSE}
# Sélectionner les variables
nitrate_data_analyse_ars <- nitrate_data_analyse_ars |>
nitrate_prelevement_analyse_ars <- nitrate_prelevement_analyse_ars |>
dplyr::select(code_intervenant = geo_dept_ddass_gest_code,
source,
code_station = ins_code_national,
......