Filtrez facilement les objets JavaScript avec Arquero

Le codage en JavaScript présente de nombreux avantages, mais la gestion des données n’est probablement pas en tête de liste. Cependant, il y a de bonnes nouvelles pour ceux qui trouvent que les données JavaScript représentent un défi : les mêmes idées de “grammaire des données” derrière le très populaire package dplyr R sont également disponibles en JavaScript, grâce à la bibliothèque Arquero.

Arquero, du laboratoire de données interactives de l’Université de Washington, est probablement mieux connu des utilisateurs d’Observable JavaScript, mais il est également disponible d’autres manières. L’un d’eux est Node.js.

Cet article vous montrera comment filtrer les objets JavaScript avec Arquero, avec quelques tâches bonus à la fin.

Étape 1. Charger Arquero

Arquero est une bibliothèque standard avec Observable JavaScript et in Quarto, c’est ainsi que je l’utilise. Dans ce cas, aucune installation n’est requise. Si vous utilisez Arquero dans Node, vous devrez l’installer avec npm install arquero --save. Dans le navigateur, utilisez .

Dans Observable, vous pouvez charger Arquero avec import {aq, op} from "@uwdata/arquero". Dans le navigateur, Arquero sera chargé comme aq. Dans Node, vous pouvez le charger avec const aq = require('arquero').

Le reste du code de ce didacticiel doit s’exécuter tel quel dans Observable et Quarto. Si vous l’utilisez dans un environnement asynchrone comme Node, vous devrez faire les ajustements nécessaires pour le chargement et le traitement des données.

Étape 2. Transformez vos données en une table Arquero

Vous pouvez transformer un objet JavaScript “normal” existant en une table Arquero avec aq.from(my_object).

Une autre option consiste à importer directement des données distantes en tant que table Arquero avec Arquero’s load famille de fonctions—fonctions comme aq.loadCSV("myurl.com/mycsvfile.csv") pour un fichier CSV et aq.loadJSON("myjsonurl.com/myjsonfile.json") pour un fichier JSON sur le Web. Vous trouverez plus d’informations sur les fonctions d’entrée de table sur le site Web de documentation de l’API Arquero.

Afin de suivre le reste de ce didacticiel, exécutez le code ci-dessous pour importer des exemples de données sur les changements de population dans les États américains.


states_table = aq.loadCSV("https://raw.githubusercontent.com/smach/SampleData/master/states.csv")

Les tables Arquero ont une particularité view() méthode à utiliser avec Observable JavaScript et dans Quarto. La states_table.view() La commande renvoie quelque chose comme la sortie illustrée à la figure 1.

Tableau avec colonnes pour State, Pop_2000, Pop_2010, Pop_2020, PctChange_2000, Pct_change_2010, Sharon Machlis

Figure 1. Le résultat de l’utilisation de la méthode Arquero table view().

JavaScript observable Inputs.table(states_table) (qui a des en-têtes de colonne cliquables pour le tri) fonctionne également pour afficher une table Arquero.

En dehors d’Observable, vous pouvez utiliser states_table.print() pour imprimer le tableau sur la console.

Étape 3. Filtrer les lignes

Les tables Arquero ont beaucoup de méthodes intégrées pour le traitement et l’analyse des données, y compris le filtrage des lignes pour des conditions spécifiques avec filter().

Une note aux utilisateurs de R: Arqueros filter() la syntaxe n’est pas aussi simple que celle de dplyr filter(Region == 'RegionName'). Comme il s’agit de JavaScript et que la plupart des fonctions ne sont pas vectorisées, vous devez créer une fonction anonyme avec. d => puis exécutez une autre fonction à l’intérieur de celle-ci, généralement une fonction de op (importé dessus avec arquero). Même si vous êtes habitué à un langage autre que JavaScript, une fois familiarisé avec cette construction, c’est assez facile à utiliser.

La syntaxe usuelle est :


filter(d => op.opfunction(d.columnname, 'argument')

Dans cet exemple, le op la fonction que je veux est op.equal(), qui (comme son nom l’indique) teste l’égalité. Ainsi, le code Arquero pour les seuls États de la région nord-est des États-Unis serait :


states_table
  .filter(d => op.equal(d.Region, 'Northeast'))

Vous pouvez rajouter .view() à la fin pour voir les résultats.

Une note sur la syntaxe filter(): Le code à l’intérieur filter() est un arquero expression de tableau. “A première vue, les expressions de table ressemblent à des fonctions JavaScript normales… mais attendez !” explique le site Web de référence de l’API du site Web d’Arquero. “Sous le capot, Arquero prend un ensemble de définitions de fonctions, les mappe sur des chaînes, puis les analyse, les réécrit et les compile pour gérer efficacement les données en interne.”

Qu’est-ce que cela signifie pour vous? En plus de la fonction de syntaxe JavaScript habituelle, vous pouvez également utiliser des syntaxe des expressions de table tel que filter("d => op.equal(d.Region, 'Northeast')") ou filter("equal(d.Region, 'Northeast')"). Consultez la référence de l’API si vous pensez que l’une de ces versions pourrait être plus attrayante ou utile.

Cela signifie également que vous ne pouvez pas utiliser n’importe quel type de fonction JavaScript dans filter() et autres verbes arquero. Par exemple, for Les boucles ne sont pas autorisées à moins qu’elles ne soient enveloppées par un escape() “aide à l’expression.” Consultez la référence de l’API Arquero pour en savoir plus.

Une note aux utilisateurs de Python: Arquero filter est conçu pour créer des sous-ensembles de lignes uniquement, pas les lignes non plus ou colonnes, comme on le voit avec pandas.filter. (Nous passerons ensuite aux colonnes.)

Les filtres peuvent être plus complexes qu’un seul test, avec des conditions négatives ou multiples. Par exemple, si vous souhaitez “noms d’état en un mot dans la région Ouest”, vous devez rechercher les noms d’état qui n’incluent pas d’espace et Région égale Ouest. Une façon d’y parvenir est !op.includes(d.State, ' ') && op.equal(d.Region, 'West') à l’intérieur de filter(d =>) fonction anonyme :


states_table
  .filter(d => !op.includes(d.State, ' ') && 
     op.equal(d.Region, 'West'))

Pour rechercher et filtrer par expression régulière au lieu d’égalité, utilisez op.match() au lieu de op.equal().

Étape 4. Sélectionnez les colonnes

Ne sélectionner que certains Colonnes est similaire à dplyr select(). En fait, c’est encore plus simple, puisque vous n’avez pas besoin de transformer la sélection en tableau ; l’argument est juste des noms de colonnes séparés par des virgules à l’intérieur select()::


states_table
  .select('State', 'State Code', 'Region', 'Division', 'Pop_2020')

Vous pouvez renommer les colonnes en les sélectionnant, en utilisant la syntaxe : select{{ OldName1: 'NewName1', OldName2: 'NewName2' }). Voici un exemple :


states_table
  .select({ State: 'State', 'State Code': 'Abbr', Region: 'Region', 
      Division: 'Division', Pop_2020: 'Pop' })

Étape 5. Créer un tableau de valeurs uniques dans une colonne de table

Il peut être utile d’obtenir les valeurs uniques d’une colonne sous la forme d’un tableau JavaScript vanille, pour des tâches telles que le remplissage d’une liste déroulante d’entrée. Arquero a plusieurs fonctions pour y parvenir :

  • dedupe() obtient des valeurs uniques.
  • orderby() trier les résultats.
  • array() transforme les données d’une colonne de table Arquero en un tableau JavaScript conventionnel.

Voici une façon de créer un tableau trié de noms de division uniques à partir de states_table:


region_array = states_table
  .select('Region')                                      
  .dedupe()                                                                 
  .orderby('Region')
  .array('Region')

Étant donné que ce nouvel objet est un tableau JavaScript, les méthodes Arquero ne fonctionneront plus dessus, mais les méthodes de tableau conventionnelles le feront. Voici un exemple :


'The regions are ' + region_array.join(', ')

Ce code obtient la sortie suivante :

"The regions are , Midwest, Northeast, South, West"

Cette première virgule dans la chaîne de caractères ci-dessus est due au fait qu’il y a un nul valeur dans le tableau. Si vous souhaitez supprimer des valeurs vides comme null, vous pouvez utiliser le Arquero op.compact() fonction sur les résultats :


  region_array2 = op.compact(states_table
  .select('Region')                                      
  .dedupe()                                                                 
  .orderby('Region')
  .array('Region')
  )

Une autre option consiste à utiliser du JavaScript vanille filter() pour supprimer les valeurs nulles d’un tableau de chaînes de texte. Notez que le JavaScript vanille suivant filter() fonction pour tableaux JavaScript unidimensionnels n’est pas le même que celui d’Arquero filter() pour tables arquero bidimensionnelles:


 region_array3 = states_table
  .select('Region')                                      
  .dedupe()                                                                 
  .orderby('Region')
  .array('Region')
  .filter(n => n)

Les utilisateurs JavaScript observables, y compris ceux qui utilisent Quarto, peuvent également utiliser le md fonction pour ajouter un style à la chaîne, comme du texte en gras avec **. Alors, ce code

md`The regions are **${region_array2.join(', ')}**.`

produit la sortie suivante :


The regions are Midwest, Northeast, South, West

En passant, notez que l’objet JavaScript Intl.ListFormat() facilite l’ajout de « et » avant le dernier élément dans un tableau à chaîne séparé par des virgules. Alors, le code


my_formatter = new Intl.ListFormat('en', { style: 'long', type: 'conjunction' });
my_formatter.format(region_array3)

produit la sortie :


"Midwest, Northeast, South, and West"

Il y a beaucoup plus à Arquero

Filtrage, sélection, déduplication et création de tableaux avec à peine des rayures sur la surface de ce qu’Arquero peut faire. La bibliothèque contient des verbes pour le remodelage, la fusion, l’agrégation de données, etc., ainsi que op fonctions de calcul et d’analyse telles que la moyenne, la médiane, le quantile, les classements, le décalage et l’avance. Consultez Présentation d’Arquero pour un aperçu de plus de fonctionnalités. Consultez également An Illustrated Guide to Arquero Verbs et la documentation de l’API Arquero pour une liste complète, ou visitez le bloc-notes Data Wrangler Observable pour une application interactive montrant ce qu’Arquero peut faire.

Pour en savoir plus sur Observable JavaScript et Quarto, ne manquez pas Un guide du débutant pour utiliser Observable JavaScript, R et Python avec Quarto et Learn Observable JavaScript with Observable notebooks.

Copyright © 2022 IDG Communications, Inc. Tous droits réservés.

Leave a Comment

Your email address will not be published. Required fields are marked *