« OpenRefine/Nettoyage des données » : différence entre les versions

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
2le2im-bdc (discussion | contributions)
2le2im-bdc (discussion | contributions)
Ligne 72 : Ligne 72 :
#''value'' appelle la valeur de la colonne d'où est partie la requête.
#''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.
#''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<ref name="Saby-GREL"/>,
Tiré en partie du mémo de Mathieu Saby<ref name="Saby-GREL"/>,


===Transformations primaires===
===Transformations primaires===

Version du 11 février 2020 à 23:25

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

Chaque cellule du tableur affiché dans OpenRefine peut être modifiée individuellement. Cela est aussi possible sur les facettes elles-mêmes.

Ligne

Ajouter une ligne dans OpenRefine c'est possible.

  1. Choisir la colonne dans laquelle se trouve l'information à répartir sur deux lignes;
  2. Puis "Éditer les cellules"->"Diviser les cellules multivariées"
  3. Définir le type de séparateur qui opérera la séparation.

Journal des actions

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

Groupe

À 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 proporition 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 video no 1 d'introduction de 2011.

Chaînes de caractères

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

Typer une colonne en date

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 -> Editer les cellules -> Transfomations 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

Clic sur la colonne -> Editer 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

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

  1. Les formules GREL ne commence pas par un signe = contrairement à celles des tableurs habituels.
  2. La formule n'est pas stockée dans la cellule. C'est le résultat qui l'est.
  3. value appelle la valeur de la colonne d'où est partie la requête.
  4. cells['nom de la colonne'] ou cells.nom_colonne permet d'appeler n'importe quel valeur sur une autre colonne.
  5. les transformations peuvent être enchaînées par un point.
  6. 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

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

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.

  • forEach(value.split("-"), v, v.toTitlecase()).join("-") pour appliquer une majuscule sur les intiales à un nom composé, par exemple : nadine-josette[4].
  • value(1,5) qui signifie reprendre les valeurs ayant la position de 1 à 5 dans la nouvelle colonne[5].
  • value + " " + cells["nom de la colonne"].value[6] permet de concatener les valeurs de deux colonnes dans une troisième.
  • value.log()[7].
  • value.parseJson().responseData.language[8].
  • value.replace("quelque chose","par quelque chose d'autre")[7]>.
    • 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.substring(2) qui signifie reprendre tous les caractères moins ceux ayant les deux premières positions[5].
  • value.toDate('yyyy-MM-dd','MMM-yy').toString('dd-MM-yyyy') pour changer le type de date[2].

Transformations conditionnelles

  • 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[5].
  • 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].
  • not(value.startsWith("quelque chose"))[5].
  • with(value.parseJson()[0],pair, pair.lat + ',' + pair.lon)[8].
  • filter
  • forEach
  • forEachIndex
  • forRange
  • IsBlank
  • IsNonBlank
  • IsNull
  • IsNotNull
  • IsNumeric
  • IsError
  • forNonBlank

Références

  1. Maïwenn Bourdic, « Typer une colonne en date », sur https://www.patrimoine-et-numerique.fr, (consulté le 6 décembre 2019).
  2. 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. 3,0 3,1 3,2 et 3,3 Mathieu Saby, « Programmer dans Openrefine avec GREL », sur https://fr.slideshare.net, (consulté le 11 février 2020).
  4. Merci à Ettore Rizza de nous avoir fourni l'expression.
  5. 5,0 5,1 5,2 et 5,3 Voir video 2 de 2011
  6. (en) Illionois University Library, « Combining Cell Values », sur https://guides.library.illinois.edu/openrefine, (consulté le 28 janvier 2020).
  7. 7,0 et 7,1 Voir video 1 de 2011
  8. 8,0 et 8,1 Voir video 3 de 2011
  9. Maïwenn Bourdic, « Concatener », (consulté le 28 janvier 2020).