BigQuery et Data-Forge Notebook

Publié le lundi 22 mars 2021
This post thumbnail

BigQuery et Data-Forge Notebook

Dans cet article, nous allons utiliser la librairie Javascript de BigQuery pour effectuer des requêtes à distance à l’aide du logiciel Data-Forge Notebook.

Data-Forge Notebook

Le logiciel Data-Forge Notebook est une application d’analyse de données inspirée de Jupyter NoteBook qui utilise les langages Javascript et TypeScript. Ce logiciel permet d’explorer sur son poste de travail du code Javascript et TypeScript. Grâce à plusieurs fonctions d'affichage de données et de graphiques, il offre un environnement visuel qui permet d’explorer les données. Il offre des fonctions d’exportation des Notebooks en HTML, PDF, PNG et Markdown. Il est possible aussi d’exporter le code sous forme de projet Node.

De plus, il est possible de créer en plus des blocs de code, de créer des blocs de texte en format Markdown directement. Par exemple, cet article a été créé à l’aide de Dataforge Notebook.

Le logiciel est bien documenté et un bon nombre d’exemples sont disponibles.

Il existe une version gratuite et une version Pro peu dispendieuse (50$US).

Le logiciel développé par Ashley Davis, l'auteur des livres : “Data Wrangling with JavaScript” et “Bootstrapping Microservices”.

Aussi, le support est excellent, l’auteur répond habituellement rapidement aux questions.

Librairie BigQuery Javascript

Google fournit une librairie JavaScript pour Node, cette librairie est disponible sur GitHub.

Normalement pour l’installer dans un projet Node, il suffit de faire la commande npm install suivie du nom du projet. Cependant avec DFN, cela n’est pas nécessaire, il suffit d’inscrire la référence avant d’utiliser la librairie, l’installation se fera en arrière-plan.

const { BigQuery } = require('@google-cloud/bigquery');

Ensemble de données publiques COVID-19

L’ensemble de données COVID-19 est fourni et maintenu par Google. Il utilise les données provenant de divers pays qui rendent publique l’information. Il contient les données journalières sur divers paramètres relatifs à la pandémie tels que les données relatives au nombre de cas, la météo, les données démographiques et autres. Plus d’une quarantaine de champs d’information peuvent être disponibles en fonction de la source de données.

Habituellement, les données proviennent des autorités de santé publique des pays. L’ensemble est mis à jour quotidiennement par des moyens automatisés et manuels.

Requête utilisée

Nous allons réutiliser une requête que nous avons utilisée dans un article précédent pour obtenir les données des nouveaux cas de COVID-19 pour la région du Bas-Saint-Laurent.

Créer le compte de service et obtenir une clé de service

En premier, il faut créer un compte de service,

Pour créer le compte de service et télécharger la clé de service, il faut aller dans la Console de Google Cloud. Sélectionner le projet et choisir l’option service account du menu “IAM and Accounts”. Il suffit alors de créer le compte de service en lui donnant un nom et par la suite lui donner le rôle “BigQuery Job User”.

Créer le compte de service ><Créer le compte de service

Une fois le compte de service créé, il faut créer et télécharger la clé de service en format JSON pour l’utiliser à l’aide de DFN.

Créer la clé de service ><Créer et exporter la clé de service

Soyez certain de ne pas distribuer cette clé de service à d’autres personnes et s’assurer qu’elle ne soit pas rendue publique par inadvertance.

Si vous enregistrez votre code dans git par exemple, soyez certain que le fichier est ignoré. Vous pouvez ajouter le nom du fichier à votre fichier .gitignore.

Code

const { BigQuery } = require('@google-cloud/bigquery');
const moment = require('moment');
const queryCovid19Start = 'SELECT date, country_code, country_name, subregion1_code, subregion1_name, subregion2_name, cumulative_confirmed, cumulative_recovered, cumulative_deceased, cumulative_tested, new_confirmed, AVG(new_confirmed) OVER(PARTITION BY subregion2_name ORDER BY date ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING) AS avg_new_confirmed_7days FROM \`bigquery-public-data.covid19_open_data.covid19_open_data\`';

const fromParam = '2021-01-05';
const toParam = '2021-03-01';
const countryCode = 'CA';
const regionCode = 'QC';
const subregionName = 'Bas-Saint-Laurent';

const sqlQuery =
    queryCovid19Start +
    ` 
      WHERE country_code = @country_code 
      AND subregion1_code = @region_code 
      AND subregion2_name = @subregion_name 
      AND date >= @from AND date <= @to
      LIMIT 1000 `;

const options = {
    query: sqlQuery,
    // Location must match that of the dataset(s) referenced in the query.
    location: 'US',
    params: {
        from: fromParam,
        to: toParam,
        country_code: countryCode,
        region_code: regionCode,
        subregion_name: subregionName,
    },
};

// console.log(options);
// display(options);
// Set authentication
const accessOptions = {
    keyFilename: '.env/covid19-api-service-account.json',
    projectId: 'clovid19-api',
};

// Create a client
const bigqueryClient = new BigQuery(accessOptions);
// Run the query
const [rows] = await bigqueryClient.query(options);
//display(rows[0]);

Transformer les données obtenus de BigQuery.

La date doit être mise au premier niveau pour l'affichage en tableau.


function transform(value) {
    return {
        'date': value.date.value,
        'country_name': value.country_name,
        'subregion1_name': value.subregion1_name,
        'subregion2_name': value.subregion2_name,
        'new_confirmed': value.new_confirmed,
        'avg_new_confirmed_7days': value.avg_new_confirmed_7days
    };                  
}

let t = rows.map(v => transform(v));

Afficher les données dans une table Data-Forge Notebook

display.table(t);
datecountry_namesubregion1_namesubregion2_namenew_confirmedavg_new_confirmed_7days
2021-01-05CanadaQuebecBas-Saint-Laurent911
2021-01-06CanadaQuebecBas-Saint-Laurent1510.4
2021-01-07CanadaQuebecBas-Saint-Laurent410.166666666666666
2021-01-08CanadaQuebecBas-Saint-Laurent169.714285714285714
2021-01-09CanadaQuebecBas-Saint-Laurent88.714285714285714
2021-01-10CanadaQuebecBas-Saint-Laurent97.142857142857143
2021-01-11CanadaQuebecBas-Saint-Laurent77.142857142857143
2021-01-12CanadaQuebecBas-Saint-Laurent25.857142857142857
2021-01-13CanadaQuebecBas-Saint-Laurent46.142857142857143
2021-01-14CanadaQuebecBas-Saint-Laurent44.857142857142857
2021-01-15CanadaQuebecBas-Saint-Laurent74.571428571428571
2021-01-16CanadaQuebecBas-Saint-Laurent104.714285714285714
2021-01-17CanadaQuebecBas-Saint-Laurent05
2021-01-18CanadaQuebecBas-Saint-Laurent54.857142857142857
2021-01-19CanadaQuebecBas-Saint-Laurent34.428571428571429
2021-01-20CanadaQuebecBas-Saint-Laurent63.4285714285714284
2021-01-21CanadaQuebecBas-Saint-Laurent33.7142857142857144
2021-01-22CanadaQuebecBas-Saint-Laurent43.142857142857143
2021-01-23CanadaQuebecBas-Saint-Laurent32.7142857142857144
2021-01-24CanadaQuebecBas-Saint-Laurent22.4285714285714284
2021-01-25CanadaQuebecBas-Saint-Laurent12.7142857142857144
2021-01-26CanadaQuebecBas-Saint-Laurent02.4285714285714284
2021-01-27CanadaQuebecBas-Saint-Laurent42.142857142857143
2021-01-28CanadaQuebecBas-Saint-Laurent51.8571428571428572
2021-01-29CanadaQuebecBas-Saint-Laurent22
2021-01-30CanadaQuebecBas-Saint-Laurent12.142857142857143
2021-01-31CanadaQuebecBas-Saint-Laurent02.142857142857143
2021-02-01CanadaQuebecBas-Saint-Laurent21.4285714285714286
2021-02-02CanadaQuebecBas-Saint-Laurent11.4285714285714286
2021-02-03CanadaQuebecBas-Saint-Laurent41.5714285714285714
2021-02-04CanadaQuebecBas-Saint-Laurent01.8571428571428572
2021-02-05CanadaQuebecBas-Saint-Laurent21.7142857142857144
2021-02-06CanadaQuebecBas-Saint-Laurent22
2021-02-07CanadaQuebecBas-Saint-Laurent21.5714285714285714
2021-02-08CanadaQuebecBas-Saint-Laurent11.7142857142857144
2021-02-09CanadaQuebecBas-Saint-Laurent32
2021-02-10CanadaQuebecBas-Saint-Laurent12.4285714285714284
2021-02-11CanadaQuebecBas-Saint-Laurent12.857142857142857
2021-02-12CanadaQuebecBas-Saint-Laurent43.571428571428571
2021-02-13CanadaQuebecBas-Saint-Laurent53.4285714285714284
2021-02-14CanadaQuebecBas-Saint-Laurent53.571428571428571
2021-02-15CanadaQuebecBas-Saint-Laurent64.428571428571429
2021-02-16CanadaQuebecBas-Saint-Laurent24.857142857142857
2021-02-17CanadaQuebecBas-Saint-Laurent24.714285714285714
2021-02-18CanadaQuebecBas-Saint-Laurent74.857142857142857
2021-02-19CanadaQuebecBas-Saint-Laurent74.428571428571429
2021-02-20CanadaQuebecBas-Saint-Laurent44.285714285714286
2021-02-21CanadaQuebecBas-Saint-Laurent64.714285714285714
2021-02-22CanadaQuebecBas-Saint-Laurent34
2021-02-23CanadaQuebecBas-Saint-Laurent13.4285714285714284
2021-02-24CanadaQuebecBas-Saint-Laurent53.4285714285714284
2021-02-25CanadaQuebecBas-Saint-Laurent23
2021-02-26CanadaQuebecBas-Saint-Laurent32.7142857142857144
2021-02-27CanadaQuebecBas-Saint-Laurent43
2021-02-28CanadaQuebecBas-Saint-Laurent32.6
2021-03-01CanadaQuebecBas-Saint-Laurent12.75

Faire un graphique des données à l'aide de la librairie graphique incluse dans DFN

display.plot(t, {}, { x: "date", y: [ "new_confirmed", "avg_new_confirmed_7days"] }); // Plot chart.

plot

Conclusion

Data-Forge Notebook en combinaison avec BigQuery permet d'extraire et de travailler avec les données dans un environnement interactif à l'aide du langage Javascript. Il est alors possible par la suite par exemple d'utiliser une partie du code généré pour l'utiliser dans un microservice Node par exemple.

Dans le cas de cet article, il a été rédigé au complet dans Data-Forge Notebook et exporté en format markdown pour être publié presque intégralement à l'aide d'Eleventy. J'ai seulement eu à insérer les métadata et corriger le lien pour les images afin de le publier sur le site.

Références

Data-Forge Notebook

Librairie BigQuery NodeJS

This markdown was exported from Data-Forge Notebook