# Leitura dos dados

## Sobre o script

Neste script é feita a leitura e formatações iniciais dos dados subdiários consolidados do Rio Grande do Sul (UFPB-ANA). Séries históricas foram disponibilizadas em formato .PARQUET em duas partes: `info`, com informações diversas à respeito das estações e séries; e `data`, contendo as séries históricas em si.

Esse script também é executado diretamente no R através do `source()` no arquivo `rs_subdaily_read_parquet.R`.

## Pacotes

```{r}

# Limpar ambiente
rm(list = ls()); invisible(gc())

# Instalar e carregar pacotes
if(!require(pacman)) install.packages("pacman")
pacman::p_load(pacman,
               tidyverse, # manipulação de dados
               lubridate, # manipulação de datas
               arrow,     # ler dados no formato 'parquet'
               ggplot2)   # visualização
```

## Dados

Conjunto de dados subdiários consolidados reunidos pelo GTA-UFPB contendo 383 estações do CEMADEN, ICEA, Telemetria (ANA) e INMET disponibilizados no [OneDrive](https://1drv.ms/f/c/AAFB08B2A81BEEB3/AmW6jY4wqDdKj3jn-N3PqAQ?e=B06g8T). Estes dados brutos se encontram em "base/fonte".

```{r ler_dados_parquet}

# Caminho do diretório
path_dir <- "base/fonte/consolidado/subdiario/"


# Listar arquivos c/ extensão ".parquet" no diretório
# Os arquivos contém divisões por ano de duas tabelas: info e data

## Listar 'data'
files_data <- list.files(path = path_dir,           
                         pattern = "*.data.pqt",
                         full.names = TRUE)


## Listar 'info'
files_info <- list.files(path = path_dir,
                         pattern = "*.info.pqt",
                         full.names = TRUE)

# Ler dados
# list_data <- lapply(X = files_data, FUN = arrow::read_parquet, as_data_frame = TRUE)
list_data <- lapply(X = files_data, FUN = arrow::read_parquet)
list_info <- lapply(X = files_info, FUN = arrow::read_parquet)

# Juntar dados
df_data <- bind_rows(list_data)[-4]  # remover coluna '__intex_level_0__'
df_info <- bind_rows(list_info)[-10] # remover coluna '__intex_level_0__'

# Manter somente 'df_data' e 'df_info' no ambiente
rm(list = setdiff(ls(), c("df_data", "df_info"))); invisible(gc())

```

## Organizar dados

O data frame `df_info` contém estações repetidas, então vamos limpar mantendo somente e uma observação do campo de códigos da estação `gauge_code`.

```{r}
# O arquivo 'df_info' contém estações repetidas, portanto precisamos manter
# somente um único registro de cada 'gauge_code'
df_info <- slice_tail(.data = df_info, n = 1, by = "gauge_code")
```

Já no data frame `df_data` há uma incompatibilidade com a forma com que os dados são lidos no R. O R automaticamente atribui um fuso horário a dados no formato "date" de acordo com o fuso horário da máquina do usuário. Sabemos que todos os dados estão na zona UTC-3, então:

```{r}
# Fuso horário
# Todos os dados do conjunto deveriam estar na zona UTC -3
# Isso corrige o shift de -2 ou -3 horas nos dados
df_data <- df_data %>% 
  mutate(
    datetime = as.POSIXct(datetime, format = "%Y-%m-%d %H:%M:%S", tz = "UTC"),        # alterar fuso
    time_steps = df_info$monitoring_time_step[match(gauge_code, df_info$gauge_code)], # resolução temporal
    responsible = df_info$responsible[match(gauge_code, df_info$gauge_code)]          # operador
    ); invisible(gc()) # resolução temporal
```

## Exportar dados brutos

```{r}

# Parquet
write_parquet(df_data, sink = "base/gerados/df_subdaily_data.parquet")
write_parquet(df_info, sink = "base/gerados/df_subdaily_info.parquet")

invisible(gc())
```
