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
modifierChaque cellule du tableur affiché dans OpenRefine peut être modifiée individuellement. Cela est aussi possible sur les facettes elles-mêmes.
Ligne
modifierAjouter 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
modifierOpenRefine 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
modifierGroupe
modifierÀ 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
modifierIl 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
modifierTyper une colonne en date
modifierTransformer 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
modifierClic 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
modifierGREL 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- 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
modifierComme 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
modifierMathieu 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
modifierLe 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
modifierLe 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- 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- ↑ 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).