OpenRefine/Nettoyage des données
Une fois l'analyse des données effectuées, on peut se lancer dans le nettoyage de celles-ci.
Il existe au moins deux manières principales de nettoyer des données : travailler individuellement sur chacune de celles-ci ou de faire des modifications en masse. OpenRefine permet les deux mais évidemment son principal avantage réside dans les transformations de masse.
Modifications individuelles
[modifier | modifier le wikicode]Chaque cellule du tableur affiché dans OpenRefine peut être modifiée individuellement. Cela est aussi possible sur les facettes elles-mêmes.
Ligne
[modifier | modifier le wikicode]Ajouter une ligne dans OpenRefine c'est possible.
- Choisir la colonne dans laquelle se trouve l'information à répartir sur deux lignes;
- Puis "Éditer les cellules"->"Diviser les cellules multivariées"
- Définir le type de séparateur qui opérera la séparation.
Journal des actions
[modifier | modifier le wikicode]OpenRefine offre dans la zone de gauche de l'interface de traitement des données un journal des actions et transformations opérées. Cela permet de revenir en tout temps en arrière, y compris jusqu'à la première action.
Ce journal des actions peut aussi être exporté (via "Extraire") afin de pouvoir être rejoué (via "Appliquer") tel quel sur un nouveau ensemble de données. Cette fonctionnalité est très pratique si on travaille sur plusieurs fichiers similaires ou sur plusieurs versions d'un même fichier (par exemple fichier mis à jour régulièrement).
Modifications en masse
[modifier | modifier le wikicode]Groupe
[modifier | modifier le wikicode]À partir d'une liste de termes obtenus par la demande d'une facette, ou simplement en choisissant Éditer les cellules->Grouper et éditer, OpenRefine offre une proportion de regroupement des valeurs par similitude. À partir de cette visualisation, il est possible de procéder à des fusions de termes sous une même valeur. Voir à ce sujet la vidéo n°1 d'introduction de 2011.
Chaînes de caractères
[modifier | modifier le wikicode]Il existe de nombreuses fonctions GREL pour manipuler les chaînes de caractères :
- pour les découper (
trim(c) strip(c) chomp(c1, c2) substring(c, 0, 10) split(c1, c2)
), - pour changer la casse (
toLowercase(c) toUppercase(c) toTitlecase(c)
), - pour calculer ou compter la chaîne (
length(c) contains(c1, c2)
), - etc.
Dates
[modifier | modifier le wikicode]Typer une colonne en date
[modifier | modifier le wikicode]Transformer le format d'une colonne en date (de type aaaa-mm-jjT00:00:00Z, soit jusqu'à l'heure !) permet d'utiliser la facette chronologique, et donc la jauge temporelle.
Pour ce faire : Clic sur la colonne -> Éditer les cellules -> Transformations courantes -> En date.
Un conseil : dupliquer la colonne date pour faire la manipulation sur un double...
Source : le blog de Maïwenn Bourdic[1].
Changer le type de date
[modifier | modifier le wikicode]Clic sur la colonne -> Éditer les cellules -> Transformer -> la commande GREL :
value.toDate('yyyy-MM-dd','MMM-yy').toString('dd-MM-yyyy')
Source : le blog de Maïwenn Bourdic[2].
GREL
[modifier | modifier le wikicode]GREL est un acronyme qui signifie General Refine Expression Language.
Voir la documentation officielle et aussi le mémo de Mathieu Saby[3]
La base
[modifier | modifier le wikicode]- Les formules GREL ne commence pas par un signe = contrairement à celles des tableurs habituels.
- La formule n'est pas stockée dans la cellule. C'est le résultat qui l'est.
- value appelle la valeur de la colonne d'où est partie la requête.
- cells['nom de la colonne'] ou cells.nom_colonne permet d'appeler n'importe quel valeur sur une autre colonne.
- les transformations peuvent être enchaînées par un point.
- les transformations peuvent encapsulées par des parenthèses (seule possibilité pour les transformations conditionnelles).
Tiré en partie du mémo de Mathieu Saby[3],
Transformations primaires
[modifier | modifier le wikicode]Comme le dit Mathieu Saby dans son mémo[3], Les formules GREL permette de réaliser les opérations simples comme :
- concaténer des valeurs : "a"+"b"->ab
- calculer sur les nombres grâce aux opérateurs + - / *: 1+2->3
- comparer grâce aux opérateur : ==,!==,<,>,=>,<=
Transformations directes
[modifier | modifier le wikicode]Mathieu Saby distingue[3] les formules GREL de fonction et celles de contrôle, nous les avons distingué ici entre celles de transformations directes et celles de transformations conditionnelles, recoupant plus ou moins la même distinction.
premier modèle
[modifier | modifier le wikicode]Le premier modèle s'écrit fonction(paramètres)[3].
- forEach(value.split("-"), v, v.toTitlecase()).join("-") pour appliquer une majuscule sur les initiales à un nom composé, par exemple : nadine-josette[4].
- value.substring(0,1) qui signifie reprendre la valeur depuis la première lettre (position 0) en enlevant celles depuis la seconde lettre (position 1).
- value.substring(31) : on enlève les 31 premiers signes.
- value + " " + cells["nom de la colonne"].value[5] permet de concaténer les valeurs de deux colonnes dans une troisième.
- cells["nom de la colonne"].value (exemple : value+" "+cells["Person_1 1"].value)
second modèle
[modifier | modifier le wikicode]Le second modèle s'écrit Paramètre1.fonction(Paramètre2)[3].
- value.log()[6].
- value.parseJson().responseData.language[7].
- value.replace("quelque chose","par quelque chose d'autre")[6]>.
- value.replace(value,"par quelque chose d'autre") permet de créer une nouvelle colonne en fonction d'une existante avec une valeur nouvelle.
value.replace(/\n/, " | ")
remplace (via REGEX) les retours à la ligne par un pipe (à vérifier).
- value.substring(2) qui signifie reprendre tous les caractères moins ceux ayant les deux premières positions[8].
- value.toDate('yyyy-MM-dd','MMM-yy').toString('dd-MM-yyyy') pour changer le type de date[2].
Transformations conditionnelles
[modifier | modifier le wikicode]- if(cells["titre d'une autre colonne"].value, value + "un texte", value) qui nécessite que l'autre colonne dispose de valeur de requête vrai ou faux. Si c'est le cas alors on peut utiliser if (si) le valeur est vraie alors ajoute au texte existant un texte, sinon on laisse la valeur telle quelle[8].
- if(isBlank(cells["colonne 1"].value), " - ", cells["colonne 1"].value) + " - " + if(isBlank(cells["colonne 2"].value), " - ", cells["colonne 2"].value) + " - " + if(isBlank(cells["colonne 3"].value), " - ", cells["colonne 3"].value) + " - " + if(isBlank(cells["colonne 4"].value), " - ", cells["colonne 4"].value) pour concatener le contenu de 4 colonnes dont certaines ne disposent pas de valeur[9].
- "film de "+if(isBlank(cells["Réal1"].value), " ", cells["Réal1"].value) + if(isBlank(cells["Réal2"].value), "", ", "+cells["Réal2"].value) + if(isBlank(cells["Réal3"].value), "", ", "+cells["Réal3"].value)+ if(isBlank(cells["Réal4"].value), "", ", "+cells["Réal4"].value)+ if(isBlank(cells["Réal5"].value), "", ", "+cells["Réal5"].value)+ if(isBlank(cells["Réal6"].value), "", ", "+cells["Réal6"].value)+ if(isBlank(cells["Réal7"].value), "", ", "+cells["Réal7"].value)
- not(value.startsWith("quelque chose"))[8].
- with(value.parseJson()[0],pair, pair.lat + ',' + pair.lon)[7].
- filter
- forEach
- forEachIndex
- forRange
- IsBlank
- IsNonBlank
- IsNull
- IsNotNull
- IsNumeric
- IsError
- forNonBlank
Références
[modifier | modifier le wikicode]- ↑ Maïwenn Bourdic, « Typer une colonne en date », sur https://www.patrimoine-et-numerique.fr, (consulté le 6 décembre 2019).
- ↑ 2,0 et 2,1 Maïwenn Bourdic, « Changer le type de date », sur https://www.patrimoine-et-numerique.fr, (consulté le 7 décembre 2019).
- ↑ 3,0 3,1 3,2 3,3 3,4 et 3,5 Mathieu Saby, « Programmer dans Openrefine avec GREL », sur https://fr.slideshare.net, (consulté le 11 février 2020).
- ↑ Merci à Ettore Rizza de nous avoir fourni l'expression.
- ↑ (en) Illionois University Library, « Combining Cell Values », sur https://guides.library.illinois.edu/openrefine, (consulté le 28 janvier 2020).
- ↑ 6,0 et 6,1 Voir video 1 de 2011
- ↑ 7,0 et 7,1 Voir video 3 de 2011
- ↑ 8,0 8,1 et 8,2 Voir video 2 de 2011
- ↑ Maïwenn Bourdic, « Concatener », (consulté le 28 janvier 2020).