Chargement des données avec NodeJS
Chargez et parsez vos données CSV sous NodeJS
Cet article est le premier d'une série qui va étudier dans quelle mesure NodeJS et
plus généralement javascript peuvent être utilisés sur un projet orienté DataScience.
De prime abord, ce n'est pas, en effet, le langage auquel on pense en premier dans le domaine.
Néanmoins il existe de plus en plus de modules spécialisés. Par ailleurs, la portabilité
inter-navigateurs et l'essence event-driven désynchronisée de javascript en font un
candidat intéressant.
Nous allons, dans cet article, voir comment charger des données issues d'un fichier CSV et comment
les découper, les "parser", pour en tirer un dataframe. Nous allons évoquer, pour cela, deux méthodes,
le chargement par flux de lecture et le chargement via le module node-pandas.
Flux de lecture ReadStream
Il nous faut charger 3 modules : le gestionnaire d'évènements (events), le système de fichiers (fs) et le parser CSV (csv-parser). Les deux premiers sont natifs à NodeJS, nous n'avons donc pas d'installation à faire, le parser nécessite par contre d'être installé au préalable.
npm install csv-parser
Nous pouvons à présent charger les modules depuis dans notre code :
//Chargement des modules
const Event = require('events');
const File = require('fs');
const csv = require('csv-parser');
Dans cet exemple nous allons charger un fichier des températures quotiennes de différentes villes. Ce fichier comporte 8 colonnes qui sont la région, le pays, l'état, la ville, le mois, le jour, l'année et la température moyenne constatée. Il dispose d'une ligne d'en-tête pour le nom des colonnes et a pour séparateur la virgule. Voici un extrait brut du fichier :
Region,Country,State,City,Month,Day,Year,AvgTemperature Africa,Algeria,,Algiers,1,1,1995,64.2 Africa,Algeria,,Algiers,1,2,1995,49.4 Africa,Algeria,,Algiers,1,3,1995,48.8 Africa,Algeria,,Algiers,1,4,1995,46.4 Africa,Algeria,,Algiers,1,5,1995,47.9 ...
Déclarons quelques constantes afin, entre autres, d'éviter de charger la ligne d'en-tête et stipuler le séparateur. Nous en profitons pour déclarer notre dataframe (ici df).
//Declaration des constantes et variables
const fileName = "../data/city_temperature.csv";
const separator = ",";
const skipLines = 1;
const csvOptions = {'separator': separator,
'skipLines': skipLines,
'headers': false};
var df = [];
Nous l'avons évoqué en introduction. La force de javascript réside dans sa gestion des évènements. Nous allons ici instancier un nouvel évènement qui sera émis en fin de lecture afin de pouvoir reprendre la main.
//Instanciation d'un evenement
const event = new Event();
Ceci étant fait nous pouvons à présent générer notre flux de lecture via la méthode createReadStream du système de fichier. Ce flux comporte 3 étapes : le découpage du fichier selon les options définies, le chargement dans le dataframe et enfin l'émission d'un évènement de fin de lecture.
//Generation du flux de chargement
File.createReadStream(fileName)
.pipe(csv(csvOptions))
.on('data', (data) => df.push({'Region' : String(data[0]),
'Country': String(data[1]),
'State' : String(data[2]),
'City' : String(data[3]),
'Month' : Number(data[4]),
'Day' : Number(data[5]),
'Year' : Number(data[6]),
'AvgTemperature': Number(data[7]),}))
.on('end', () => event.emit('finished'));
Comme vous pouvez le constater nous spécifions le type des données et leur emplacement. Un programme plus évolué pourra tout à fait le faire automatiquement.
Nous avons, en fin de lecture, généré un évènement finished. Nous allons le capturer pour éditer notre dataframe.
//Traitement de l'evenement emis en fin de lecture
event.on('finished', function () {
const parsed_data = df.map((data) => [data.City,
data.Year,
data.Month,
data.Day,
data.AvgTemperature]);
console.log(parsed_data)
});

Chargement avec node-pandas
Tout le monde connait Pandas, LA librairie Python, que tout data analyst ou data scientist utilise pour manipuler les données volumineuses inhérentes à la data science. Node-pandas, comme son nom l'indique, a pour ambition de transposer pandas sur NodeJS. Ce module est encore en cours de développement, aussi les fonctionnalités sont encore très limitées, néanmoins le chargement d'un CSV s'avère très simple à mettre en œuvre.
Commençons par installer node-pandas.
npm install node-pandas
Ensuite, sur la base du même fichier que précédemment, chargeons nos données dans un dataframe puis éditons le.
const pd = require("node-pandas")
df = pd.readCsv("../data/city_temperature.csv")
df.show

Voila, avouez que c'est tout de même bien pratique. Vous noterez que les données sont typées. L'accès aux données est également très simple à appréhender car proche de ce que nous connaissons :
//Editer une colonne sous forme de serie
console.log(df['Month'])
//Acceder a une valeur : ici la ville de la 3e observation
console.log(df['City'][3])
Retrouvez dans la rubrique "Nos datasets" toutes les données dont vous aurez besoin pour tester et pratiquer !