---
title: "Extraction et préparation des données"
author: "François Pelletier"
date: "10 octobre 2015"
output: html_document
---

#Extraction et préparation des données du jeu «Tableau de bord de l’état de santé des projets en ressources informationnelles de l’administration publique»

##Extraction des métadonnées

```{r}
library(XML)
library(dplyr)
source("FilterList.R")
# Identifiant unique du jeu de données
UUID = "c60b2248-0ca4-4b12-89d3-2f087a319bea"
# URL pour récupérer les métadonnées
urlRDF <- paste0("http://www.donnees.gouv.qc.ca/geonetwork/srv/eng/rdf.metadata.get?uuid=",UUID)
# Document de métadonnées
RDFdoc <- urlRDF %>% 
  xmlTreeParse %>% 
  xmlRoot
```

Quel est le contenu du fichier de métadonnées ?

```{r}
# Fréquence de chaque type de noeuds
RDFdoc %>% 
  names %>% 
  table %>% 
  as.data.frame %>% 
  "colnames<-"(c("Type de noeud","Fréquence"))
# Nombre de champs dans chaque noeud
xmlSApply(RDFdoc, xmlSize)
# Extraction à une profondeur de 1
champs <- xmlSApply(RDFdoc, function(x) xmlSApply(x, xmlValue))
# Je veux seulement les champs de type «Distribution»
champsDistribution <-  champs[names(champs) == "Distribution"]
```
Je veux extraire les noms des fichiers de données pour les télécharger

```{r}
datafileNames <- champsDistribution %>% 
  lapply(function(x) as.character(x[x["format"] == "WWW:DOWNLOAD-1.0-ftp--downloadWWW:DOWNLOAD-1.0-ftp--download"])) %>% 
  FilterList(function(x) !identical(character(0),x)) %>%
  as.data.frame %>% t
datafileNames
```

Les fichiers actuels présentent des erreurs d'encodage qui devront être corrigées manuellement. Voir le courriel joint.

```{r eval=FALSE}
rawdata <- list()
rawdata <- lapply(datafileNames[,1],read.csv2,header=FALSE,sep=";",encoding="utf-8",skip = 1)
```

Je télécharge donc les fichiers manuellement

```{r eval=FALSE}
lapply(datafileNames[,1], function (x) system2("wget", x))
noms_fichiers_telecharges <- list.files(path = ".", pattern = ".csv")
system("bash conversion_csv.sh")
```

Je les importe ensuite, puis je corrige toutes les incohérences pour faire la fusion

```{r}
rawdata <- list()
rawdata <- lapply(1:7,function(i) rawdata[[i]] <- read.csv2(paste0("tr_tableau_de_bord_",i,".csv"),
                                                            header = TRUE,
                                                            sep = ";",
                                                            encoding = "utf-8",
                                                            stringsAsFactors = FALSE,
                                                            dec = ","))
rawdata %>% lapply(names)
# Correction des tirets et conversion en numérique de la variable Pourcentage_avancement dans le 4e fichier
rawdata[[4]]$Pourcentage_avancement[levels(rawdata[[4]]$Pourcentage_avancement) == "-"] <- NA
rawdata[[4]]$Pourcentage_avancement <- as.integer(rawdata[[4]]$Pourcentage_avancement)

# Conversion en numérique pour compatibilité avec fusion de numériques au lieu d'entiers
for (i in 1:3)
{
  rawdata[[i]]$Cote_de_coût <- as.numeric(rawdata[[i]]$Cote_de_coût)
  rawdata[[i]]$Variation_de_coût <- as.numeric(rawdata[[i]]$Variation_de_coût)
  rawdata[[i]]$Variation_écheancier <- as.numeric(rawdata[[i]]$Variation_écheancier)
}

for (i in 1:4)
{
  rawdata[[i]]$Cote_écheancier <- as.numeric(rawdata[[i]]$Cote_écheancier)
}
rawdata[[5]]$Cote_echeancier <- as.numeric(rawdata[[5]]$Cote_echeancier)

rawdata[[5]]$Variation_de_cote_echeancier[levels(rawdata[[5]]$Variation_de_cote_echeancier) == "-"] <- NA
rawdata[[5]]$Variation_de_cote_echeancier <- as.numeric(rawdata[[5]]$Variation_de_cote_echeancier)

# Correction des montants pour 4 variables dans le 5e fichier
correction.montants.5 <- function(donnees)
{
  donnees2 <- as.numeric(gsub(" ", "", gsub(",", ".", donnees)))
  donnees2[105:450] <- donnees2[105:450]*1000
  donnees2
}

rawdata[[5]]$Montant_reel_depense <- correction.montants.5(rawdata[[5]]$Montant_reel_depense)
rawdata[[5]]$Cout_estime_pour_completer_le_projet <- correction.montants.5(rawdata[[5]]$Cout_estime_pour_completer_le_projet)
rawdata[[5]]$Budget_autorise_revise <- correction.montants.5(rawdata[[5]]$Budget_autorise_revise)
rawdata[[5]]$Budget_autorise_initial <- correction.montants.5(rawdata[[5]]$Budget_autorise_initial)

# Conversion des noms de colonnes invalides
convertir.noms <- function(noms)
{
  noms <- noms %>% iconv(to = "ASCII//TRANSLIT") %>% tolower
  noms[noms == "date_de_fin_revise"] <- "date_de_fin_revisee"
  noms[noms == "cote_de_cout"] <- "indicateur_de_cout"
  noms[noms == "indicateur_du_cout"] <- "indicateur_de_cout"
  noms[noms == "variation_cout"] <- "variation_de_cout"
  noms[noms == "cote_echeancier"] <- "indicateur_de_l_echeancier"
  noms[noms == "date_de_fin_prevue"] <- "date_de_fin_prevue_a_autorisation"
  noms[noms == "budget_autorise"] <- "budget_autorise_initial"
  noms[noms == "variation_de_cote_de_cout"] <- "variation_de_cout"
  noms[noms == "variation_de_cote_echeancier"] <- "variation_echeancier"
  noms
}

for (i in 1:7)
{
  names(rawdata[[i]]) <- convertir.noms(names(rawdata[[i]]))
}

```

Jointure de tous les fichiers de données dans une même table

```{r}
rawdata2 <- dplyr::bind_rows(rawdata)

write.csv(rawdata2, "donnees_clean.csv",quote = TRUE,row.names = FALSE, na = "")
save(rawdata2,file = "donnees_clean.RData")
```




