BigQuery et Data-Forge Notebook
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
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 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);
date | country_name | subregion1_name | subregion2_name | new_confirmed | avg_new_confirmed_7days |
---|---|---|---|---|---|
2021-01-05 | Canada | Quebec | Bas-Saint-Laurent | 9 | 11 |
2021-01-06 | Canada | Quebec | Bas-Saint-Laurent | 15 | 10.4 |
2021-01-07 | Canada | Quebec | Bas-Saint-Laurent | 4 | 10.166666666666666 |
2021-01-08 | Canada | Quebec | Bas-Saint-Laurent | 16 | 9.714285714285714 |
2021-01-09 | Canada | Quebec | Bas-Saint-Laurent | 8 | 8.714285714285714 |
2021-01-10 | Canada | Quebec | Bas-Saint-Laurent | 9 | 7.142857142857143 |
2021-01-11 | Canada | Quebec | Bas-Saint-Laurent | 7 | 7.142857142857143 |
2021-01-12 | Canada | Quebec | Bas-Saint-Laurent | 2 | 5.857142857142857 |
2021-01-13 | Canada | Quebec | Bas-Saint-Laurent | 4 | 6.142857142857143 |
2021-01-14 | Canada | Quebec | Bas-Saint-Laurent | 4 | 4.857142857142857 |
2021-01-15 | Canada | Quebec | Bas-Saint-Laurent | 7 | 4.571428571428571 |
2021-01-16 | Canada | Quebec | Bas-Saint-Laurent | 10 | 4.714285714285714 |
2021-01-17 | Canada | Quebec | Bas-Saint-Laurent | 0 | 5 |
2021-01-18 | Canada | Quebec | Bas-Saint-Laurent | 5 | 4.857142857142857 |
2021-01-19 | Canada | Quebec | Bas-Saint-Laurent | 3 | 4.428571428571429 |
2021-01-20 | Canada | Quebec | Bas-Saint-Laurent | 6 | 3.4285714285714284 |
2021-01-21 | Canada | Quebec | Bas-Saint-Laurent | 3 | 3.7142857142857144 |
2021-01-22 | Canada | Quebec | Bas-Saint-Laurent | 4 | 3.142857142857143 |
2021-01-23 | Canada | Quebec | Bas-Saint-Laurent | 3 | 2.7142857142857144 |
2021-01-24 | Canada | Quebec | Bas-Saint-Laurent | 2 | 2.4285714285714284 |
2021-01-25 | Canada | Quebec | Bas-Saint-Laurent | 1 | 2.7142857142857144 |
2021-01-26 | Canada | Quebec | Bas-Saint-Laurent | 0 | 2.4285714285714284 |
2021-01-27 | Canada | Quebec | Bas-Saint-Laurent | 4 | 2.142857142857143 |
2021-01-28 | Canada | Quebec | Bas-Saint-Laurent | 5 | 1.8571428571428572 |
2021-01-29 | Canada | Quebec | Bas-Saint-Laurent | 2 | 2 |
2021-01-30 | Canada | Quebec | Bas-Saint-Laurent | 1 | 2.142857142857143 |
2021-01-31 | Canada | Quebec | Bas-Saint-Laurent | 0 | 2.142857142857143 |
2021-02-01 | Canada | Quebec | Bas-Saint-Laurent | 2 | 1.4285714285714286 |
2021-02-02 | Canada | Quebec | Bas-Saint-Laurent | 1 | 1.4285714285714286 |
2021-02-03 | Canada | Quebec | Bas-Saint-Laurent | 4 | 1.5714285714285714 |
2021-02-04 | Canada | Quebec | Bas-Saint-Laurent | 0 | 1.8571428571428572 |
2021-02-05 | Canada | Quebec | Bas-Saint-Laurent | 2 | 1.7142857142857144 |
2021-02-06 | Canada | Quebec | Bas-Saint-Laurent | 2 | 2 |
2021-02-07 | Canada | Quebec | Bas-Saint-Laurent | 2 | 1.5714285714285714 |
2021-02-08 | Canada | Quebec | Bas-Saint-Laurent | 1 | 1.7142857142857144 |
2021-02-09 | Canada | Quebec | Bas-Saint-Laurent | 3 | 2 |
2021-02-10 | Canada | Quebec | Bas-Saint-Laurent | 1 | 2.4285714285714284 |
2021-02-11 | Canada | Quebec | Bas-Saint-Laurent | 1 | 2.857142857142857 |
2021-02-12 | Canada | Quebec | Bas-Saint-Laurent | 4 | 3.571428571428571 |
2021-02-13 | Canada | Quebec | Bas-Saint-Laurent | 5 | 3.4285714285714284 |
2021-02-14 | Canada | Quebec | Bas-Saint-Laurent | 5 | 3.571428571428571 |
2021-02-15 | Canada | Quebec | Bas-Saint-Laurent | 6 | 4.428571428571429 |
2021-02-16 | Canada | Quebec | Bas-Saint-Laurent | 2 | 4.857142857142857 |
2021-02-17 | Canada | Quebec | Bas-Saint-Laurent | 2 | 4.714285714285714 |
2021-02-18 | Canada | Quebec | Bas-Saint-Laurent | 7 | 4.857142857142857 |
2021-02-19 | Canada | Quebec | Bas-Saint-Laurent | 7 | 4.428571428571429 |
2021-02-20 | Canada | Quebec | Bas-Saint-Laurent | 4 | 4.285714285714286 |
2021-02-21 | Canada | Quebec | Bas-Saint-Laurent | 6 | 4.714285714285714 |
2021-02-22 | Canada | Quebec | Bas-Saint-Laurent | 3 | 4 |
2021-02-23 | Canada | Quebec | Bas-Saint-Laurent | 1 | 3.4285714285714284 |
2021-02-24 | Canada | Quebec | Bas-Saint-Laurent | 5 | 3.4285714285714284 |
2021-02-25 | Canada | Quebec | Bas-Saint-Laurent | 2 | 3 |
2021-02-26 | Canada | Quebec | Bas-Saint-Laurent | 3 | 2.7142857142857144 |
2021-02-27 | Canada | Quebec | Bas-Saint-Laurent | 4 | 3 |
2021-02-28 | Canada | Quebec | Bas-Saint-Laurent | 3 | 2.6 |
2021-03-01 | Canada | Quebec | Bas-Saint-Laurent | 1 | 2.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.
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
This markdown was exported from Data-Forge Notebook