-
ronan.vignard authoredronan.vignard authored
flat_insert_ars_into_prelevement.Rmd 7.03 KiB
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")