JupySQL est une bibliothèque Python qui permet d’exécuter du SQL dans les notebooks Jupyter et le shell IPython.
Dans ce guide, nous allons apprendre à interroger des données avec chDB et JupySQL.
Créons d’abord un environnement virtuel :
Nous allons ensuite installer JupySQL, IPython et Jupyter Lab :
Nous pouvons utiliser JupySQL dans IPython, que nous pouvons démarrer en exécutant :
Ou, dans Jupyter Lab, en exécutant :
Si vous utilisez Jupyter Lab, vous devrez créer un notebook avant de poursuivre le guide.
Téléchargement d’un jeu de données
Nous allons utiliser le jeu de données des taxis de New York, qui contient environ 3 millions de courses, ainsi que le tarif, le pourboire et le quartier de prise en charge pour chacune d’elles.
Les trajets sont répartis dans plusieurs fichiers TSV. Commençons donc par les télécharger :
Ensuite, importons le module dbapi pour chDB :
Et nous allons créer une connexion à chDB.
Toutes les données que nous conserverons seront enregistrées dans le répertoire taxi.chdb :
Chargeons maintenant la commande magique sql et créons une connexion à chDB :
Ensuite, nous allons afficher la limite d’affichage pour éviter que les résultats des requêtes ne soient tronqués :
Interroger des données dans des fichiers TSV
Nous avons téléchargé plusieurs fichiers avec le préfixe trips_.
Utilisons la clause DESCRIBE pour connaître le schéma :
Nous pouvons également exécuter une requête SELECT directement sur ces fichiers pour voir à quoi ressemblent les données :
Si l’on revient au schéma, certaines colonnes liées aux montants — trip_distance, fare_amount et tip_amount — ont été inférées comme String plutôt que comme un type numérique.
Nous corrigerons cela lors de l’importation des données dans une table.
Importer des fichiers TSV dans chDB
Nous allons maintenant stocker les données de ces fichiers TSV dans une table.
La base de données default ne persiste pas les données sur disque ; nous devons donc d’abord créer une autre base de données :
Nous allons maintenant créer une table appelée trips, dont le schéma sera dérivé de la structure des données des fichiers TSV.
Nous utiliserons la clause REPLACE pour convertir les colonnes liées aux montants en Float64, ainsi que la fonction transform pour convertir la colonne numérique pickup_borocode en un nom de borough compréhensible :
Vérifions rapidement les données de notre table :
Un peu plus de 3 millions de trajets ; importons également une deuxième table.
La Taxi & Limousine Commission de la ville de New York divise la ville en zones de taxis, et un fichier de correspondance associe chaque zone à son borough.
Téléchargeons ce fichier :
Créez ensuite une table nommée zones à partir du contenu du fichier CSV :
Une fois l’exécution terminée, nous pouvons examiner les données ingérées :
L’ingestion des données est terminée ; passons maintenant à la partie amusante : interroger les données !
Chaque borough est divisé en un nombre différent de zones de taxis.
Nous allons écrire une requête qui joint les deux tables pour déterminer le nombre de trajets pris en charge dans chaque borough, ainsi que le nombre de trajets par zone de taxis :
Manhattan et Queens comptent le même nombre de zones de taxis, mais Manhattan enregistre plus de 14 fois plus de courses.
Enregistrement de requêtes
Vous pouvez enregistrer des requêtes à l’aide du paramètre --save, sur la même ligne que la commande magique %%sql.
Le paramètre --no-execute permet d’ignorer l’exécution de la requête.
Lorsqu’on exécute une requête enregistrée, celle-ci est convertie en expression de table commune (CTE) avant d’être exécutée.
Dans la requête suivante, nous calculons les quartiers où le pourboire moyen est le plus élevé :
Les premiers résultats concernent des quartiers ne comptant qu’une poignée de trajets, de sorte qu’une seule course généreuse fausse la moyenne.
Excluons-les.
Vous pouvez également utiliser des paramètres dans vos requêtes.
Les paramètres sont simplement des variables ordinaires :
Nous pouvons ensuite utiliser la syntaxe {{variable}} dans notre requête.
La requête suivante identifie les quartiers où le pourboire moyen est le plus élevé parmi ceux comptant plus de 10 000 trajets :
Les courses au départ de l’aéroport génèrent de loin les pourboires les plus élevés — ces longs trajets jusqu’en ville font vite grimper la note.
JupySQL propose également des fonctionnalités de création de graphiques limitées.
Nous pouvons créer des boîtes à moustaches ou des histogrammes.
Nous allons créer un histogramme, mais commençons par écrire (et enregistrer) une requête qui renvoie la distance de chaque trajet de moins de 20 miles.
Nous pourrons nous en servir pour créer un histogramme qui compte combien de trajets se situent dans chaque plage de distance :
Nous pouvons ensuite créer un histogramme en exécutant la commande suivante :
La plupart des trajets sont courts, d’un à trois miles, avec une longue traîne de trajets vers l’aéroport.