Skip to content
Snippets Groups Projects
title: "Insertion des pr\u00e9l\u00e8vements ARS"
output: html_document
editor_options: 
  chunk_output_type: console
library(testthat)
library(datalibaba)
library(dplyr)
library(stringr)
library(glue)
library(DBI)
library(RPostgres)
# 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 et des stations ESO

La table des données brutes Nitrates de l'ARS est chargée :

nitrate_data_analyse_ars <- datalibaba::importer_data(
  table = "nitrate_data_analyse_ars",
  schema = "nitrates",
  db = "si_eau",
  user = "admin"
)

La table des stations ESO est chargée :

station_eso <- datalibaba::importer_data(
  table = "station_eso",
  schema = "stations",
  db = "si_eau",
  user = "admin"
)

Consolidation des données ARS

On ajoute les variables source et code_support :

# Ajouter les variables source et code_support
nitrate_data_analyse_ars <- nitrate_data_analyse_ars |>
  dplyr::mutate(
    source = "ARS",
    code_support = 3
  )

On remplace "h" par ":" dans la variable plv_heure :

# Remplacer "h" par ":" dans la colonne plv_heure
nitrate_data_analyse_ars <- nitrate_data_analyse_ars |>
  dplyr::mutate(plv_heure = stringr::str_replace_all(plv_heure, "h", ":"))

On sélectionne les champs utiles à la table des prélèvements :

# Sélectionner les variables
nitrate_data_analyse_ars <- nitrate_data_analyse_ars |>
  dplyr::select(code_intervenant = geo_dept_ddass_gest_code,
                source,
                code_station = ins_code_national,
                date_prelevement = plv_date,
                heure_prelevement = plv_heure,
                code_support,
                nature_eau,
                id_usage = usage,
                id_prelevement_motif = plv_motif)

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 :

# Dédoublonner les lignes sur les colonnes code_station et date_prelevement
nitrate_data_analyse_ars <- nitrate_data_analyse_ars |>
  dplyr::distinct(code_station, date_prelevement, .keep_all = TRUE)

On met à jour le champs code_station avec le code BSS :

nitrate_data_analyse_ars <- nitrate_data_analyse_ars |>
  dplyr::left_join(station_eso, by = c("code_station" = "code_sise_eaux"), suffix = c("_ars", "_station_eso")) 

nitrate_data_analyse_ars <- nitrate_data_analyse_ars |>
  dplyr::mutate(code_station = ifelse(!is.na(code_station_station_eso), code_station_station_eso, code_station)) |>
  dplyr::select(-code_station_station_eso, -source_station_eso)

On ne conserve que les champs utiles à la table des prélèvements :

nitrate_data_analyse_ars <- nitrate_data_analyse_ars |>
  dplyr::select(code_intervenant,
                source = source_ars,
                code_station,
                date_prelevement,
                heure_prelevement,
                code_support,
                nature_eau,
                id_usage,
                id_prelevement_motif)
#' Ajouter une variable code_prelevement au dataframe
#'
#' @description Cette fonction ajoute une nouvelle variable `code_prelevement` 
#' 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`.
#' @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` 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 <- 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_{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)
}

On ajoute un identifiant unique s'appuyant sur une séquence stockée en base :

# Utiliser la fonction add_code_prelevement_ars avec la version souhaitée
nitrate_data_analyse_ars <- add_code_prelevement(
  nitrate_data_analyse_ars, "v0_16")

# Afficher le dataframe pour vérifier les modifications
print(nitrate_data_analyse_ars)

On charge les données consolidées dans un table dédiée :

# Charger les données dans une nouvelle table en base
datalibaba::poster_data(data = nitrate_data_analyse_ars, 
                        table = "nitrate_prelevement_ars_v0_16", 
                        schema = "nitrates", 
                        db = "si_eau",
                        overwrite = TRUE,
                        pk = "code_prelevement",
                        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 :

# 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_prelevement_ars_v0_16", 
                                  source_schema = "nitrates", 
                                  target_table = "nitrate_prelevement_v0_16", 
                                  target_schema = "nitrates",
                                  role = "admin")
# Run but keep eval=FALSE to avoid infinite loop
# Execute in the console directly
fusen::inflate(flat_file = "dev/flat_insert_ars_into_prelevement.Rmd", vignette_name = "Insertion des pr\u00e9l\u00e8vements ARS")