Construire des graphiques avec Python

Une partie essentielle du travail du data scientist est d’être en mesure de synthétiser une information dans des représentations graphiques percutantes. Ce chapitre permet de découvrir les enjeux de la représentation de données avec Python, l’écosystème pour faire ceci. Il ouvre également à la représentation interactive de données avec Plotly.

Visualisation
Exercice
Auteur·rice

Lino Galiana

Date de publication

2024-11-20

Pour essayer les exemples présents dans ce tutoriel :
View on GitHub Onyxia Onyxia Open In Colab
Compétences à l’issue de ce chapitre
  • Découvrir l’écosystème matplotlib et seaborn pour la construction de graphiques par enrichissement successif de couches.
  • Découvrir le récent écosystème plotnine. qui est une implémentation en Python du package R ggplot2 pour ce type de représentation et qui, grâce à sa grammaire des graphiques, offre une syntaxe puissante pour construire des visualisations de données.
  • Découvrir le principe des représentations interactives HTML (format web) grâce aux packages plotly et altair.
  • Apprendre les enjeux de la représentation graphique, les compromis nécessaires pour construire un message clair et les limites de certaines représentations classiques.

La pratique de la data visualisation se fera, dans ce cours, en répliquant des graphiques qu’on peut trouver sur la page de l’open data de la ville de Paris ici ou en proposant des alternatives à ceux-ci sur les mêmes données.

L’objectif de ce chapitre n’est pas de faire un inventaire complet des graphiques pouvant être fait avec Python, ce serait long, assez insipide et peu pertinent car des sites le font déjà très bien à partir d’une grande variété d’exemple, notamment le site python-graph-gallery.com/. L’objectif est plutôt d’illustrer, par la pratique, quelques enjeux liés à l’utilisation des principales librairies graphiques de Python.

On peut distinguer quelques grandes familles de représentations graphiques: les représentations de distributions propres à une variable, les représentations de relations entre plusieurs variables, les cartes qui permettent de représenter dans l’espace une ou plusieurs variables…

Ces familles se ramifient elles-mêmes en de multiples types de figures. Par exemple, selon la nature du phénomène, les représentations de relations peuvent prendre la forme d’une série temporelle (évolution d’une variable dans le temps), d’un nuage de point (corrélation entre deux variables), d’un diagramme en barre (pour souligner le rapport relatif entre les valeurs d’une variable en fonction d’une autre), etc.

Plutôt qu’un inventaire à la Prévert des types de visualisations possibles, ce chapitre et le suivant vont plutôt proposer quelques visualisations qui pourraient donner envie d’aller plus loin dans l’analyse avant la mise en oeuvre d’une forme de modélisation. Ce chapitre est consacré aux visualisations traditionnelles, le suivant est dédié à la cartographie. Ces deux chapitres font partie d’un tout visant à offrir les premiers éléments pour synthétiser l’information présente dans un jeu de données.

Le pas suivant est d’approfondir le travail de communication et de synthèse par le biais de communications pouvant prendre des formes aussi diverses que des rapports, des publications scientifiques ou articles, des présentations, une application interactive, un site web ou des notebooks comme ceux proposés par ce cours. Le principe général est identique quelle que soit le medium utilisé et intéresse particulièrement les data scientists lorsqu’ils font appel à de l’exploitation intensive de données. Ce sera l’objet d’un chapitre futur de ce cours1.

Important

Être capable de construire des visualisations de données intéressantes est une compétence nécessaire à tout data scientist ou chercheur. Pour améliorer la qualité de ces visualisations, il est recommandé de suivre certains conseils donnés par des spécialistes de la dataviz sur la sémiologie graphique.

Les bonnes visualisations de données, comme celles du New York Times, reposent certes sur des outils adaptés (des librairies JavaScript) mais aussi sur certaines règles de représentation qui permettent de comprendre en quelques secondes le message d’une visualisation.

Ce post de blog est une ressource qu’il est utile de consulter régulièrement. Ce post de blog d’Albert Rapp montre bien comment construire graduellement une bonne visualisation de données.

Note

Si vous êtes intéressés par R , une version très proche de ce TP est disponible dans ce cours d’introduction à R pour l’ENS Ulm.

1 Données

Ce chapitre s’appuie sur les données de comptage des passages de vélo dans les points de mesure parisiens diffusés sur le site de l’open data de la ville de Paris.

L’exploitation de l’historique récent a été grandement facilité par la diffusion des données au format Parquet, un format moderne plus pratique que le CSV. Pour en savoir plus sur ce format, vous pouvez consulter les ressources évoquées dans le paragraphe consacré à ce format dans le chapitre d’approfondissement.

Code pour importer les données à partir du format Parquet
import os
import requests
from tqdm import tqdm
import pandas as pd
import duckdb

url = "https://opendata.paris.fr/api/explore/v2.1/catalog/datasets/comptage-velo-donnees-compteurs/exports/parquet?lang=fr&timezone=Europe%2FParis"
filename = "comptage_velo_donnees_compteurs.parquet"


# DOWNLOAD FILE --------------------------------

# Perform the HTTP request and stream the download
response = requests.get(url, stream=True)

if not os.path.exists(filename):
    # Perform the HTTP request and stream the download
    response = requests.get(url, stream=True)

    # Check if the request was successful
    if response.status_code == 200:
        # Get the total size of the file from the headers
        total_size = int(response.headers.get("content-length", 0))

        # Open the file in write-binary mode and use tqdm to show progress
        with open(filename, "wb") as file, tqdm(
            desc=filename,
            total=total_size,
            unit="B",
            unit_scale=True,
            unit_divisor=1024,
        ) as bar:
            # Write the file in chunks
            for chunk in response.iter_content(chunk_size=1024):
                if chunk:  # filter out keep-alive chunks
                    file.write(chunk)
                    bar.update(len(chunk))
    else:
        print(f"Failed to download the file. Status code: {response.status_code}")
else:
    print(f"The file '{filename}' already exists.")

# READ FILE AND CONVERT TO PANDAS --------------------------

query = """
SELECT id_compteur, nom_compteur, id, sum_counts, date 
FROM read_parquet('comptage_velo_donnees_compteurs.parquet')
"""

# READ WITH DUCKDB AND CONVERT TO PANDAS
df = duckdb.sql(query).df()

df.head(3)
comptage_velo_donnees_compteurs.parquet: 0.00B [00:00, ?B/s]comptage_velo_donnees_compteurs.parquet: 79.5kB [00:00, 123kB/s]comptage_velo_donnees_compteurs.parquet: 144kB [00:00, 195kB/s] comptage_velo_donnees_compteurs.parquet: 176kB [00:01, 118kB/s]comptage_velo_donnees_compteurs.parquet: 272kB [00:02, 114kB/s]comptage_velo_donnees_compteurs.parquet: 368kB [00:02, 123kB/s]comptage_velo_donnees_compteurs.parquet: 448kB [00:03, 166kB/s]comptage_velo_donnees_compteurs.parquet: 475kB [00:03, 123kB/s]comptage_velo_donnees_compteurs.parquet: 543kB [00:03, 161kB/s]comptage_velo_donnees_compteurs.parquet: 575kB [00:04, 125kB/s]comptage_velo_donnees_compteurs.parquet: 671kB [00:05, 128kB/s]comptage_velo_donnees_compteurs.parquet: 767kB [00:05, 125kB/s]comptage_velo_donnees_compteurs.parquet: 863kB [00:06, 127kB/s]comptage_velo_donnees_compteurs.parquet: 959kB [00:07, 126kB/s]comptage_velo_donnees_compteurs.parquet: 1.03MB [00:08, 111kB/s]comptage_velo_donnees_compteurs.parquet: 1.12MB [00:09, 115kB/s]comptage_velo_donnees_compteurs.parquet: 1.20MB [00:09, 146kB/s]comptage_velo_donnees_compteurs.parquet: 1.23MB [00:10, 117kB/s]comptage_velo_donnees_compteurs.parquet: 1.30MB [00:10, 152kB/s]comptage_velo_donnees_compteurs.parquet: 1.32MB [00:10, 112kB/s]comptage_velo_donnees_compteurs.parquet: 1.39MB [00:11, 151kB/s]comptage_velo_donnees_compteurs.parquet: 1.42MB [00:11, 113kB/s]comptage_velo_donnees_compteurs.parquet: 1.50MB [00:12, 109kB/s]comptage_velo_donnees_compteurs.parquet: 1.59MB [00:13, 115kB/s]comptage_velo_donnees_compteurs.parquet: 1.67MB [00:13, 153kB/s]comptage_velo_donnees_compteurs.parquet: 1.70MB [00:14, 116kB/s]comptage_velo_donnees_compteurs.parquet: 1.76MB [00:14, 154kB/s]comptage_velo_donnees_compteurs.parquet: 1.79MB [00:14, 113kB/s]comptage_velo_donnees_compteurs.parquet: 1.86MB [00:14, 155kB/s]comptage_velo_donnees_compteurs.parquet: 1.88MB [00:15, 107kB/s]comptage_velo_donnees_compteurs.parquet: 1.95MB [00:15, 150kB/s]comptage_velo_donnees_compteurs.parquet: 1.98MB [00:16, 111kB/s]comptage_velo_donnees_compteurs.parquet: 2.06MB [00:17, 112kB/s]comptage_velo_donnees_compteurs.parquet: 2.15MB [00:17, 118kB/s]comptage_velo_donnees_compteurs.parquet: 2.25MB [00:18, 124kB/s]comptage_velo_donnees_compteurs.parquet: 2.33MB [00:18, 161kB/s]comptage_velo_donnees_compteurs.parquet: 2.35MB [00:19, 122kB/s]comptage_velo_donnees_compteurs.parquet: 2.42MB [00:19, 160kB/s]comptage_velo_donnees_compteurs.parquet: 2.45MB [00:20, 119kB/s]comptage_velo_donnees_compteurs.parquet: 2.53MB [00:20, 109kB/s]comptage_velo_donnees_compteurs.parquet: 2.62MB [00:21, 118kB/s]comptage_velo_donnees_compteurs.parquet: 2.72MB [00:22, 131kB/s]comptage_velo_donnees_compteurs.parquet: 2.81MB [00:22, 148kB/s]comptage_velo_donnees_compteurs.parquet: 2.90MB [00:23, 150kB/s]comptage_velo_donnees_compteurs.parquet: 3.00MB [00:24, 153kB/s]comptage_velo_donnees_compteurs.parquet: 3.09MB [00:24, 159kB/s]comptage_velo_donnees_compteurs.parquet: 3.19MB [00:25, 160kB/s]comptage_velo_donnees_compteurs.parquet: 3.28MB [00:25, 159kB/s]comptage_velo_donnees_compteurs.parquet: 3.37MB [00:26, 163kB/s]comptage_velo_donnees_compteurs.parquet: 3.47MB [00:27, 160kB/s]comptage_velo_donnees_compteurs.parquet: 3.56MB [00:27, 159kB/s]comptage_velo_donnees_compteurs.parquet: 3.65MB [00:28, 165kB/s]comptage_velo_donnees_compteurs.parquet: 3.75MB [00:28, 162kB/s]comptage_velo_donnees_compteurs.parquet: 3.84MB [00:29, 162kB/s]comptage_velo_donnees_compteurs.parquet: 3.94MB [00:30, 163kB/s]comptage_velo_donnees_compteurs.parquet: 4.03MB [00:31, 141kB/s]comptage_velo_donnees_compteurs.parquet: 4.09MB [00:31, 165kB/s]comptage_velo_donnees_compteurs.parquet: 4.15MB [00:31, 171kB/s]comptage_velo_donnees_compteurs.parquet: 4.22MB [00:31, 187kB/s]comptage_velo_donnees_compteurs.parquet: 4.25MB [00:32, 156kB/s]comptage_velo_donnees_compteurs.parquet: 4.28MB [00:32, 158kB/s]comptage_velo_donnees_compteurs.parquet: 4.34MB [00:32, 158kB/s]comptage_velo_donnees_compteurs.parquet: 4.40MB [00:33, 131kB/s]comptage_velo_donnees_compteurs.parquet: 4.50MB [00:33, 189kB/s]comptage_velo_donnees_compteurs.parquet: 4.53MB [00:34, 158kB/s]comptage_velo_donnees_compteurs.parquet: 4.59MB [00:34, 191kB/s]comptage_velo_donnees_compteurs.parquet: 4.62MB [00:34, 151kB/s]comptage_velo_donnees_compteurs.parquet: 4.65MB [00:34, 155kB/s]comptage_velo_donnees_compteurs.parquet: 4.72MB [00:35, 156kB/s]comptage_velo_donnees_compteurs.parquet: 4.78MB [00:35, 130kB/s]comptage_velo_donnees_compteurs.parquet: 4.87MB [00:36, 188kB/s]comptage_velo_donnees_compteurs.parquet: 4.90MB [00:36, 151kB/s]comptage_velo_donnees_compteurs.parquet: 4.97MB [00:36, 183kB/s]comptage_velo_donnees_compteurs.parquet: 5.00MB [00:37, 147kB/s]comptage_velo_donnees_compteurs.parquet: 5.03MB [00:37, 150kB/s]comptage_velo_donnees_compteurs.parquet: 5.09MB [00:37, 151kB/s]comptage_velo_donnees_compteurs.parquet: 5.15MB [00:38, 128kB/s]comptage_velo_donnees_compteurs.parquet: 5.23MB [00:38, 180kB/s]comptage_velo_donnees_compteurs.parquet: 5.28MB [00:39, 152kB/s]comptage_velo_donnees_compteurs.parquet: 5.34MB [00:39, 186kB/s]comptage_velo_donnees_compteurs.parquet: 5.37MB [00:39, 146kB/s]comptage_velo_donnees_compteurs.parquet: 5.40MB [00:39, 143kB/s]comptage_velo_donnees_compteurs.parquet: 5.47MB [00:40, 152kB/s]comptage_velo_donnees_compteurs.parquet: 5.53MB [00:40, 133kB/s]comptage_velo_donnees_compteurs.parquet: 5.61MB [00:41, 186kB/s]comptage_velo_donnees_compteurs.parquet: 5.65MB [00:41, 161kB/s]comptage_velo_donnees_compteurs.parquet: 5.72MB [00:42, 149kB/s]comptage_velo_donnees_compteurs.parquet: 5.75MB [00:42, 117kB/s]comptage_velo_donnees_compteurs.parquet: 5.78MB [00:42, 121kB/s]comptage_velo_donnees_compteurs.parquet: 5.84MB [00:43, 125kB/s]comptage_velo_donnees_compteurs.parquet: 5.90MB [00:44, 104kB/s]comptage_velo_donnees_compteurs.parquet: 6.00MB [00:44, 151kB/s]comptage_velo_donnees_compteurs.parquet: 6.03MB [00:44, 118kB/s]comptage_velo_donnees_compteurs.parquet: 6.09MB [00:45, 140kB/s]comptage_velo_donnees_compteurs.parquet: 6.12MB [00:45, 111kB/s]comptage_velo_donnees_compteurs.parquet: 6.15MB [00:46, 111kB/s]comptage_velo_donnees_compteurs.parquet: 6.22MB [00:47, 77.5kB/s]comptage_velo_donnees_compteurs.parquet: 6.28MB [00:47, 87.6kB/s]comptage_velo_donnees_compteurs.parquet: 6.37MB [00:48, 136kB/s] comptage_velo_donnees_compteurs.parquet: 6.40MB [00:48, 117kB/s]comptage_velo_donnees_compteurs.parquet: 6.47MB [00:48, 150kB/s]comptage_velo_donnees_compteurs.parquet: 6.50MB [00:49, 125kB/s]comptage_velo_donnees_compteurs.parquet: 6.53MB [00:49, 132kB/s]comptage_velo_donnees_compteurs.parquet: 6.59MB [00:49, 129kB/s]comptage_velo_donnees_compteurs.parquet: 6.65MB [00:50, 112kB/s]comptage_velo_donnees_compteurs.parquet: 6.75MB [00:50, 165kB/s]comptage_velo_donnees_compteurs.parquet: 6.78MB [00:51, 136kB/s]comptage_velo_donnees_compteurs.parquet: 6.84MB [00:51, 162kB/s]comptage_velo_donnees_compteurs.parquet: 6.87MB [00:52, 111kB/s]comptage_velo_donnees_compteurs.parquet: 6.90MB [00:52, 113kB/s]comptage_velo_donnees_compteurs.parquet: 6.97MB [00:52, 130kB/s]comptage_velo_donnees_compteurs.parquet: 7.03MB [00:53, 114kB/s]comptage_velo_donnees_compteurs.parquet: 7.12MB [00:53, 171kB/s]comptage_velo_donnees_compteurs.parquet: 7.15MB [00:54, 138kB/s]comptage_velo_donnees_compteurs.parquet: 7.22MB [00:54, 170kB/s]comptage_velo_donnees_compteurs.parquet: 7.25MB [00:54, 135kB/s]comptage_velo_donnees_compteurs.parquet: 7.28MB [00:55, 142kB/s]comptage_velo_donnees_compteurs.parquet: 7.34MB [00:55, 138kB/s]comptage_velo_donnees_compteurs.parquet: 7.40MB [00:56, 126kB/s]comptage_velo_donnees_compteurs.parquet: 7.50MB [00:56, 176kB/s]comptage_velo_donnees_compteurs.parquet: 7.53MB [00:56, 143kB/s]comptage_velo_donnees_compteurs.parquet: 7.59MB [00:57, 165kB/s]comptage_velo_donnees_compteurs.parquet: 7.62MB [00:57, 129kB/s]comptage_velo_donnees_compteurs.parquet: 7.65MB [00:57, 130kB/s]comptage_velo_donnees_compteurs.parquet: 7.72MB [00:58, 137kB/s]comptage_velo_donnees_compteurs.parquet: 7.78MB [00:58, 126kB/s]comptage_velo_donnees_compteurs.parquet: 7.87MB [00:59, 180kB/s]comptage_velo_donnees_compteurs.parquet: 7.90MB [00:59, 131kB/s]comptage_velo_donnees_compteurs.parquet: 7.97MB [01:00, 158kB/s]comptage_velo_donnees_compteurs.parquet: 8.00MB [01:00, 133kB/s]comptage_velo_donnees_compteurs.parquet: 8.03MB [01:00, 133kB/s]comptage_velo_donnees_compteurs.parquet: 8.09MB [01:01, 140kB/s]comptage_velo_donnees_compteurs.parquet: 8.15MB [01:01, 122kB/s]comptage_velo_donnees_compteurs.parquet: 8.23MB [01:01, 172kB/s]comptage_velo_donnees_compteurs.parquet: 8.28MB [01:02, 141kB/s]comptage_velo_donnees_compteurs.parquet: 8.34MB [01:02, 171kB/s]comptage_velo_donnees_compteurs.parquet: 8.37MB [01:03, 138kB/s]comptage_velo_donnees_compteurs.parquet: 8.40MB [01:03, 144kB/s]comptage_velo_donnees_compteurs.parquet: 8.47MB [01:04, 116kB/s]comptage_velo_donnees_compteurs.parquet: 8.53MB [01:04, 96.8kB/s]comptage_velo_donnees_compteurs.parquet: 8.62MB [01:05, 150kB/s] comptage_velo_donnees_compteurs.parquet: 8.65MB [01:05, 125kB/s]comptage_velo_donnees_compteurs.parquet: 8.72MB [01:05, 149kB/s]comptage_velo_donnees_compteurs.parquet: 8.75MB [01:06, 118kB/s]comptage_velo_donnees_compteurs.parquet: 8.78MB [01:06, 119kB/s]comptage_velo_donnees_compteurs.parquet: 8.84MB [01:07, 122kB/s]comptage_velo_donnees_compteurs.parquet: 8.90MB [01:07, 104kB/s]comptage_velo_donnees_compteurs.parquet: 8.98MB [01:08, 150kB/s]comptage_velo_donnees_compteurs.parquet: 9.03MB [01:08, 125kB/s]comptage_velo_donnees_compteurs.parquet: 9.09MB [01:08, 154kB/s]comptage_velo_donnees_compteurs.parquet: 9.12MB [01:09, 120kB/s]comptage_velo_donnees_compteurs.parquet: 9.15MB [01:09, 120kB/s]comptage_velo_donnees_compteurs.parquet: 9.22MB [01:10, 120kB/s]comptage_velo_donnees_compteurs.parquet: 9.28MB [01:11, 104kB/s]comptage_velo_donnees_compteurs.parquet: 9.36MB [01:11, 149kB/s]comptage_velo_donnees_compteurs.parquet: 9.40MB [01:11, 123kB/s]comptage_velo_donnees_compteurs.parquet: 9.47MB [01:12, 148kB/s]comptage_velo_donnees_compteurs.parquet: 9.50MB [01:12, 121kB/s]comptage_velo_donnees_compteurs.parquet: 9.53MB [01:12, 123kB/s]comptage_velo_donnees_compteurs.parquet: 9.59MB [01:13, 125kB/s]comptage_velo_donnees_compteurs.parquet: 9.65MB [01:14, 109kB/s]comptage_velo_donnees_compteurs.parquet: 9.75MB [01:14, 163kB/s]comptage_velo_donnees_compteurs.parquet: 9.78MB [01:14, 134kB/s]comptage_velo_donnees_compteurs.parquet: 9.84MB [01:14, 165kB/s]comptage_velo_donnees_compteurs.parquet: 9.87MB [01:15, 108kB/s]comptage_velo_donnees_compteurs.parquet: 9.90MB [01:15, 116kB/s]comptage_velo_donnees_compteurs.parquet: 9.97MB [01:16, 127kB/s]comptage_velo_donnees_compteurs.parquet: 10.0MB [01:17, 117kB/s]comptage_velo_donnees_compteurs.parquet: 10.1MB [01:17, 166kB/s]comptage_velo_donnees_compteurs.parquet: 10.2MB [01:17, 136kB/s]comptage_velo_donnees_compteurs.parquet: 10.2MB [01:17, 170kB/s]comptage_velo_donnees_compteurs.parquet: 10.2MB [01:18, 133kB/s]comptage_velo_donnees_compteurs.parquet: 10.3MB [01:18, 130kB/s]comptage_velo_donnees_compteurs.parquet: 10.3MB [01:19, 140kB/s]comptage_velo_donnees_compteurs.parquet: 10.4MB [01:19, 120kB/s]comptage_velo_donnees_compteurs.parquet: 10.5MB [01:20, 170kB/s]comptage_velo_donnees_compteurs.parquet: 10.5MB [01:20, 127kB/s]comptage_velo_donnees_compteurs.parquet: 10.6MB [01:20, 151kB/s]comptage_velo_donnees_compteurs.parquet: 10.6MB [01:21, 120kB/s]comptage_velo_donnees_compteurs.parquet: 10.7MB [01:21, 123kB/s]comptage_velo_donnees_compteurs.parquet: 10.7MB [01:22, 128kB/s]comptage_velo_donnees_compteurs.parquet: 10.8MB [01:22, 105kB/s]comptage_velo_donnees_compteurs.parquet: 10.9MB [01:23, 151kB/s]comptage_velo_donnees_compteurs.parquet: 10.9MB [01:23, 128kB/s]comptage_velo_donnees_compteurs.parquet: 11.0MB [01:23, 154kB/s]comptage_velo_donnees_compteurs.parquet: 11.0MB [01:24, 127kB/s]comptage_velo_donnees_compteurs.parquet: 11.0MB [01:24, 127kB/s]comptage_velo_donnees_compteurs.parquet: 11.1MB [01:25, 129kB/s]comptage_velo_donnees_compteurs.parquet: 11.2MB [01:25, 111kB/s]comptage_velo_donnees_compteurs.parquet: 11.2MB [01:26, 162kB/s]comptage_velo_donnees_compteurs.parquet: 11.3MB [01:26, 130kB/s]comptage_velo_donnees_compteurs.parquet: 11.3MB [01:26, 154kB/s]comptage_velo_donnees_compteurs.parquet: 11.4MB [01:27, 103kB/s]comptage_velo_donnees_compteurs.parquet: 11.4MB [01:27, 110kB/s]comptage_velo_donnees_compteurs.parquet: 11.5MB [01:28, 120kB/s]comptage_velo_donnees_compteurs.parquet: 11.5MB [01:29, 105kB/s]comptage_velo_donnees_compteurs.parquet: 11.6MB [01:29, 153kB/s]comptage_velo_donnees_compteurs.parquet: 11.7MB [01:29, 137kB/s]comptage_velo_donnees_compteurs.parquet: 11.7MB [01:29, 164kB/s]comptage_velo_donnees_compteurs.parquet: 11.7MB [01:30, 130kB/s]comptage_velo_donnees_compteurs.parquet: 11.8MB [01:30, 132kB/s]comptage_velo_donnees_compteurs.parquet: 11.8MB [01:31, 132kB/s]comptage_velo_donnees_compteurs.parquet: 11.9MB [01:31, 116kB/s]comptage_velo_donnees_compteurs.parquet: 12.0MB [01:31, 165kB/s]comptage_velo_donnees_compteurs.parquet: 12.0MB [01:32, 139kB/s]comptage_velo_donnees_compteurs.parquet: 12.1MB [01:32, 166kB/s]comptage_velo_donnees_compteurs.parquet: 12.1MB [01:33, 135kB/s]comptage_velo_donnees_compteurs.parquet: 12.2MB [01:33, 135kB/s]comptage_velo_donnees_compteurs.parquet: 12.2MB [01:33, 135kB/s]comptage_velo_donnees_compteurs.parquet: 12.3MB [01:34, 120kB/s]comptage_velo_donnees_compteurs.parquet: 12.4MB [01:34, 170kB/s]comptage_velo_donnees_compteurs.parquet: 12.4MB [01:35, 140kB/s]comptage_velo_donnees_compteurs.parquet: 12.5MB [01:35, 166kB/s]comptage_velo_donnees_compteurs.parquet: 12.5MB [01:36, 125kB/s]comptage_velo_donnees_compteurs.parquet: 12.5MB [01:36, 126kB/s]comptage_velo_donnees_compteurs.parquet: 12.6MB [01:36, 127kB/s]comptage_velo_donnees_compteurs.parquet: 12.7MB [01:37, 107kB/s]comptage_velo_donnees_compteurs.parquet: 12.7MB [01:37, 154kB/s]comptage_velo_donnees_compteurs.parquet: 12.8MB [01:38, 97.0kB/s]comptage_velo_donnees_compteurs.parquet: 12.8MB [01:39, 127kB/s] comptage_velo_donnees_compteurs.parquet: 12.9MB [01:39, 112kB/s]comptage_velo_donnees_compteurs.parquet: 12.9MB [01:39, 118kB/s]comptage_velo_donnees_compteurs.parquet: 13.0MB [01:40, 133kB/s]comptage_velo_donnees_compteurs.parquet: 13.0MB [01:40, 113kB/s]comptage_velo_donnees_compteurs.parquet: 13.1MB [01:40, 169kB/s]comptage_velo_donnees_compteurs.parquet: 13.2MB [01:41, 133kB/s]comptage_velo_donnees_compteurs.parquet: 13.2MB [01:41, 165kB/s]comptage_velo_donnees_compteurs.parquet: 13.2MB [01:42, 128kB/s]comptage_velo_donnees_compteurs.parquet: 13.3MB [01:42, 129kB/s]comptage_velo_donnees_compteurs.parquet: 13.3MB [01:42, 134kB/s]comptage_velo_donnees_compteurs.parquet: 13.4MB [01:43, 115kB/s]comptage_velo_donnees_compteurs.parquet: 13.5MB [01:43, 165kB/s]comptage_velo_donnees_compteurs.parquet: 13.5MB [01:44, 137kB/s]comptage_velo_donnees_compteurs.parquet: 13.6MB [01:44, 162kB/s]comptage_velo_donnees_compteurs.parquet: 13.6MB [01:45, 131kB/s]comptage_velo_donnees_compteurs.parquet: 13.7MB [01:45, 127kB/s]comptage_velo_donnees_compteurs.parquet: 13.7MB [01:45, 123kB/s]comptage_velo_donnees_compteurs.parquet: 13.8MB [01:47, 77.8kB/s]comptage_velo_donnees_compteurs.parquet: 13.9MB [01:47, 124kB/s] comptage_velo_donnees_compteurs.parquet: 13.9MB [01:47, 105kB/s]comptage_velo_donnees_compteurs.parquet: 14.0MB [01:48, 130kB/s]comptage_velo_donnees_compteurs.parquet: 14.0MB [01:48, 109kB/s]comptage_velo_donnees_compteurs.parquet: 14.0MB [01:49, 81.5kB/s]comptage_velo_donnees_compteurs.parquet: 14.1MB [01:49, 97.9kB/s]comptage_velo_donnees_compteurs.parquet: 14.2MB [01:50, 93.6kB/s]comptage_velo_donnees_compteurs.parquet: 14.2MB [01:50, 126kB/s] comptage_velo_donnees_compteurs.parquet: 14.3MB [01:51, 129kB/s]comptage_velo_donnees_compteurs.parquet: 14.3MB [01:51, 151kB/s]comptage_velo_donnees_compteurs.parquet: 14.4MB [01:52, 128kB/s]comptage_velo_donnees_compteurs.parquet: 14.4MB [01:52, 131kB/s]comptage_velo_donnees_compteurs.parquet: 14.5MB [01:52, 136kB/s]comptage_velo_donnees_compteurs.parquet: 14.5MB [01:53, 116kB/s]comptage_velo_donnees_compteurs.parquet: 14.6MB [01:53, 164kB/s]comptage_velo_donnees_compteurs.parquet: 14.7MB [01:54, 136kB/s]comptage_velo_donnees_compteurs.parquet: 14.7MB [01:54, 160kB/s]comptage_velo_donnees_compteurs.parquet: 14.7MB [01:54, 129kB/s]comptage_velo_donnees_compteurs.parquet: 14.8MB [01:55, 128kB/s]comptage_velo_donnees_compteurs.parquet: 14.8MB [01:55, 137kB/s]comptage_velo_donnees_compteurs.parquet: 14.9MB [01:56, 128kB/s]comptage_velo_donnees_compteurs.parquet: 15.0MB [01:56, 190kB/s]comptage_velo_donnees_compteurs.parquet: 15.0MB [01:56, 156kB/s]comptage_velo_donnees_compteurs.parquet: 15.1MB [01:56, 190kB/s]comptage_velo_donnees_compteurs.parquet: 15.1MB [01:57, 144kB/s]comptage_velo_donnees_compteurs.parquet: 15.2MB [01:57, 145kB/s]comptage_velo_donnees_compteurs.parquet: 15.2MB [01:58, 144kB/s]comptage_velo_donnees_compteurs.parquet: 15.3MB [01:58, 129kB/s]comptage_velo_donnees_compteurs.parquet: 15.4MB [01:58, 193kB/s]comptage_velo_donnees_compteurs.parquet: 15.4MB [01:59, 144kB/s]comptage_velo_donnees_compteurs.parquet: 15.5MB [01:59, 173kB/s]comptage_velo_donnees_compteurs.parquet: 15.5MB [02:00, 142kB/s]comptage_velo_donnees_compteurs.parquet: 15.5MB [02:00, 143kB/s]comptage_velo_donnees_compteurs.parquet: 15.6MB [02:00, 120kB/s]comptage_velo_donnees_compteurs.parquet: 15.7MB [02:01, 115kB/s]comptage_velo_donnees_compteurs.parquet: 15.7MB [02:01, 147kB/s]comptage_velo_donnees_compteurs.parquet: 15.8MB [02:02, 99.2kB/s]comptage_velo_donnees_compteurs.parquet: 15.8MB [02:02, 121kB/s] comptage_velo_donnees_compteurs.parquet: 15.8MB [02:03, 110kB/s]comptage_velo_donnees_compteurs.parquet: 15.9MB [02:04, 69.4kB/s]comptage_velo_donnees_compteurs.parquet: 15.9MB [02:04, 75.8kB/s]comptage_velo_donnees_compteurs.parquet: 16.0MB [02:05, 74.6kB/s]comptage_velo_donnees_compteurs.parquet: 16.0MB [02:05, 97.6kB/s]comptage_velo_donnees_compteurs.parquet: 16.0MB [02:06, 54.3kB/s]comptage_velo_donnees_compteurs.parquet: 16.1MB [02:07, 94.2kB/s]comptage_velo_donnees_compteurs.parquet: 16.2MB [02:08, 69.9kB/s]comptage_velo_donnees_compteurs.parquet: 16.2MB [02:08, 88.3kB/s]comptage_velo_donnees_compteurs.parquet: 16.2MB [02:09, 66.1kB/s]comptage_velo_donnees_compteurs.parquet: 16.3MB [02:09, 70.7kB/s]comptage_velo_donnees_compteurs.parquet: 16.3MB [02:10, 83.9kB/s]comptage_velo_donnees_compteurs.parquet: 16.4MB [02:11, 86.8kB/s]comptage_velo_donnees_compteurs.parquet: 16.5MB [02:11, 118kB/s] comptage_velo_donnees_compteurs.parquet: 16.5MB [02:12, 105kB/s]comptage_velo_donnees_compteurs.parquet: 16.6MB [02:12, 132kB/s]comptage_velo_donnees_compteurs.parquet: 16.6MB [02:12, 111kB/s]comptage_velo_donnees_compteurs.parquet: 16.7MB [02:13, 116kB/s]comptage_velo_donnees_compteurs.parquet: 16.7MB [02:13, 126kB/s]comptage_velo_donnees_compteurs.parquet: 16.8MB [02:14, 110kB/s]comptage_velo_donnees_compteurs.parquet: 16.9MB [02:14, 158kB/s]comptage_velo_donnees_compteurs.parquet: 16.9MB [02:14, 139kB/s]comptage_velo_donnees_compteurs.parquet: 17.0MB [02:15, 165kB/s]comptage_velo_donnees_compteurs.parquet: 17.0MB [02:15, 132kB/s]comptage_velo_donnees_compteurs.parquet: 17.0MB [02:15, 136kB/s]comptage_velo_donnees_compteurs.parquet: 17.1MB [02:16, 139kB/s]comptage_velo_donnees_compteurs.parquet: 17.2MB [02:16, 120kB/s]comptage_velo_donnees_compteurs.parquet: 17.2MB [02:17, 169kB/s]comptage_velo_donnees_compteurs.parquet: 17.3MB [02:17, 142kB/s]comptage_velo_donnees_compteurs.parquet: 17.3MB [02:17, 167kB/s]comptage_velo_donnees_compteurs.parquet: 17.4MB [02:18, 137kB/s]comptage_velo_donnees_compteurs.parquet: 17.4MB [02:18, 135kB/s]comptage_velo_donnees_compteurs.parquet: 17.5MB [02:18, 144kB/s]comptage_velo_donnees_compteurs.parquet: 17.5MB [02:19, 119kB/s]comptage_velo_donnees_compteurs.parquet: 17.6MB [02:19, 171kB/s]comptage_velo_donnees_compteurs.parquet: 17.7MB [02:20, 144kB/s]comptage_velo_donnees_compteurs.parquet: 17.7MB [02:20, 173kB/s]comptage_velo_donnees_compteurs.parquet: 17.7MB [02:21, 131kB/s]comptage_velo_donnees_compteurs.parquet: 17.8MB [02:21, 130kB/s]comptage_velo_donnees_compteurs.parquet: 17.8MB [02:21, 136kB/s]comptage_velo_donnees_compteurs.parquet: 17.9MB [02:22, 95.0kB/s]comptage_velo_donnees_compteurs.parquet: 18.0MB [02:22, 147kB/s] comptage_velo_donnees_compteurs.parquet: 18.0MB [02:23, 121kB/s]comptage_velo_donnees_compteurs.parquet: 18.1MB [02:23, 149kB/s]comptage_velo_donnees_compteurs.parquet: 18.1MB [02:24, 121kB/s]comptage_velo_donnees_compteurs.parquet: 18.2MB [02:24, 123kB/s]comptage_velo_donnees_compteurs.parquet: 18.2MB [02:24, 132kB/s]comptage_velo_donnees_compteurs.parquet: 18.3MB [02:25, 112kB/s]comptage_velo_donnees_compteurs.parquet: 18.4MB [02:25, 160kB/s]comptage_velo_donnees_compteurs.parquet: 18.4MB [02:26, 143kB/s]comptage_velo_donnees_compteurs.parquet: 18.5MB [02:26, 173kB/s]comptage_velo_donnees_compteurs.parquet: 18.5MB [02:26, 132kB/s]comptage_velo_donnees_compteurs.parquet: 18.5MB [02:27, 137kB/s]comptage_velo_donnees_compteurs.parquet: 18.6MB [02:27, 130kB/s]comptage_velo_donnees_compteurs.parquet: 18.7MB [02:28, 114kB/s]comptage_velo_donnees_compteurs.parquet: 18.7MB [02:28, 162kB/s]comptage_velo_donnees_compteurs.parquet: 18.8MB [02:28, 169kB/s]comptage_velo_donnees_compteurs.parquet: 18.8MB [02:29, 123kB/s]comptage_velo_donnees_compteurs.parquet: 18.8MB [02:29, 155kB/s]comptage_velo_donnees_compteurs.parquet: 18.9MB [02:30, 106kB/s]comptage_velo_donnees_compteurs.parquet: 18.9MB [02:30, 110kB/s]comptage_velo_donnees_compteurs.parquet: 19.0MB [02:30, 121kB/s]comptage_velo_donnees_compteurs.parquet: 19.0MB [02:31, 105kB/s]comptage_velo_donnees_compteurs.parquet: 19.1MB [02:31, 152kB/s]comptage_velo_donnees_compteurs.parquet: 19.2MB [02:32, 126kB/s]comptage_velo_donnees_compteurs.parquet: 19.2MB [02:32, 151kB/s]comptage_velo_donnees_compteurs.parquet: 19.2MB [02:32, 130kB/s]comptage_velo_donnees_compteurs.parquet: 19.3MB [02:33, 133kB/s]comptage_velo_donnees_compteurs.parquet: 19.3MB [02:33, 134kB/s]comptage_velo_donnees_compteurs.parquet: 19.4MB [02:34, 96.1kB/s]comptage_velo_donnees_compteurs.parquet: 19.5MB [02:34, 150kB/s] comptage_velo_donnees_compteurs.parquet: 19.5MB [02:35, 127kB/s]comptage_velo_donnees_compteurs.parquet: 19.6MB [02:35, 151kB/s]comptage_velo_donnees_compteurs.parquet: 19.6MB [02:36, 123kB/s]comptage_velo_donnees_compteurs.parquet: 19.7MB [02:36, 134kB/s]comptage_velo_donnees_compteurs.parquet: 19.7MB [02:36, 142kB/s]comptage_velo_donnees_compteurs.parquet: 19.8MB [02:37, 123kB/s]comptage_velo_donnees_compteurs.parquet: 19.9MB [02:37, 173kB/s]comptage_velo_donnees_compteurs.parquet: 19.9MB [02:38, 140kB/s]comptage_velo_donnees_compteurs.parquet: 20.0MB [02:38, 162kB/s]comptage_velo_donnees_compteurs.parquet: 20.0MB [02:38, 120kB/s]comptage_velo_donnees_compteurs.parquet: 20.0MB [02:39, 124kB/s]comptage_velo_donnees_compteurs.parquet: 20.1MB [02:39, 128kB/s]comptage_velo_donnees_compteurs.parquet: 20.2MB [02:40, 111kB/s]comptage_velo_donnees_compteurs.parquet: 20.2MB [02:40, 159kB/s]comptage_velo_donnees_compteurs.parquet: 20.3MB [02:40, 165kB/s]comptage_velo_donnees_compteurs.parquet: 20.3MB [02:41, 108kB/s]comptage_velo_donnees_compteurs.parquet: 20.3MB [02:41, 148kB/s]comptage_velo_donnees_compteurs.parquet: 20.4MB [02:41, 115kB/s]comptage_velo_donnees_compteurs.parquet: 20.4MB [02:42, 118kB/s]comptage_velo_donnees_compteurs.parquet: 20.5MB [02:42, 126kB/s]comptage_velo_donnees_compteurs.parquet: 20.5MB [02:43, 107kB/s]comptage_velo_donnees_compteurs.parquet: 20.6MB [02:43, 161kB/s]comptage_velo_donnees_compteurs.parquet: 20.6MB [02:44, 129kB/s]comptage_velo_donnees_compteurs.parquet: 20.7MB [02:44, 157kB/s]comptage_velo_donnees_compteurs.parquet: 20.7MB [02:45, 108kB/s]comptage_velo_donnees_compteurs.parquet: 20.8MB [02:45, 111kB/s]comptage_velo_donnees_compteurs.parquet: 20.8MB [02:45, 113kB/s]comptage_velo_donnees_compteurs.parquet: 20.9MB [02:47, 78.2kB/s]comptage_velo_donnees_compteurs.parquet: 21.0MB [02:47, 123kB/s] comptage_velo_donnees_compteurs.parquet: 21.0MB [02:47, 109kB/s]comptage_velo_donnees_compteurs.parquet: 21.1MB [02:48, 136kB/s]comptage_velo_donnees_compteurs.parquet: 21.1MB [02:48, 110kB/s]comptage_velo_donnees_compteurs.parquet: 21.1MB [02:48, 117kB/s]comptage_velo_donnees_compteurs.parquet: 21.2MB [02:49, 120kB/s]comptage_velo_donnees_compteurs.parquet: 21.3MB [02:50, 101kB/s]comptage_velo_donnees_compteurs.parquet: 21.4MB [02:50, 148kB/s]comptage_velo_donnees_compteurs.parquet: 21.4MB [02:51, 116kB/s]comptage_velo_donnees_compteurs.parquet: 21.5MB [02:51, 142kB/s]comptage_velo_donnees_compteurs.parquet: 21.5MB [02:51, 113kB/s]comptage_velo_donnees_compteurs.parquet: 21.5MB [02:52, 112kB/s]comptage_velo_donnees_compteurs.parquet: 21.6MB [02:52, 119kB/s]comptage_velo_donnees_compteurs.parquet: 21.6MB [02:53, 103kB/s]comptage_velo_donnees_compteurs.parquet: 21.7MB [02:53, 149kB/s]comptage_velo_donnees_compteurs.parquet: 21.8MB [02:54, 122kB/s]comptage_velo_donnees_compteurs.parquet: 21.8MB [02:54, 147kB/s]comptage_velo_donnees_compteurs.parquet: 21.9MB [02:55, 115kB/s]comptage_velo_donnees_compteurs.parquet: 21.9MB [02:55, 95.7kB/s]comptage_velo_donnees_compteurs.parquet: 22.0MB [02:56, 103kB/s] comptage_velo_donnees_compteurs.parquet: 22.0MB [02:56, 97.5kB/s]comptage_velo_donnees_compteurs.parquet: 22.1MB [02:57, 141kB/s] comptage_velo_donnees_compteurs.parquet: 22.1MB [02:57, 145kB/s]comptage_velo_donnees_compteurs.parquet: 22.1MB [02:57, 106kB/s]comptage_velo_donnees_compteurs.parquet: 22.2MB [02:58, 136kB/s]comptage_velo_donnees_compteurs.parquet: 22.2MB [02:58, 120kB/s]comptage_velo_donnees_compteurs.parquet: 22.3MB [02:58, 121kB/s]comptage_velo_donnees_compteurs.parquet: 22.3MB [02:59, 132kB/s]comptage_velo_donnees_compteurs.parquet: 22.4MB [02:59, 114kB/s]comptage_velo_donnees_compteurs.parquet: 22.5MB [02:59, 164kB/s]comptage_velo_donnees_compteurs.parquet: 22.5MB [03:00, 168kB/s]comptage_velo_donnees_compteurs.parquet: 22.5MB [03:00, 117kB/s]comptage_velo_donnees_compteurs.parquet: 22.6MB [03:00, 133kB/s]comptage_velo_donnees_compteurs.parquet: 22.6MB [03:01, 107kB/s]comptage_velo_donnees_compteurs.parquet: 22.6MB [03:01, 115kB/s]comptage_velo_donnees_compteurs.parquet: 22.7MB [03:02, 121kB/s]comptage_velo_donnees_compteurs.parquet: 22.8MB [03:02, 107kB/s]comptage_velo_donnees_compteurs.parquet: 22.9MB [03:03, 155kB/s]comptage_velo_donnees_compteurs.parquet: 22.9MB [03:03, 135kB/s]comptage_velo_donnees_compteurs.parquet: 23.0MB [03:03, 162kB/s]comptage_velo_donnees_compteurs.parquet: 23.0MB [03:04, 111kB/s]comptage_velo_donnees_compteurs.parquet: 23.0MB [03:05, 95.2kB/s]comptage_velo_donnees_compteurs.parquet: 23.1MB [03:06, 72.7kB/s]comptage_velo_donnees_compteurs.parquet: 23.1MB [03:07, 64.8kB/s]comptage_velo_donnees_compteurs.parquet: 23.2MB [03:08, 91.1kB/s]comptage_velo_donnees_compteurs.parquet: 23.3MB [03:08, 75.2kB/s]comptage_velo_donnees_compteurs.parquet: 23.3MB [03:08, 104kB/s] comptage_velo_donnees_compteurs.parquet: 23.4MB [03:09, 95.8kB/s]comptage_velo_donnees_compteurs.parquet: 23.4MB [03:09, 102kB/s] comptage_velo_donnees_compteurs.parquet: 23.5MB [03:10, 109kB/s]comptage_velo_donnees_compteurs.parquet: 23.5MB [03:10, 102kB/s]comptage_velo_donnees_compteurs.parquet: 23.6MB [03:11, 150kB/s]comptage_velo_donnees_compteurs.parquet: 23.6MB [03:11, 131kB/s]comptage_velo_donnees_compteurs.parquet: 23.7MB [03:11, 159kB/s]comptage_velo_donnees_compteurs.parquet: 23.7MB [03:12, 128kB/s]comptage_velo_donnees_compteurs.parquet: 23.8MB [03:12, 136kB/s]comptage_velo_donnees_compteurs.parquet: 23.8MB [03:13, 125kB/s]comptage_velo_donnees_compteurs.parquet: 23.9MB [03:13, 109kB/s]comptage_velo_donnees_compteurs.parquet: 24.0MB [03:13, 144kB/s]comptage_velo_donnees_compteurs.parquet: 24.0MB [03:14, 151kB/s]comptage_velo_donnees_compteurs.parquet: 24.1MB [03:14, 182kB/s]comptage_velo_donnees_compteurs.parquet: 24.1MB [03:15, 145kB/s]comptage_velo_donnees_compteurs.parquet: 24.1MB [03:15, 148kB/s]comptage_velo_donnees_compteurs.parquet: 24.2MB [03:15, 124kB/s]comptage_velo_donnees_compteurs.parquet: 24.3MB [03:16, 119kB/s]comptage_velo_donnees_compteurs.parquet: 24.4MB [03:16, 173kB/s]comptage_velo_donnees_compteurs.parquet: 24.4MB [03:17, 145kB/s]comptage_velo_donnees_compteurs.parquet: 24.5MB [03:17, 175kB/s]comptage_velo_donnees_compteurs.parquet: 24.5MB [03:17, 143kB/s]comptage_velo_donnees_compteurs.parquet: 24.5MB [03:17, 148kB/s]comptage_velo_donnees_compteurs.parquet: 24.6MB [03:18, 154kB/s]comptage_velo_donnees_compteurs.parquet: 24.6MB [03:18, 134kB/s]comptage_velo_donnees_compteurs.parquet: 24.7MB [03:19, 195kB/s]comptage_velo_donnees_compteurs.parquet: 24.8MB [03:19, 160kB/s]comptage_velo_donnees_compteurs.parquet: 24.8MB [03:19, 194kB/s]comptage_velo_donnees_compteurs.parquet: 24.9MB [03:20, 159kB/s]comptage_velo_donnees_compteurs.parquet: 24.9MB [03:20, 163kB/s]comptage_velo_donnees_compteurs.parquet: 25.0MB [03:20, 159kB/s]comptage_velo_donnees_compteurs.parquet: 25.0MB [03:21, 136kB/s]comptage_velo_donnees_compteurs.parquet: 25.1MB [03:21, 189kB/s]comptage_velo_donnees_compteurs.parquet: 25.1MB [03:21, 163kB/s]comptage_velo_donnees_compteurs.parquet: 25.2MB [03:22, 194kB/s]comptage_velo_donnees_compteurs.parquet: 25.2MB [03:22, 154kB/s]comptage_velo_donnees_compteurs.parquet: 25.3MB [03:22, 158kB/s]comptage_velo_donnees_compteurs.parquet: 25.3MB [03:23, 164kB/s]comptage_velo_donnees_compteurs.parquet: 25.4MB [03:23, 135kB/s]comptage_velo_donnees_compteurs.parquet: 25.5MB [03:23, 188kB/s]comptage_velo_donnees_compteurs.parquet: 25.5MB [03:24, 164kB/s]comptage_velo_donnees_compteurs.parquet: 25.6MB [03:24, 198kB/s]comptage_velo_donnees_compteurs.parquet: 25.6MB [03:24, 157kB/s]comptage_velo_donnees_compteurs.parquet: 25.6MB [03:25, 148kB/s]comptage_velo_donnees_compteurs.parquet: 25.7MB [03:25, 116kB/s]comptage_velo_donnees_compteurs.parquet: 25.8MB [03:26, 104kB/s]comptage_velo_donnees_compteurs.parquet: 25.8MB [03:26, 138kB/s]comptage_velo_donnees_compteurs.parquet: 25.9MB [03:27, 128kB/s]comptage_velo_donnees_compteurs.parquet: 26.0MB [03:27, 152kB/s]comptage_velo_donnees_compteurs.parquet: 26.0MB [03:28, 129kB/s]comptage_velo_donnees_compteurs.parquet: 26.0MB [03:28, 129kB/s]comptage_velo_donnees_compteurs.parquet: 26.1MB [03:28, 129kB/s]comptage_velo_donnees_compteurs.parquet: 26.1MB [03:29, 110kB/s]comptage_velo_donnees_compteurs.parquet: 26.2MB [03:29, 163kB/s]comptage_velo_donnees_compteurs.parquet: 26.3MB [03:30, 132kB/s]comptage_velo_donnees_compteurs.parquet: 26.3MB [03:30, 150kB/s]comptage_velo_donnees_compteurs.parquet: 26.4MB [03:31, 118kB/s]comptage_velo_donnees_compteurs.parquet: 26.4MB [03:31, 121kB/s]comptage_velo_donnees_compteurs.parquet: 26.5MB [03:31, 120kB/s]comptage_velo_donnees_compteurs.parquet: 26.5MB [03:32, 93.8kB/s]comptage_velo_donnees_compteurs.parquet: 26.6MB [03:33, 147kB/s] comptage_velo_donnees_compteurs.parquet: 26.6MB [03:33, 111kB/s]comptage_velo_donnees_compteurs.parquet: 26.7MB [03:33, 137kB/s]comptage_velo_donnees_compteurs.parquet: 26.7MB [03:34, 111kB/s]comptage_velo_donnees_compteurs.parquet: 26.8MB [03:34, 116kB/s]comptage_velo_donnees_compteurs.parquet: 26.8MB [03:35, 112kB/s]comptage_velo_donnees_compteurs.parquet: 26.9MB [03:36, 93.9kB/s]comptage_velo_donnees_compteurs.parquet: 27.0MB [03:36, 126kB/s] comptage_velo_donnees_compteurs.parquet: 27.0MB [03:36, 135kB/s]comptage_velo_donnees_compteurs.parquet: 27.0MB [03:37, 81.2kB/s]comptage_velo_donnees_compteurs.parquet: 27.1MB [03:37, 112kB/s] comptage_velo_donnees_compteurs.parquet: 27.1MB [03:38, 89.4kB/s]comptage_velo_donnees_compteurs.parquet: 27.1MB [03:38, 91.3kB/s]comptage_velo_donnees_compteurs.parquet: 27.2MB [03:39, 97.4kB/s]comptage_velo_donnees_compteurs.parquet: 27.3MB [03:40, 78.6kB/s]comptage_velo_donnees_compteurs.parquet: 27.4MB [03:40, 121kB/s] comptage_velo_donnees_compteurs.parquet: 27.4MB [03:41, 102kB/s]comptage_velo_donnees_compteurs.parquet: 27.5MB [03:41, 123kB/s]comptage_velo_donnees_compteurs.parquet: 27.5MB [03:42, 96.1kB/s]comptage_velo_donnees_compteurs.parquet: 27.5MB [03:42, 98.5kB/s]comptage_velo_donnees_compteurs.parquet: 27.6MB [03:43, 99.2kB/s]comptage_velo_donnees_compteurs.parquet: 27.6MB [03:44, 81.0kB/s]comptage_velo_donnees_compteurs.parquet: 27.7MB [03:44, 124kB/s] comptage_velo_donnees_compteurs.parquet: 27.8MB [03:45, 102kB/s]comptage_velo_donnees_compteurs.parquet: 27.8MB [03:45, 120kB/s]comptage_velo_donnees_compteurs.parquet: 27.9MB [03:46, 68.5kB/s]comptage_velo_donnees_compteurs.parquet: 27.9MB [03:47, 76.5kB/s]comptage_velo_donnees_compteurs.parquet: 28.0MB [03:47, 82.1kB/s]comptage_velo_donnees_compteurs.parquet: 28.0MB [03:49, 67.1kB/s]comptage_velo_donnees_compteurs.parquet: 28.1MB [03:49, 102kB/s] comptage_velo_donnees_compteurs.parquet: 28.1MB [03:50, 85.7kB/s]comptage_velo_donnees_compteurs.parquet: 28.2MB [03:50, 106kB/s] comptage_velo_donnees_compteurs.parquet: 28.2MB [03:50, 91.7kB/s]comptage_velo_donnees_compteurs.parquet: 28.3MB [03:51, 98.8kB/s]comptage_velo_donnees_compteurs.parquet: 28.3MB [03:51, 107kB/s] comptage_velo_donnees_compteurs.parquet: 28.4MB [03:52, 98.6kB/s]comptage_velo_donnees_compteurs.parquet: 28.5MB [03:52, 137kB/s] comptage_velo_donnees_compteurs.parquet: 28.5MB [03:53, 97.3kB/s]comptage_velo_donnees_compteurs.parquet: 28.6MB [03:54, 101kB/s] comptage_velo_donnees_compteurs.parquet: 28.6MB [03:55, 77.1kB/s]comptage_velo_donnees_compteurs.parquet: 28.6MB [03:55, 87.8kB/s]comptage_velo_donnees_compteurs.parquet: 28.7MB [03:56, 85.1kB/s]comptage_velo_donnees_compteurs.parquet: 28.8MB [03:56, 85.1kB/s]comptage_velo_donnees_compteurs.parquet: 28.8MB [03:57, 116kB/s] comptage_velo_donnees_compteurs.parquet: 28.9MB [03:57, 115kB/s]comptage_velo_donnees_compteurs.parquet: 29.0MB [03:57, 141kB/s]comptage_velo_donnees_compteurs.parquet: 29.0MB [03:58, 123kB/s]comptage_velo_donnees_compteurs.parquet: 29.0MB [03:58, 124kB/s]comptage_velo_donnees_compteurs.parquet: 29.1MB [03:58, 132kB/s]comptage_velo_donnees_compteurs.parquet: 29.1MB [03:59, 112kB/s]comptage_velo_donnees_compteurs.parquet: 29.2MB [03:59, 163kB/s]comptage_velo_donnees_compteurs.parquet: 29.3MB [04:00, 129kB/s]comptage_velo_donnees_compteurs.parquet: 29.3MB [04:00, 151kB/s]comptage_velo_donnees_compteurs.parquet: 29.4MB [04:01, 125kB/s]comptage_velo_donnees_compteurs.parquet: 29.4MB [04:01, 133kB/s]comptage_velo_donnees_compteurs.parquet: 29.5MB [04:01, 139kB/s]comptage_velo_donnees_compteurs.parquet: 29.5MB [04:02, 118kB/s]comptage_velo_donnees_compteurs.parquet: 29.6MB [04:02, 167kB/s]comptage_velo_donnees_compteurs.parquet: 29.6MB [04:03, 134kB/s]comptage_velo_donnees_compteurs.parquet: 29.7MB [04:03, 163kB/s]comptage_velo_donnees_compteurs.parquet: 29.7MB [04:04, 127kB/s]comptage_velo_donnees_compteurs.parquet: 29.8MB [04:04, 126kB/s]comptage_velo_donnees_compteurs.parquet: 29.8MB [04:04, 130kB/s]comptage_velo_donnees_compteurs.parquet: 29.9MB [04:05, 112kB/s]comptage_velo_donnees_compteurs.parquet: 30.0MB [04:05, 162kB/s]comptage_velo_donnees_compteurs.parquet: 30.0MB [04:06, 129kB/s]comptage_velo_donnees_compteurs.parquet: 30.1MB [04:06, 133kB/s]comptage_velo_donnees_compteurs.parquet: 30.1MB [04:07, 121kB/s]comptage_velo_donnees_compteurs.parquet: 30.1MB [04:07, 125kB/s]comptage_velo_donnees_compteurs.parquet: 30.2MB [04:07, 129kB/s]comptage_velo_donnees_compteurs.parquet: 30.3MB [04:08, 119kB/s]comptage_velo_donnees_compteurs.parquet: 30.4MB [04:08, 169kB/s]comptage_velo_donnees_compteurs.parquet: 30.4MB [04:09, 147kB/s]comptage_velo_donnees_compteurs.parquet: 30.5MB [04:09, 177kB/s]comptage_velo_donnees_compteurs.parquet: 30.5MB [04:09, 139kB/s]comptage_velo_donnees_compteurs.parquet: 30.5MB [04:09, 142kB/s]comptage_velo_donnees_compteurs.parquet: 30.6MB [04:10, 140kB/s]comptage_velo_donnees_compteurs.parquet: 30.6MB [04:11, 121kB/s]comptage_velo_donnees_compteurs.parquet: 30.7MB [04:11, 178kB/s]comptage_velo_donnees_compteurs.parquet: 30.8MB [04:11, 147kB/s]comptage_velo_donnees_compteurs.parquet: 30.8MB [04:11, 178kB/s]comptage_velo_donnees_compteurs.parquet: 30.9MB [04:12, 134kB/s]comptage_velo_donnees_compteurs.parquet: 30.9MB [04:12, 133kB/s]comptage_velo_donnees_compteurs.parquet: 31.0MB [04:13, 140kB/s]comptage_velo_donnees_compteurs.parquet: 31.0MB [04:13, 114kB/s]comptage_velo_donnees_compteurs.parquet: 31.1MB [04:14, 170kB/s]comptage_velo_donnees_compteurs.parquet: 31.1MB [04:14, 132kB/s]comptage_velo_donnees_compteurs.parquet: 31.2MB [04:14, 158kB/s]comptage_velo_donnees_compteurs.parquet: 31.2MB [04:15, 128kB/s]comptage_velo_donnees_compteurs.parquet: 31.3MB [04:15, 130kB/s]comptage_velo_donnees_compteurs.parquet: 31.3MB [04:16, 131kB/s]comptage_velo_donnees_compteurs.parquet: 31.4MB [04:16, 119kB/s]comptage_velo_donnees_compteurs.parquet: 31.5MB [04:16, 175kB/s]comptage_velo_donnees_compteurs.parquet: 31.5MB [04:17, 133kB/s]comptage_velo_donnees_compteurs.parquet: 31.6MB [04:17, 162kB/s]comptage_velo_donnees_compteurs.parquet: 31.6MB [04:18, 105kB/s]comptage_velo_donnees_compteurs.parquet: 31.6MB [04:18, 109kB/s]comptage_velo_donnees_compteurs.parquet: 31.7MB [04:19, 120kB/s]comptage_velo_donnees_compteurs.parquet: 31.8MB [04:19, 109kB/s]comptage_velo_donnees_compteurs.parquet: 31.9MB [04:20, 164kB/s]comptage_velo_donnees_compteurs.parquet: 31.9MB [04:20, 132kB/s]comptage_velo_donnees_compteurs.parquet: 32.0MB [04:20, 164kB/s]comptage_velo_donnees_compteurs.parquet: 32.0MB [04:21, 130kB/s]comptage_velo_donnees_compteurs.parquet: 32.0MB [04:21, 137kB/s]comptage_velo_donnees_compteurs.parquet: 32.1MB [04:21, 143kB/s]comptage_velo_donnees_compteurs.parquet: 32.1MB [04:22, 129kB/s]comptage_velo_donnees_compteurs.parquet: 32.2MB [04:22, 180kB/s]comptage_velo_donnees_compteurs.parquet: 32.3MB [04:23, 145kB/s]comptage_velo_donnees_compteurs.parquet: 32.3MB [04:23, 169kB/s]comptage_velo_donnees_compteurs.parquet: 32.4MB [04:23, 136kB/s]comptage_velo_donnees_compteurs.parquet: 32.4MB [04:24, 141kB/s]comptage_velo_donnees_compteurs.parquet: 32.5MB [04:24, 146kB/s]comptage_velo_donnees_compteurs.parquet: 32.5MB [04:25, 122kB/s]comptage_velo_donnees_compteurs.parquet: 32.6MB [04:25, 175kB/s]comptage_velo_donnees_compteurs.parquet: 32.6MB [04:25, 140kB/s]comptage_velo_donnees_compteurs.parquet: 32.7MB [04:26, 167kB/s]comptage_velo_donnees_compteurs.parquet: 32.7MB [04:26, 138kB/s]comptage_velo_donnees_compteurs.parquet: 32.8MB [04:26, 142kB/s]comptage_velo_donnees_compteurs.parquet: 32.8MB [04:27, 142kB/s]comptage_velo_donnees_compteurs.parquet: 32.9MB [04:27, 114kB/s]comptage_velo_donnees_compteurs.parquet: 33.0MB [04:28, 166kB/s]comptage_velo_donnees_compteurs.parquet: 33.0MB [04:28, 107kB/s]comptage_velo_donnees_compteurs.parquet: 33.1MB [04:29, 133kB/s]comptage_velo_donnees_compteurs.parquet: 33.1MB [04:29, 110kB/s]comptage_velo_donnees_compteurs.parquet: 33.1MB [04:30, 104kB/s]comptage_velo_donnees_compteurs.parquet: 33.2MB [04:30, 110kB/s]comptage_velo_donnees_compteurs.parquet: 33.3MB [04:31, 96.8kB/s]comptage_velo_donnees_compteurs.parquet: 33.4MB [04:31, 141kB/s] comptage_velo_donnees_compteurs.parquet: 33.4MB [04:31, 147kB/s]comptage_velo_donnees_compteurs.parquet: 33.4MB [04:32, 122kB/s]comptage_velo_donnees_compteurs.parquet: 33.5MB [04:32, 172kB/s]comptage_velo_donnees_compteurs.parquet: 33.5MB [04:32, 147kB/s]comptage_velo_donnees_compteurs.parquet: 33.5MB [04:32, 161kB/s]comptage_velo_donnees_compteurs.parquet: 33.6MB [04:33, 190kB/s]comptage_velo_donnees_compteurs.parquet: 33.6MB [04:33, 176kB/s]comptage_velo_donnees_compteurs.parquet: 33.7MB [04:33, 248kB/s]comptage_velo_donnees_compteurs.parquet: 33.8MB [04:33, 212kB/s]comptage_velo_donnees_compteurs.parquet: 33.9MB [04:34, 223kB/s]comptage_velo_donnees_compteurs.parquet: 34.0MB [04:34, 237kB/s]comptage_velo_donnees_compteurs.parquet: 34.0MB [04:35, 223kB/s]comptage_velo_donnees_compteurs.parquet: 34.1MB [04:35, 294kB/s]comptage_velo_donnees_compteurs.parquet: 34.2MB [04:35, 249kB/s]comptage_velo_donnees_compteurs.parquet: 34.2MB [04:35, 275kB/s]comptage_velo_donnees_compteurs.parquet: 34.2MB [04:35, 228kB/s]comptage_velo_donnees_compteurs.parquet: 34.3MB [04:36, 223kB/s]comptage_velo_donnees_compteurs.parquet: 34.3MB [04:36, 236kB/s]comptage_velo_donnees_compteurs.parquet: 34.4MB [04:36, 200kB/s]comptage_velo_donnees_compteurs.parquet: 34.5MB [04:36, 301kB/s]comptage_velo_donnees_compteurs.parquet: 34.5MB [04:37, 249kB/s]comptage_velo_donnees_compteurs.parquet: 34.6MB [04:37, 276kB/s]comptage_velo_donnees_compteurs.parquet: 34.6MB [04:37, 222kB/s]comptage_velo_donnees_compteurs.parquet: 34.6MB [04:37, 187kB/s]comptage_velo_donnees_compteurs.parquet: 34.7MB [04:38, 161kB/s]comptage_velo_donnees_compteurs.parquet: 34.8MB [04:39, 96.9kB/s]comptage_velo_donnees_compteurs.parquet: 34.9MB [04:39, 150kB/s] comptage_velo_donnees_compteurs.parquet: 34.9MB [04:40, 117kB/s]comptage_velo_donnees_compteurs.parquet: 35.0MB [04:40, 144kB/s]comptage_velo_donnees_compteurs.parquet: 35.0MB [04:40, 114kB/s]comptage_velo_donnees_compteurs.parquet: 35.0MB [04:41, 113kB/s]comptage_velo_donnees_compteurs.parquet: 35.1MB [04:41, 120kB/s]comptage_velo_donnees_compteurs.parquet: 35.1MB [04:42, 113kB/s]comptage_velo_donnees_compteurs.parquet: 35.2MB [04:42, 165kB/s]comptage_velo_donnees_compteurs.parquet: 35.3MB [04:43, 118kB/s]comptage_velo_donnees_compteurs.parquet: 35.3MB [04:43, 124kB/s]comptage_velo_donnees_compteurs.parquet: 35.4MB [04:44, 78.2kB/s]comptage_velo_donnees_compteurs.parquet: 35.4MB [04:45, 79.4kB/s]comptage_velo_donnees_compteurs.parquet: 35.5MB [04:46, 77.2kB/s]comptage_velo_donnees_compteurs.parquet: 35.5MB [04:46, 98.3kB/s]comptage_velo_donnees_compteurs.parquet: 35.5MB [04:47, 69.9kB/s]comptage_velo_donnees_compteurs.parquet: 35.6MB [04:47, 94.7kB/s]comptage_velo_donnees_compteurs.parquet: 35.6MB [04:47, 125kB/s] comptage_velo_donnees_compteurs.parquet: 35.7MB [04:47, 166kB/s]comptage_velo_donnees_compteurs.parquet: 35.7MB [04:48, 136kB/s]comptage_velo_donnees_compteurs.parquet: 35.8MB [04:48, 147kB/s]comptage_velo_donnees_compteurs.parquet: 35.8MB [04:48, 155kB/s]comptage_velo_donnees_compteurs.parquet: 35.9MB [04:49, 105kB/s]comptage_velo_donnees_compteurs.parquet: 36.0MB [04:49, 164kB/s]comptage_velo_donnees_compteurs.parquet: 36.0MB [04:50, 136kB/s]comptage_velo_donnees_compteurs.parquet: 36.1MB [04:50, 175kB/s]comptage_velo_donnees_compteurs.parquet: 36.1MB [04:50, 142kB/s]comptage_velo_donnees_compteurs.parquet: 36.1MB [04:50, 155kB/s]comptage_velo_donnees_compteurs.parquet: 36.2MB [04:51, 170kB/s]comptage_velo_donnees_compteurs.parquet: 36.3MB [04:51, 147kB/s]comptage_velo_donnees_compteurs.parquet: 36.4MB [04:52, 208kB/s]comptage_velo_donnees_compteurs.parquet: 36.4MB [04:52, 171kB/s]comptage_velo_donnees_compteurs.parquet: 36.5MB [04:52, 213kB/s]comptage_velo_donnees_compteurs.parquet: 36.5MB [04:53, 160kB/s]comptage_velo_donnees_compteurs.parquet: 36.5MB [04:53, 169kB/s]comptage_velo_donnees_compteurs.parquet: 36.6MB [04:53, 173kB/s]comptage_velo_donnees_compteurs.parquet: 36.6MB [04:54, 147kB/s]comptage_velo_donnees_compteurs.parquet: 36.7MB [04:54, 220kB/s]comptage_velo_donnees_compteurs.parquet: 36.8MB [04:54, 180kB/s]comptage_velo_donnees_compteurs.parquet: 36.8MB [04:54, 211kB/s]comptage_velo_donnees_compteurs.parquet: 36.9MB [04:55, 172kB/s]comptage_velo_donnees_compteurs.parquet: 36.9MB [04:55, 172kB/s]comptage_velo_donnees_compteurs.parquet: 37.0MB [04:55, 176kB/s]comptage_velo_donnees_compteurs.parquet: 37.0MB [04:56, 153kB/s]comptage_velo_donnees_compteurs.parquet: 37.1MB [04:56, 216kB/s]comptage_velo_donnees_compteurs.parquet: 37.1MB [04:56, 171kB/s]comptage_velo_donnees_compteurs.parquet: 37.2MB [04:57, 202kB/s]comptage_velo_donnees_compteurs.parquet: 37.2MB [04:57, 163kB/s]comptage_velo_donnees_compteurs.parquet: 37.3MB [04:57, 156kB/s]comptage_velo_donnees_compteurs.parquet: 37.3MB [04:57, 163kB/s]comptage_velo_donnees_compteurs.parquet: 37.4MB [04:58, 119kB/s]comptage_velo_donnees_compteurs.parquet: 37.5MB [04:59, 164kB/s]comptage_velo_donnees_compteurs.parquet: 37.5MB [04:59, 124kB/s]comptage_velo_donnees_compteurs.parquet: 37.6MB [04:59, 150kB/s]comptage_velo_donnees_compteurs.parquet: 37.6MB [05:00, 90.8kB/s]comptage_velo_donnees_compteurs.parquet: 37.6MB [05:01, 98.3kB/s]comptage_velo_donnees_compteurs.parquet: 37.7MB [05:01, 104kB/s] comptage_velo_donnees_compteurs.parquet: 37.8MB [05:02, 94.7kB/s]comptage_velo_donnees_compteurs.parquet: 37.8MB [05:02, 138kB/s] comptage_velo_donnees_compteurs.parquet: 37.9MB [05:02, 139kB/s]comptage_velo_donnees_compteurs.parquet: 37.9MB [05:03, 99.5kB/s]comptage_velo_donnees_compteurs.parquet: 38.0MB [05:03, 128kB/s] comptage_velo_donnees_compteurs.parquet: 38.0MB [05:04, 99.4kB/s]comptage_velo_donnees_compteurs.parquet: 38.0MB [05:04, 101kB/s] comptage_velo_donnees_compteurs.parquet: 38.1MB [05:05, 107kB/s]comptage_velo_donnees_compteurs.parquet: 38.1MB [05:06, 85.4kB/s]comptage_velo_donnees_compteurs.parquet: 38.2MB [05:06, 135kB/s] comptage_velo_donnees_compteurs.parquet: 38.3MB [05:06, 112kB/s]comptage_velo_donnees_compteurs.parquet: 38.3MB [05:07, 131kB/s]comptage_velo_donnees_compteurs.parquet: 38.4MB [05:07, 105kB/s]comptage_velo_donnees_compteurs.parquet: 38.4MB [05:08, 109kB/s]comptage_velo_donnees_compteurs.parquet: 38.5MB [05:08, 122kB/s]comptage_velo_donnees_compteurs.parquet: 38.5MB [05:09, 114kB/s]comptage_velo_donnees_compteurs.parquet: 38.6MB [05:09, 163kB/s]comptage_velo_donnees_compteurs.parquet: 38.6MB [05:09, 136kB/s]comptage_velo_donnees_compteurs.parquet: 38.7MB [05:10, 161kB/s]comptage_velo_donnees_compteurs.parquet: 38.7MB [05:10, 105kB/s]comptage_velo_donnees_compteurs.parquet: 38.8MB [05:11, 116kB/s]comptage_velo_donnees_compteurs.parquet: 38.8MB [05:11, 121kB/s]comptage_velo_donnees_compteurs.parquet: 38.9MB [05:12, 109kB/s]comptage_velo_donnees_compteurs.parquet: 39.0MB [05:12, 165kB/s]comptage_velo_donnees_compteurs.parquet: 39.0MB [05:12, 132kB/s]comptage_velo_donnees_compteurs.parquet: 39.1MB [05:13, 165kB/s]comptage_velo_donnees_compteurs.parquet: 39.1MB [05:13, 126kB/s]comptage_velo_donnees_compteurs.parquet: 39.1MB [05:13, 134kB/s]comptage_velo_donnees_compteurs.parquet: 39.2MB [05:14, 134kB/s]comptage_velo_donnees_compteurs.parquet: 39.3MB [05:15, 115kB/s]comptage_velo_donnees_compteurs.parquet: 39.3MB [05:15, 164kB/s]comptage_velo_donnees_compteurs.parquet: 39.4MB [05:15, 137kB/s]comptage_velo_donnees_compteurs.parquet: 39.5MB [05:16, 163kB/s]comptage_velo_donnees_compteurs.parquet: 39.5MB [05:16, 136kB/s]comptage_velo_donnees_compteurs.parquet: 39.5MB [05:16, 136kB/s]comptage_velo_donnees_compteurs.parquet: 39.6MB [05:17, 140kB/s]comptage_velo_donnees_compteurs.parquet: 39.6MB [05:17, 116kB/s]comptage_velo_donnees_compteurs.parquet: 39.7MB [05:18, 165kB/s]comptage_velo_donnees_compteurs.parquet: 39.8MB [05:18, 143kB/s]comptage_velo_donnees_compteurs.parquet: 39.8MB [05:18, 175kB/s]comptage_velo_donnees_compteurs.parquet: 39.9MB [05:19, 134kB/s]comptage_velo_donnees_compteurs.parquet: 39.9MB [05:19, 139kB/s]comptage_velo_donnees_compteurs.parquet: 40.0MB [05:19, 139kB/s]comptage_velo_donnees_compteurs.parquet: 40.0MB [05:20, 118kB/s]comptage_velo_donnees_compteurs.parquet: 40.1MB [05:20, 167kB/s]comptage_velo_donnees_compteurs.parquet: 40.1MB [05:21, 136kB/s]comptage_velo_donnees_compteurs.parquet: 40.2MB [05:21, 165kB/s]comptage_velo_donnees_compteurs.parquet: 40.2MB [05:22, 107kB/s]comptage_velo_donnees_compteurs.parquet: 40.3MB [05:22, 117kB/s]comptage_velo_donnees_compteurs.parquet: 40.3MB [05:22, 123kB/s]comptage_velo_donnees_compteurs.parquet: 40.4MB [05:23, 113kB/s]comptage_velo_donnees_compteurs.parquet: 40.5MB [05:23, 169kB/s]comptage_velo_donnees_compteurs.parquet: 40.5MB [05:24, 135kB/s]comptage_velo_donnees_compteurs.parquet: 40.6MB [05:24, 168kB/s]comptage_velo_donnees_compteurs.parquet: 40.6MB [05:25, 131kB/s]comptage_velo_donnees_compteurs.parquet: 40.6MB [05:25, 128kB/s]comptage_velo_donnees_compteurs.parquet: 40.7MB [05:25, 133kB/s]comptage_velo_donnees_compteurs.parquet: 40.8MB [05:26, 115kB/s]comptage_velo_donnees_compteurs.parquet: 40.8MB [05:26, 164kB/s]comptage_velo_donnees_compteurs.parquet: 40.9MB [05:27, 139kB/s]comptage_velo_donnees_compteurs.parquet: 41.0MB [05:27, 159kB/s]comptage_velo_donnees_compteurs.parquet: 41.0MB [05:27, 128kB/s]comptage_velo_donnees_compteurs.parquet: 41.0MB [05:28, 126kB/s]comptage_velo_donnees_compteurs.parquet: 41.1MB [05:28, 127kB/s]comptage_velo_donnees_compteurs.parquet: 41.1MB [05:29, 106kB/s]comptage_velo_donnees_compteurs.parquet: 41.2MB [05:29, 152kB/s]comptage_velo_donnees_compteurs.parquet: 41.2MB [05:29, 160kB/s]comptage_velo_donnees_compteurs.parquet: 41.3MB [05:30, 104kB/s]comptage_velo_donnees_compteurs.parquet: 41.3MB [05:30, 127kB/s]comptage_velo_donnees_compteurs.parquet: 41.4MB [05:31, 98.4kB/s]comptage_velo_donnees_compteurs.parquet: 41.4MB [05:31, 99.8kB/s]comptage_velo_donnees_compteurs.parquet: 41.5MB [05:32, 87.9kB/s]comptage_velo_donnees_compteurs.parquet: 41.5MB [05:33, 82.0kB/s]comptage_velo_donnees_compteurs.parquet: 41.6MB [05:33, 113kB/s] comptage_velo_donnees_compteurs.parquet: 41.6MB [05:33, 125kB/s]comptage_velo_donnees_compteurs.parquet: 41.6MB [05:34, 95.3kB/s]comptage_velo_donnees_compteurs.parquet: 41.7MB [05:34, 119kB/s] comptage_velo_donnees_compteurs.parquet: 41.7MB [05:35, 93.0kB/s]comptage_velo_donnees_compteurs.parquet: 41.8MB [05:35, 94.9kB/s]comptage_velo_donnees_compteurs.parquet: 41.8MB [05:36, 97.5kB/s]comptage_velo_donnees_compteurs.parquet: 41.9MB [05:37, 85.5kB/s]comptage_velo_donnees_compteurs.parquet: 42.0MB [05:37, 127kB/s] comptage_velo_donnees_compteurs.parquet: 42.0MB [05:37, 130kB/s]comptage_velo_donnees_compteurs.parquet: 42.0MB [05:38, 97.8kB/s]comptage_velo_donnees_compteurs.parquet: 42.1MB [05:38, 124kB/s] comptage_velo_donnees_compteurs.parquet: 42.1MB [05:39, 94.6kB/s]comptage_velo_donnees_compteurs.parquet: 42.1MB [05:39, 101kB/s] comptage_velo_donnees_compteurs.parquet: 42.2MB [05:39, 112kB/s]comptage_velo_donnees_compteurs.parquet: 42.3MB [05:40, 103kB/s]comptage_velo_donnees_compteurs.parquet: 42.3MB [05:40, 150kB/s]comptage_velo_donnees_compteurs.parquet: 42.4MB [05:41, 127kB/s]comptage_velo_donnees_compteurs.parquet: 42.5MB [05:41, 153kB/s]comptage_velo_donnees_compteurs.parquet: 42.5MB [05:41, 125kB/s]comptage_velo_donnees_compteurs.parquet: 42.5MB [05:42, 127kB/s]comptage_velo_donnees_compteurs.parquet: 42.6MB [05:42, 129kB/s]comptage_velo_donnees_compteurs.parquet: 42.6MB [05:43, 116kB/s]comptage_velo_donnees_compteurs.parquet: 42.7MB [05:43, 173kB/s]comptage_velo_donnees_compteurs.parquet: 42.8MB [05:44, 116kB/s]comptage_velo_donnees_compteurs.parquet: 42.8MB [05:44, 142kB/s]comptage_velo_donnees_compteurs.parquet: 42.9MB [05:45, 120kB/s]comptage_velo_donnees_compteurs.parquet: 42.9MB [05:45, 117kB/s]comptage_velo_donnees_compteurs.parquet: 43.0MB [05:45, 120kB/s]comptage_velo_donnees_compteurs.parquet: 43.0MB [05:46, 104kB/s]comptage_velo_donnees_compteurs.parquet: 43.1MB [05:46, 150kB/s]comptage_velo_donnees_compteurs.parquet: 43.1MB [05:47, 124kB/s]comptage_velo_donnees_compteurs.parquet: 43.2MB [05:47, 146kB/s]comptage_velo_donnees_compteurs.parquet: 43.2MB [05:48, 120kB/s]comptage_velo_donnees_compteurs.parquet: 43.3MB [05:48, 124kB/s]comptage_velo_donnees_compteurs.parquet: 43.3MB [05:48, 128kB/s]comptage_velo_donnees_compteurs.parquet: 43.4MB [05:49, 116kB/s]comptage_velo_donnees_compteurs.parquet: 43.5MB [05:49, 167kB/s]comptage_velo_donnees_compteurs.parquet: 43.5MB [05:50, 136kB/s]comptage_velo_donnees_compteurs.parquet: 43.6MB [05:50, 162kB/s]comptage_velo_donnees_compteurs.parquet: 43.6MB [05:51, 125kB/s]comptage_velo_donnees_compteurs.parquet: 43.6MB [05:51, 119kB/s]comptage_velo_donnees_compteurs.parquet: 43.7MB [05:51, 121kB/s]comptage_velo_donnees_compteurs.parquet: 43.8MB [05:52, 101kB/s]comptage_velo_donnees_compteurs.parquet: 43.8MB [05:52, 146kB/s]comptage_velo_donnees_compteurs.parquet: 43.9MB [05:53, 122kB/s]comptage_velo_donnees_compteurs.parquet: 44.0MB [05:53, 141kB/s]comptage_velo_donnees_compteurs.parquet: 44.0MB [05:54, 117kB/s]comptage_velo_donnees_compteurs.parquet: 44.0MB [05:54, 117kB/s]comptage_velo_donnees_compteurs.parquet: 44.1MB [05:55, 98.7kB/s]comptage_velo_donnees_compteurs.parquet: 44.1MB [05:56, 91.0kB/s]comptage_velo_donnees_compteurs.parquet: 44.2MB [05:56, 123kB/s] comptage_velo_donnees_compteurs.parquet: 44.2MB [05:56, 137kB/s]comptage_velo_donnees_compteurs.parquet: 44.3MB [05:56, 111kB/s]comptage_velo_donnees_compteurs.parquet: 44.3MB [05:57, 145kB/s]comptage_velo_donnees_compteurs.parquet: 44.4MB [05:57, 111kB/s]comptage_velo_donnees_compteurs.parquet: 44.4MB [05:58, 117kB/s]comptage_velo_donnees_compteurs.parquet: 44.5MB [05:58, 116kB/s]comptage_velo_donnees_compteurs.parquet: 44.5MB [05:59, 101kB/s]comptage_velo_donnees_compteurs.parquet: 44.6MB [05:59, 149kB/s]comptage_velo_donnees_compteurs.parquet: 44.6MB [06:00, 114kB/s]comptage_velo_donnees_compteurs.parquet: 44.7MB [06:00, 151kB/s]comptage_velo_donnees_compteurs.parquet: 44.7MB [06:00, 140kB/s]comptage_velo_donnees_compteurs.parquet: 44.8MB [06:00, 150kB/s]comptage_velo_donnees_compteurs.parquet: 44.8MB [06:01, 181kB/s]comptage_velo_donnees_compteurs.parquet: 44.9MB [06:01, 182kB/s]comptage_velo_donnees_compteurs.parquet: 45.0MB [06:01, 248kB/s]comptage_velo_donnees_compteurs.parquet: 45.1MB [06:01, 283kB/s]comptage_velo_donnees_compteurs.parquet: 45.1MB [06:02, 252kB/s]comptage_velo_donnees_compteurs.parquet: 45.1MB [06:02, 244kB/s]comptage_velo_donnees_compteurs.parquet: 45.2MB [06:02, 258kB/s]comptage_velo_donnees_compteurs.parquet: 45.3MB [06:02, 227kB/s]comptage_velo_donnees_compteurs.parquet: 45.4MB [06:02, 333kB/s]comptage_velo_donnees_compteurs.parquet: 45.4MB [06:03, 281kB/s]comptage_velo_donnees_compteurs.parquet: 45.5MB [06:03, 298kB/s]comptage_velo_donnees_compteurs.parquet: 45.5MB [06:03, 241kB/s]comptage_velo_donnees_compteurs.parquet: 45.5MB [06:03, 244kB/s]comptage_velo_donnees_compteurs.parquet: 45.6MB [06:04, 242kB/s]comptage_velo_donnees_compteurs.parquet: 45.6MB [06:04, 224kB/s]comptage_velo_donnees_compteurs.parquet: 45.8MB [06:04, 282kB/s]comptage_velo_donnees_compteurs.parquet: 45.8MB [06:04, 309kB/s]comptage_velo_donnees_compteurs.parquet: 45.9MB [06:05, 254kB/s]comptage_velo_donnees_compteurs.parquet: 45.9MB [06:05, 258kB/s]comptage_velo_donnees_compteurs.parquet: 46.0MB [06:05, 186kB/s]comptage_velo_donnees_compteurs.parquet: 46.0MB [06:06, 183kB/s]comptage_velo_donnees_compteurs.parquet: 46.1MB [06:06, 261kB/s]comptage_velo_donnees_compteurs.parquet: 46.1MB [06:06, 240kB/s]comptage_velo_donnees_compteurs.parquet: 46.2MB [06:06, 277kB/s]comptage_velo_donnees_compteurs.parquet: 46.2MB [06:06, 231kB/s]comptage_velo_donnees_compteurs.parquet: 46.3MB [06:06, 243kB/s]comptage_velo_donnees_compteurs.parquet: 46.3MB [06:07, 248kB/s]comptage_velo_donnees_compteurs.parquet: 46.4MB [06:07, 225kB/s]comptage_velo_donnees_compteurs.parquet: 46.5MB [06:07, 308kB/s]comptage_velo_donnees_compteurs.parquet: 46.5MB [06:07, 253kB/s]comptage_velo_donnees_compteurs.parquet: 46.6MB [06:08, 263kB/s]comptage_velo_donnees_compteurs.parquet: 46.6MB [06:08, 271kB/s]comptage_velo_donnees_compteurs.parquet: 46.7MB [06:08, 266kB/s]comptage_velo_donnees_compteurs.parquet: 46.8MB [06:09, 239kB/s]comptage_velo_donnees_compteurs.parquet: 46.9MB [06:09, 318kB/s]comptage_velo_donnees_compteurs.parquet: 46.9MB [06:09, 267kB/s]comptage_velo_donnees_compteurs.parquet: 47.0MB [06:09, 320kB/s]comptage_velo_donnees_compteurs.parquet: 47.0MB [06:09, 261kB/s]comptage_velo_donnees_compteurs.parquet: 47.1MB [06:10, 267kB/s]comptage_velo_donnees_compteurs.parquet: 47.1MB [06:10, 226kB/s]comptage_velo_donnees_compteurs.parquet: 47.2MB [06:10, 302kB/s]comptage_velo_donnees_compteurs.parquet: 47.3MB [06:10, 257kB/s]comptage_velo_donnees_compteurs.parquet: 47.3MB [06:11, 288kB/s]comptage_velo_donnees_compteurs.parquet: 47.4MB [06:11, 180kB/s]comptage_velo_donnees_compteurs.parquet: 47.4MB [06:11, 139kB/s]comptage_velo_donnees_compteurs.parquet: 47.5MB [06:12, 107kB/s]comptage_velo_donnees_compteurs.parquet: 47.5MB [06:14, 72.8kB/s]comptage_velo_donnees_compteurs.parquet: 47.6MB [06:14, 106kB/s] comptage_velo_donnees_compteurs.parquet: 47.6MB [06:15, 82.3kB/s]comptage_velo_donnees_compteurs.parquet: 47.7MB [06:15, 95.7kB/s]comptage_velo_donnees_compteurs.parquet: 47.7MB [06:17, 66.4kB/s]comptage_velo_donnees_compteurs.parquet: 47.8MB [06:17, 70.3kB/s]comptage_velo_donnees_compteurs.parquet: 47.8MB [06:18, 73.4kB/s]comptage_velo_donnees_compteurs.parquet: 47.9MB [06:18, 93.9kB/s]comptage_velo_donnees_compteurs.parquet: 47.9MB [06:19, 55.7kB/s]comptage_velo_donnees_compteurs.parquet: 48.0MB [06:19, 102kB/s] comptage_velo_donnees_compteurs.parquet: 48.0MB [06:20, 86.0kB/s]comptage_velo_donnees_compteurs.parquet: 48.1MB [06:20, 110kB/s] comptage_velo_donnees_compteurs.parquet: 48.1MB [06:21, 90.3kB/s]comptage_velo_donnees_compteurs.parquet: 48.1MB [06:21, 92.5kB/s]comptage_velo_donnees_compteurs.parquet: 48.2MB [06:22, 94.6kB/s]comptage_velo_donnees_compteurs.parquet: 48.3MB [06:23, 84.1kB/s]comptage_velo_donnees_compteurs.parquet: 48.3MB [06:23, 115kB/s] comptage_velo_donnees_compteurs.parquet: 48.4MB [06:23, 121kB/s]comptage_velo_donnees_compteurs.parquet: 48.4MB [06:24, 88.0kB/s]comptage_velo_donnees_compteurs.parquet: 48.5MB [06:24, 111kB/s] comptage_velo_donnees_compteurs.parquet: 48.5MB [06:25, 87.8kB/s]comptage_velo_donnees_compteurs.parquet: 48.5MB [06:25, 91.1kB/s]comptage_velo_donnees_compteurs.parquet: 48.6MB [06:26, 93.7kB/s]comptage_velo_donnees_compteurs.parquet: 48.6MB [06:27, 83.4kB/s]comptage_velo_donnees_compteurs.parquet: 48.7MB [06:27, 115kB/s] comptage_velo_donnees_compteurs.parquet: 48.7MB [06:27, 129kB/s]comptage_velo_donnees_compteurs.parquet: 48.8MB [06:28, 79.0kB/s]comptage_velo_donnees_compteurs.parquet: 48.8MB [06:28, 106kB/s] comptage_velo_donnees_compteurs.parquet: 48.9MB [06:29, 86.9kB/s]comptage_velo_donnees_compteurs.parquet: 48.9MB [06:29, 88.8kB/s]comptage_velo_donnees_compteurs.parquet: 49.0MB [06:30, 95.8kB/s]comptage_velo_donnees_compteurs.parquet: 49.0MB [06:31, 80.4kB/s]comptage_velo_donnees_compteurs.parquet: 49.1MB [06:31, 123kB/s] comptage_velo_donnees_compteurs.parquet: 49.1MB [06:32, 98.1kB/s]comptage_velo_donnees_compteurs.parquet: 49.2MB [06:32, 120kB/s] comptage_velo_donnees_compteurs.parquet: 49.2MB [06:33, 92.1kB/s]comptage_velo_donnees_compteurs.parquet: 49.3MB [06:33, 91.7kB/s]comptage_velo_donnees_compteurs.parquet: 49.3MB [06:34, 93.8kB/s]comptage_velo_donnees_compteurs.parquet: 49.4MB [06:35, 78.3kB/s]comptage_velo_donnees_compteurs.parquet: 49.5MB [06:35, 122kB/s] comptage_velo_donnees_compteurs.parquet: 49.5MB [06:36, 98.6kB/s]comptage_velo_donnees_compteurs.parquet: 49.6MB [06:36, 117kB/s] comptage_velo_donnees_compteurs.parquet: 49.6MB [06:37, 94.1kB/s]comptage_velo_donnees_compteurs.parquet: 49.6MB [06:37, 92.5kB/s]comptage_velo_donnees_compteurs.parquet: 49.7MB [06:38, 78.6kB/s]comptage_velo_donnees_compteurs.parquet: 49.8MB [06:39, 70.5kB/s]comptage_velo_donnees_compteurs.parquet: 49.9MB [06:40, 107kB/s] comptage_velo_donnees_compteurs.parquet: 49.9MB [06:40, 92.8kB/s]comptage_velo_donnees_compteurs.parquet: 50.0MB [06:41, 114kB/s] comptage_velo_donnees_compteurs.parquet: 50.0MB [06:41, 97.6kB/s]comptage_velo_donnees_compteurs.parquet: 50.0MB [06:41, 100kB/s] comptage_velo_donnees_compteurs.parquet: 50.1MB [06:42, 106kB/s]comptage_velo_donnees_compteurs.parquet: 50.1MB [06:43, 92.5kB/s]comptage_velo_donnees_compteurs.parquet: 50.2MB [06:43, 135kB/s] comptage_velo_donnees_compteurs.parquet: 50.2MB [06:43, 139kB/s]comptage_velo_donnees_compteurs.parquet: 50.3MB [06:44, 101kB/s]comptage_velo_donnees_compteurs.parquet: 50.3MB [06:44, 130kB/s]comptage_velo_donnees_compteurs.parquet: 50.4MB [06:45, 103kB/s]comptage_velo_donnees_compteurs.parquet: 50.4MB [06:45, 103kB/s]comptage_velo_donnees_compteurs.parquet: 50.5MB [06:45, 103kB/s]comptage_velo_donnees_compteurs.parquet: 50.5MB [06:46, 88.6kB/s]comptage_velo_donnees_compteurs.parquet: 50.6MB [06:47, 132kB/s] comptage_velo_donnees_compteurs.parquet: 50.6MB [06:47, 133kB/s]comptage_velo_donnees_compteurs.parquet: 50.6MB [06:47, 94.6kB/s]comptage_velo_donnees_compteurs.parquet: 50.7MB [06:48, 120kB/s] comptage_velo_donnees_compteurs.parquet: 50.7MB [06:48, 94.4kB/s]comptage_velo_donnees_compteurs.parquet: 50.8MB [06:49, 102kB/s] comptage_velo_donnees_compteurs.parquet: 50.8MB [06:49, 102kB/s]comptage_velo_donnees_compteurs.parquet: 50.9MB [06:50, 77.8kB/s]comptage_velo_donnees_compteurs.parquet: 51.0MB [06:51, 124kB/s] comptage_velo_donnees_compteurs.parquet: 51.0MB [06:51, 106kB/s]comptage_velo_donnees_compteurs.parquet: 51.1MB [06:51, 124kB/s]comptage_velo_donnees_compteurs.parquet: 51.1MB [06:52, 80.9kB/s]comptage_velo_donnees_compteurs.parquet: 51.1MB [06:53, 80.3kB/s]comptage_velo_donnees_compteurs.parquet: 51.2MB [06:54, 78.1kB/s]comptage_velo_donnees_compteurs.parquet: 51.3MB [06:54, 99.5kB/s]comptage_velo_donnees_compteurs.parquet: 51.3MB [06:55, 57.4kB/s]comptage_velo_donnees_compteurs.parquet: 51.4MB [06:55, 95.3kB/s]comptage_velo_donnees_compteurs.parquet: 51.4MB [06:56, 76.6kB/s]comptage_velo_donnees_compteurs.parquet: 51.5MB [06:57, 92.0kB/s]comptage_velo_donnees_compteurs.parquet: 51.5MB [06:58, 67.5kB/s]comptage_velo_donnees_compteurs.parquet: 51.5MB [06:58, 69.8kB/s]comptage_velo_donnees_compteurs.parquet: 51.6MB [06:59, 71.5kB/s]comptage_velo_donnees_compteurs.parquet: 51.6MB [06:59, 92.3kB/s]comptage_velo_donnees_compteurs.parquet: 51.6MB [07:00, 65.8kB/s]comptage_velo_donnees_compteurs.parquet: 51.7MB [07:00, 90.2kB/s]comptage_velo_donnees_compteurs.parquet: 51.7MB [07:00, 120kB/s] comptage_velo_donnees_compteurs.parquet: 51.8MB [07:01, 75.1kB/s]comptage_velo_donnees_compteurs.parquet: 51.8MB [07:01, 108kB/s] comptage_velo_donnees_compteurs.parquet: 51.9MB [07:02, 91.9kB/s]comptage_velo_donnees_compteurs.parquet: 51.9MB [07:02, 94.5kB/s]comptage_velo_donnees_compteurs.parquet: 52.0MB [07:03, 99.3kB/s]comptage_velo_donnees_compteurs.parquet: 52.0MB [07:04, 88.2kB/s]comptage_velo_donnees_compteurs.parquet: 52.1MB [07:04, 131kB/s] comptage_velo_donnees_compteurs.parquet: 52.1MB [07:04, 137kB/s]comptage_velo_donnees_compteurs.parquet: 52.1MB [07:04, 104kB/s]comptage_velo_donnees_compteurs.parquet: 52.2MB [07:05, 138kB/s]comptage_velo_donnees_compteurs.parquet: 52.2MB [07:05, 107kB/s]comptage_velo_donnees_compteurs.parquet: 52.3MB [07:06, 108kB/s]comptage_velo_donnees_compteurs.parquet: 52.3MB [07:06, 107kB/s]comptage_velo_donnees_compteurs.parquet: 52.4MB [07:07, 85.6kB/s]comptage_velo_donnees_compteurs.parquet: 52.5MB [07:07, 133kB/s] comptage_velo_donnees_compteurs.parquet: 52.5MB [07:08, 106kB/s]comptage_velo_donnees_compteurs.parquet: 52.6MB [07:08, 131kB/s]comptage_velo_donnees_compteurs.parquet: 52.6MB [07:09, 102kB/s]comptage_velo_donnees_compteurs.parquet: 52.6MB [07:09, 102kB/s]comptage_velo_donnees_compteurs.parquet: 52.7MB [07:10, 107kB/s]comptage_velo_donnees_compteurs.parquet: 52.8MB [07:11, 99.3kB/s]comptage_velo_donnees_compteurs.parquet: 52.8MB [07:11, 144kB/s] comptage_velo_donnees_compteurs.parquet: 52.9MB [07:11, 146kB/s]comptage_velo_donnees_compteurs.parquet: 52.9MB [07:11, 107kB/s]comptage_velo_donnees_compteurs.parquet: 53.0MB [07:12, 133kB/s]comptage_velo_donnees_compteurs.parquet: 53.0MB [07:13, 87.1kB/s]comptage_velo_donnees_compteurs.parquet: 53.0MB [07:13, 85.9kB/s]comptage_velo_donnees_compteurs.parquet: 53.1MB [07:13, 96.0kB/s]comptage_velo_donnees_compteurs.parquet: 53.1MB [07:14, 88.4kB/s]comptage_velo_donnees_compteurs.parquet: 53.2MB [07:15, 131kB/s] comptage_velo_donnees_compteurs.parquet: 53.3MB [07:15, 112kB/s]comptage_velo_donnees_compteurs.parquet: 53.3MB [07:15, 136kB/s]comptage_velo_donnees_compteurs.parquet: 53.4MB [07:16, 115kB/s]comptage_velo_donnees_compteurs.parquet: 53.4MB [07:16, 116kB/s]comptage_velo_donnees_compteurs.parquet: 53.5MB [07:17, 118kB/s]comptage_velo_donnees_compteurs.parquet: 53.5MB [07:18, 101kB/s]comptage_velo_donnees_compteurs.parquet: 53.6MB [07:18, 146kB/s]comptage_velo_donnees_compteurs.parquet: 53.6MB [07:18, 146kB/s]comptage_velo_donnees_compteurs.parquet: 53.6MB [07:18, 104kB/s]comptage_velo_donnees_compteurs.parquet: 53.7MB [07:19, 129kB/s]comptage_velo_donnees_compteurs.parquet: 53.7MB [07:19, 101kB/s]comptage_velo_donnees_compteurs.parquet: 53.8MB [07:20, 107kB/s]comptage_velo_donnees_compteurs.parquet: 53.8MB [07:20, 114kB/s]comptage_velo_donnees_compteurs.parquet: 53.9MB [07:21, 96.8kB/s]comptage_velo_donnees_compteurs.parquet: 54.0MB [07:21, 142kB/s] comptage_velo_donnees_compteurs.parquet: 54.0MB [07:21, 146kB/s]comptage_velo_donnees_compteurs.parquet: 54.0MB [07:22, 103kB/s]comptage_velo_donnees_compteurs.parquet: 54.1MB [07:22, 136kB/s]comptage_velo_donnees_compteurs.parquet: 54.1MB [07:23, 105kB/s]comptage_velo_donnees_compteurs.parquet: 54.1MB [07:23, 87.6kB/s]comptage_velo_donnees_compteurs.parquet: 54.2MB [07:23, 115kB/s] comptage_velo_donnees_compteurs.parquet: 54.2MB [07:24, 92.1kB/s]comptage_velo_donnees_compteurs.parquet: 54.3MB [07:25, 82.5kB/s]comptage_velo_donnees_compteurs.parquet: 54.3MB [07:25, 119kB/s] comptage_velo_donnees_compteurs.parquet: 54.4MB [07:25, 116kB/s]comptage_velo_donnees_compteurs.parquet: 54.5MB [07:26, 145kB/s]comptage_velo_donnees_compteurs.parquet: 54.5MB [07:26, 116kB/s]comptage_velo_donnees_compteurs.parquet: 54.5MB [07:26, 113kB/s]comptage_velo_donnees_compteurs.parquet: 54.6MB [07:27, 114kB/s]comptage_velo_donnees_compteurs.parquet: 54.6MB [07:28, 89.3kB/s]comptage_velo_donnees_compteurs.parquet: 54.7MB [07:28, 137kB/s] comptage_velo_donnees_compteurs.parquet: 54.8MB [07:29, 113kB/s]comptage_velo_donnees_compteurs.parquet: 54.8MB [07:29, 133kB/s]comptage_velo_donnees_compteurs.parquet: 54.9MB [07:30, 109kB/s]comptage_velo_donnees_compteurs.parquet: 54.9MB [07:30, 107kB/s]comptage_velo_donnees_compteurs.parquet: 55.0MB [07:30, 115kB/s]comptage_velo_donnees_compteurs.parquet: 55.0MB [07:31, 99.6kB/s]comptage_velo_donnees_compteurs.parquet: 55.1MB [07:31, 144kB/s] comptage_velo_donnees_compteurs.parquet: 55.1MB [07:32, 148kB/s]comptage_velo_donnees_compteurs.parquet: 55.1MB [07:32, 102kB/s]comptage_velo_donnees_compteurs.parquet: 55.2MB [07:33, 127kB/s]comptage_velo_donnees_compteurs.parquet: 55.2MB [07:33, 99.3kB/s]comptage_velo_donnees_compteurs.parquet: 55.3MB [07:33, 100kB/s] comptage_velo_donnees_compteurs.parquet: 55.3MB [07:34, 103kB/s]comptage_velo_donnees_compteurs.parquet: 55.4MB [07:35, 73.0kB/s]comptage_velo_donnees_compteurs.parquet: 55.5MB [07:36, 119kB/s] comptage_velo_donnees_compteurs.parquet: 55.5MB [07:36, 99.6kB/s]comptage_velo_donnees_compteurs.parquet: 55.6MB [07:36, 124kB/s] comptage_velo_donnees_compteurs.parquet: 55.6MB [07:37, 97.8kB/s]comptage_velo_donnees_compteurs.parquet: 55.6MB [07:37, 97.3kB/s]comptage_velo_donnees_compteurs.parquet: 55.7MB [07:38, 101kB/s] comptage_velo_donnees_compteurs.parquet: 55.8MB [07:39, 81.3kB/s]comptage_velo_donnees_compteurs.parquet: 55.9MB [07:39, 120kB/s] comptage_velo_donnees_compteurs.parquet: 55.9MB [07:40, 101kB/s]comptage_velo_donnees_compteurs.parquet: 56.0MB [07:40, 122kB/s]comptage_velo_donnees_compteurs.parquet: 56.0MB [07:41, 98.5kB/s]comptage_velo_donnees_compteurs.parquet: 56.0MB [07:41, 103kB/s] comptage_velo_donnees_compteurs.parquet: 56.1MB [07:42, 106kB/s]comptage_velo_donnees_compteurs.parquet: 56.1MB [07:43, 86.3kB/s]comptage_velo_donnees_compteurs.parquet: 56.2MB [07:43, 126kB/s] comptage_velo_donnees_compteurs.parquet: 56.3MB [07:44, 98.7kB/s]comptage_velo_donnees_compteurs.parquet: 56.3MB [07:44, 121kB/s] comptage_velo_donnees_compteurs.parquet: 56.4MB [07:45, 94.2kB/s]comptage_velo_donnees_compteurs.parquet: 56.4MB [07:45, 93.6kB/s]comptage_velo_donnees_compteurs.parquet: 56.5MB [07:46, 98.5kB/s]comptage_velo_donnees_compteurs.parquet: 56.5MB [07:47, 82.3kB/s]comptage_velo_donnees_compteurs.parquet: 56.6MB [07:47, 123kB/s] comptage_velo_donnees_compteurs.parquet: 56.6MB [07:48, 82.7kB/s]comptage_velo_donnees_compteurs.parquet: 56.7MB [07:48, 107kB/s] comptage_velo_donnees_compteurs.parquet: 56.7MB [07:49, 90.9kB/s]comptage_velo_donnees_compteurs.parquet: 56.8MB [07:49, 92.6kB/s]comptage_velo_donnees_compteurs.parquet: 56.8MB [07:50, 94.1kB/s]comptage_velo_donnees_compteurs.parquet: 56.9MB [07:51, 84.5kB/s]comptage_velo_donnees_compteurs.parquet: 57.0MB [07:51, 115kB/s] comptage_velo_donnees_compteurs.parquet: 57.0MB [07:51, 125kB/s]comptage_velo_donnees_compteurs.parquet: 57.0MB [07:52, 97.2kB/s]comptage_velo_donnees_compteurs.parquet: 57.1MB [07:52, 127kB/s] comptage_velo_donnees_compteurs.parquet: 57.1MB [07:53, 102kB/s]comptage_velo_donnees_compteurs.parquet: 57.1MB [07:53, 108kB/s]comptage_velo_donnees_compteurs.parquet: 57.2MB [07:53, 112kB/s]comptage_velo_donnees_compteurs.parquet: 57.3MB [07:54, 95.9kB/s]comptage_velo_donnees_compteurs.parquet: 57.4MB [07:54, 138kB/s] comptage_velo_donnees_compteurs.parquet: 57.4MB [07:55, 109kB/s]comptage_velo_donnees_compteurs.parquet: 57.5MB [07:55, 130kB/s]comptage_velo_donnees_compteurs.parquet: 57.5MB [07:56, 103kB/s]comptage_velo_donnees_compteurs.parquet: 57.5MB [07:56, 104kB/s]comptage_velo_donnees_compteurs.parquet: 57.6MB [07:57, 107kB/s]comptage_velo_donnees_compteurs.parquet: 57.6MB [07:58, 92.1kB/s]comptage_velo_donnees_compteurs.parquet: 57.7MB [07:58, 135kB/s] comptage_velo_donnees_compteurs.parquet: 57.7MB [07:58, 114kB/s]comptage_velo_donnees_compteurs.parquet: 57.8MB [07:59, 82.9kB/s]comptage_velo_donnees_compteurs.parquet: 57.8MB [07:59, 116kB/s] comptage_velo_donnees_compteurs.parquet: 57.9MB [08:00, 87.3kB/s]comptage_velo_donnees_compteurs.parquet: 57.9MB [08:00, 91.3kB/s]comptage_velo_donnees_compteurs.parquet: 58.0MB [08:01, 97.7kB/s]comptage_velo_donnees_compteurs.parquet: 58.0MB [08:02, 85.8kB/s]comptage_velo_donnees_compteurs.parquet: 58.1MB [08:02, 128kB/s] comptage_velo_donnees_compteurs.parquet: 58.1MB [08:02, 129kB/s]comptage_velo_donnees_compteurs.parquet: 58.1MB [08:03, 96.5kB/s]comptage_velo_donnees_compteurs.parquet: 58.2MB [08:03, 127kB/s] comptage_velo_donnees_compteurs.parquet: 58.2MB [08:04, 98.4kB/s]comptage_velo_donnees_compteurs.parquet: 58.3MB [08:04, 100kB/s] comptage_velo_donnees_compteurs.parquet: 58.3MB [08:04, 105kB/s]comptage_velo_donnees_compteurs.parquet: 58.4MB [08:05, 90.4kB/s]comptage_velo_donnees_compteurs.parquet: 58.5MB [08:06, 134kB/s] comptage_velo_donnees_compteurs.parquet: 58.5MB [08:06, 111kB/s]comptage_velo_donnees_compteurs.parquet: 58.6MB [08:07, 132kB/s]comptage_velo_donnees_compteurs.parquet: 58.6MB [08:07, 99.7kB/s]comptage_velo_donnees_compteurs.parquet: 58.6MB [08:07, 107kB/s] comptage_velo_donnees_compteurs.parquet: 58.7MB [08:08, 107kB/s]comptage_velo_donnees_compteurs.parquet: 58.8MB [08:09, 74.7kB/s]comptage_velo_donnees_compteurs.parquet: 58.9MB [08:10, 117kB/s] comptage_velo_donnees_compteurs.parquet: 58.9MB [08:10, 97.6kB/s]comptage_velo_donnees_compteurs.parquet: 59.0MB [08:10, 120kB/s] comptage_velo_donnees_compteurs.parquet: 59.0MB [08:11, 96.6kB/s]comptage_velo_donnees_compteurs.parquet: 59.0MB [08:11, 100kB/s] comptage_velo_donnees_compteurs.parquet: 59.1MB [08:12, 109kB/s]comptage_velo_donnees_compteurs.parquet: 59.1MB [08:13, 95.0kB/s]comptage_velo_donnees_compteurs.parquet: 59.2MB [08:13, 138kB/s] comptage_velo_donnees_compteurs.parquet: 59.2MB [08:13, 136kB/s]comptage_velo_donnees_compteurs.parquet: 59.3MB [08:14, 104kB/s]comptage_velo_donnees_compteurs.parquet: 59.3MB [08:14, 138kB/s]comptage_velo_donnees_compteurs.parquet: 59.4MB [08:14, 102kB/s]comptage_velo_donnees_compteurs.parquet: 59.4MB [08:15, 102kB/s]comptage_velo_donnees_compteurs.parquet: 59.5MB [08:15, 101kB/s]comptage_velo_donnees_compteurs.parquet: 59.5MB [08:16, 91.2kB/s]comptage_velo_donnees_compteurs.parquet: 59.6MB [08:16, 124kB/s] comptage_velo_donnees_compteurs.parquet: 59.6MB [08:17, 137kB/s]comptage_velo_donnees_compteurs.parquet: 59.6MB [08:17, 105kB/s]comptage_velo_donnees_compteurs.parquet: 59.7MB [08:17, 130kB/s]comptage_velo_donnees_compteurs.parquet: 59.7MB [08:18, 103kB/s]comptage_velo_donnees_compteurs.parquet: 59.8MB [08:18, 106kB/s]comptage_velo_donnees_compteurs.parquet: 59.8MB [08:19, 116kB/s]comptage_velo_donnees_compteurs.parquet: 59.9MB [08:20, 81.7kB/s]comptage_velo_donnees_compteurs.parquet: 60.0MB [08:20, 127kB/s] comptage_velo_donnees_compteurs.parquet: 60.0MB [08:21, 109kB/s]comptage_velo_donnees_compteurs.parquet: 60.1MB [08:21, 131kB/s]comptage_velo_donnees_compteurs.parquet: 60.1MB [08:22, 105kB/s]comptage_velo_donnees_compteurs.parquet: 60.1MB [08:22, 107kB/s]comptage_velo_donnees_compteurs.parquet: 60.2MB [08:22, 111kB/s]comptage_velo_donnees_compteurs.parquet: 60.3MB [08:23, 95.1kB/s]comptage_velo_donnees_compteurs.parquet: 60.3MB [08:23, 138kB/s] comptage_velo_donnees_compteurs.parquet: 60.4MB [08:25, 67.2kB/s]comptage_velo_donnees_compteurs.parquet: 60.5MB [08:26, 107kB/s] comptage_velo_donnees_compteurs.parquet: 60.8MB [08:26, 287kB/s]comptage_velo_donnees_compteurs.parquet: 62.1MB [08:26, 1.26MB/s]comptage_velo_donnees_compteurs.parquet: 66.4MB [08:26, 5.14MB/s]comptage_velo_donnees_compteurs.parquet: 71.6MB [08:26, 9.99MB/s]comptage_velo_donnees_compteurs.parquet: 76.7MB [08:26, 14.5MB/s]comptage_velo_donnees_compteurs.parquet: 81.9MB [08:26, 18.7MB/s]comptage_velo_donnees_compteurs.parquet: 87.5MB [08:27, 25.2MB/s]comptage_velo_donnees_compteurs.parquet: 90.9MB [08:27, 24.9MB/s]comptage_velo_donnees_compteurs.parquet: 95.6MB [08:27, 29.7MB/s]comptage_velo_donnees_compteurs.parquet: 99.2MB [08:27, 28.7MB/s]comptage_velo_donnees_compteurs.parquet: 104MB [08:27, 32.8MB/s] comptage_velo_donnees_compteurs.parquet: 108MB [08:27, 31.7MB/s]comptage_velo_donnees_compteurs.parquet: 112MB [08:27, 33.6MB/s]comptage_velo_donnees_compteurs.parquet: 116MB [08:27, 34.0MB/s]comptage_velo_donnees_compteurs.parquet: 119MB [08:28, 247kB/s] 
id_compteur nom_compteur id sum_counts date
0 100003098-101003098 106 avenue Denfert Rochereau NE-SO 100003098 19 2023-10-01 05:00:00+00:00
1 100003098-101003098 106 avenue Denfert Rochereau NE-SO 100003098 11 2023-10-01 06:00:00+00:00
2 100003098-101003098 106 avenue Denfert Rochereau NE-SO 100003098 6 2023-10-01 07:00:00+00:00

2 Premières productions graphiques avec l’API Matplotlib de Pandas

Chercher à produire une visualisation parfaite du premier coup est illusoire. Il est beaucoup plus réaliste d’améliorer graduellement une représentation graphique afin, petit à petit, de mettre en avant les effets de structure dans un jeu de données.

Nous allons donc commencer par nous représenter la distribution des passages aux principales stations de mesure. Pour cela nous allons produire rapidement un barplot puis l’améliorer graduellement.

Dans cette partie, nous allons ainsi reproduire les deux premiers graphiques de la page d’analyse des données : Les 10 compteurs avec la moyenne horaire la plus élevée et Les 10 compteurs ayant comptabilisé le plus de vélos. Les valeurs chiffrées des graphiques peuvent être différentes de celles de la page en ligne, c’est normal, car nous ne travaillons pas systématiquement sur les données ayant la même fraicheur que celles en ligne.

Pour importer les librairies graphiques que nous utiliserons dans ce chapitre, il faut faire

import matplotlib.pyplot as plt
import seaborn as sns
1from plotnine import *
1
Importer des librairies sous la forme from package import * n’est pas une très bonne pratique. Néanmoins, pour un package comme plotnine, dont nous allons utiliser de nombreuses fonctions, ce serait un peu fastidieux d’importer les fonctions au cas par cas. De plus, cela permet de réutiliser presque tels quels les exemples de code de la librairie R ggplot, nombreux sur internet avec démonstrations visuelles. from package import * est l’équivalent Python de la pratique library(package) en R.

2.1 Comprendre, en quelques mots, le principe de matplotlib

matplotlib date du début des années 2000 et a émergé pour proposer une alternative en Python à la création de graphiques sous Matlab, un logiciel propriétaire de calcul numérique. matplotlib est donc une librairie assez ancienne, antérieure à l’émergence de Python dans l’écosystème du traitement de données. Cela s’en ressent sur la logique de construction de matplotlib qui n’est pas toujours intuitive lorsqu’on est familier de l’écosystème moderne de la data science. Heureusement, il existe de nombreuses librairies qui s’appuient sur matplotlib mais qui visent à founir une syntaxe plus familière aux data scientists.

matplotlib propose principalement deux niveaux d’abstraction: la figure et les axes. La figure est, en quelques sortes, la “toile” globale qui contient un ou plusieurs axes dans lesquels s’inséreront des graphiques. Selon les cas, il faudra jouer avec les paramètres de figure ou d’axe, ce qui rend très flexible la construction d’un graphique mais peut également être déroutant car on ne sait jamais trop quel niveau d’abstraction il faut modifier pour mettre à jour sa figure2. Comme le montre la Figure 2.1, tout les éléments d’une figure sont paramétrables.

Figure 2.1: Comprendre l’architecture d’une figure matplotlib (Source: documentation officielle)

En pratique, il existe deux manières de créer et mettre à jour sa figure selon qu’on préfère passer par:

  • l’approche explicite, héritière d’une logique de programmation orientée objet, où on crée des objets Figure et Axes et met à jour ceux-ci.
  • l’approche implicite, basée sur l’interface pyplot qui utilise une succession de fonctions pour mettre à jour les objets créés implicitement.
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2, 100)  # Sample data.

# Note that even in the OO-style, we use `.pyplot.figure` to create the Figure.
fig, ax = plt.subplots(figsize=(5, 2.7), layout="constrained")
ax.plot(x, x, label="linear")  # Plot some data on the Axes.
ax.plot(x, x**2, label="quadratic")  # Plot more data on the Axes...
ax.plot(x, x**3, label="cubic")  # ... and some more.
ax.set_xlabel("x label")  # Add an x-label to the Axes.
ax.set_ylabel("y label")  # Add a y-label to the Axes.
ax.set_title("Simple Plot")  # Add a title to the Axes.
ax.legend()  # Add a legend.

Source: Documentation officielle de matplotlib

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2, 100)  # Sample data.

plt.figure(figsize=(5, 2.7), layout="constrained")
plt.plot(x, x, label="linear")  # Plot some data on the (implicit) Axes.
plt.plot(x, x**2, label="quadratic")  # etc.
plt.plot(x, x**3, label="cubic")
plt.xlabel("x label")
plt.ylabel("y label")
plt.title("Simple Plot")
plt.legend()

Source: Documentation officielle de matplotlib

Ces éléments constituent le minimum pour comprendre la logique de matplotlib. Pour être plus à l’aise avec ces concepts, la pratique répétée est indispensable.

2.2 Découvrir matplotlib par l’intermédiaire de Pandas

Exercice 1 : Produire un premier graphique

Les données comportent plusieurs dimensions pouvant faire l’objet d’une analyse statistique. Nous allons commencer par nous focaliser sur le volume de passage à tel ou tel compteur.

Puisque nous avons comme objectif de synthétiser l’information présente dans notre jeu de données, nous devons d’abord mettre en oeuvre quelques agrégations ad hoc pour produire un graphique lisible.

  1. Garder les dix bornes à la moyenne la plus élevée. Comme pour obtenir un graphique ordonné du plus grand au plus petit avec les méthodes plot de Pandas, il faut avoir les données ordonnées du plus petit au plus grand (oui c’est bizarre mais c’est comme ça…), réordonner les données.

  2. En premier lieu, sans se préoccuper des éléments de style ni de la beauté du graphique, créer la structure du barplot (diagramme en batons) de la page d’analyse des données.

  3. Pour préparer le travail sur la deuxième figure, ne conserver que les 10 compteurs ayant comptabilisés le plus de vélos.

  4. Comme pour la question 2, créer un barplot pour reproduire la figure 2 de l’open data parisien

Les 10 principales stations à l’issue de la question 1

sum_counts
nom_compteur
27 quai de la Tournelle SE-NO 163.435066
27 quai de la Tournelle 27 quai de la Tournelle Vélos SE-NO 171.763314
35 boulevard de Ménilmontant NO-SE 182.139607
Quai d'Orsay E-O 182.465023
Totem 64 Rue de Rivoli Totem 64 Rue de Rivoli Vélos E-O 194.277891

Figure 1 sans travail sur le style:

Figure 2 sans travail sur le style:

On commence à avoir quelque chose qui commence à transmettre un message synthétique sur la nature des données. On peut néanmoins remarquer plusieurs éléments problématiques (par exemple les labels) mais aussi des éléments ne correspondant pas (les titres des axes, etc.) ou manquants (le nom du graphique…).

Comme les graphiques produits par Pandas suivent la logique très flexible de matplotlib, il est possible de les customiser. Cependant, cela demande généralement beaucoup de travail et la grammaire matplotlib n’est pas aussi normalisée que celle de ggplot en R. Si on désire rester dans l’écosystème matplotlib, il est préférable de directement utiliser seaborn, qui offre quelques arguments prêts à l’emploi. Sinon on peut basculer sur l’écosystème plotnine qui offrira une syntaxe normalisée pour modifier les différents

3 Utiliser directement seaborn

3.1 Comprendre seaborn en quelques lignes

seaborn est une interface haut niveau au dessus de matplotlib. Ce package offre un ensemble de fonctionnalités pour créer des figures ou des axes matplotlib directement depuis une fonction admettant de nombreux arguments et, si besoin d’aller plus loin dans la customisation, d’utiliser les fonctionnalités de matplotlib pour mettre à jour la figure, que ce soit par le biais de l’approche implicite ou explicite décrites précédemment.

Comme pour matplotlib, seaborn permet de faire la même figure de multiples manières. seaborn hérite de la dualité axes-figures de matplotlib et il faudra souvent jouer avec un niveau ou l’autre. La principale caractéristique de seaborn est d’offrir quelques points d’entrées standardisés, par exemple seaborn.relplot ou seaborn.catplot, et une logique d’inputs basée sur le DataFrame là où matplotlib est structurée autour du array Numpy.

La figure comporte maintenant un message mais il est encore peu lisible. Il y a plusieurs manières de faire un barplot en seaborn. Les deux principales sont :

  • sns.catplot ;
  • sns.barplot.

On propose d’utiliser sns.catplot pour cet exercice. Il s’agit d’un point d’entrée assez fréquent pour faire des graphiques d’une variable discrétisée.

3.2 Le diagramme en barre (barplot)

Exercice 2: reproduire la première figure avec seaborn
  1. Réinitialiser l’index des dataframes df1 et df2 pour avoir une colonne ‘Nom du compteur’. Réordonner les données de manière décroissante pour obtenir un graphique ordonné dans le bon sens avec seaborn.

  2. Refaire le graphique précédent avec la fonction catplot de seaborn. Pour contrôler la taille du graphique vous pouvez utiliser les arguments height et aspect.

  3. Ajouter les titres des axes et le titre du graphique pour le premier graphique

  4. Essayez de colorer en rouge l’axe des x. Vous pouvez pré-définir un style avec sns.set_style("ticks", {"xtick.color": "red"})

A l’issue de la question 2, c’est-à-dire en utilisant seaborn pour reproduire de manière minimale un barplot, on obtient :

Après quelques réglages esthétiques, à l’issue des questions 3 et 4, on obtient une figure proche de celle du portail open data parisien.

Les paramètres supplémentaires proposés à la question 4 permettent finalement d’obtenir la figure

On comprend ainsi que le boulevard de Sébastopol est le plus emprunté, ce qui ne vous suprendra pas si vous faites du vélo à Paris. Néanmoins, si vous n’êtes pas familiers avec la géographie parisienne, cela sera peu informatif pour vous, vous allez avoir besoin d’une représentation graphique supplémentaire: une carte ! Nous verrons ceci lors d’un prochain chapitre.

Exercice 2bis : reproduire la figure “Les 10 compteurs ayant comptabilisé le plus de vélos”

En suivant l’approche graduelle de l’exercice 2, refaire le graphique Les 10 compteurs ayant comptabilisé le plus de vélos avec seaborn

3.3 Un exemple d’alternative au barplot, le lollipop chart

Les diagrammes en batons (barplot) sont extrêmement communs, sans doute à cause de l’héritage d’Excel où ces graphiques sont faisables en deux clics. Néanmoins, en ce qui concerne le message à transmettre, ils sont loin d’être parfaits. Par exemple, les barres prennent beaucoup d’espace visuel ce qui peut brouiller le message à transmettre sur le rapport entre les observations.

Sur le plan sémiologique, c’est à dire sur le plan de l’efficacité du message à transmettre, les lollipop charts sont préférables : ils transmettent la même information mais avec moins de signes visuels pouvant brouiller sa compréhension.

Les lollipop chart ne sont pas parfaits non plus mais sont un peu plus efficaces pour transmettre le message. Pour en savoir plus sur les alternatives au barplot, la conférence d’Eric Mauvière pour le réseau des data scientists de la statistique publique, dont le message principal est “Désempilez vos figures” mérite le détour (disponible sur le site ssphub.netlify.app/)

Exercice 3 (optionnel) : reproduire la figure 2 avec un lollipop chart

En suivant l’approche graduelle de l’exercice 2, refaire le graphique Les 10 compteurs ayant comptabilisé le plus de vélos.

💡 Ne pas hésiter à consulter python-graph-gallery.com/ ou à demander de l’aide à ChatGPT

Text(0, 0.5, 'La somme des vélos comptabilisés sur la période sélectionnée')

4 La même figure avec plotnine

plotnine est le nouveau venu dans l’écosystème de la visualisation en Python. Cette librairie est développée par Posit, l’entreprise à l’origine de l’éditeur RStudio et de l’écosystème du tidyverse si central dans le langage R. Cette librairie vise à importer la logique de ggplot en Python c’est à dire une grammaire des graphiques normalisée, lisible et flexible héritère de Wilkinson (2012).

L’état d’esprit des habitués de ggplot2 quand ils découvrent plotnine

L’état d’esprit des habitués de ggplot2 quand ils découvrent plotnine

Dans cette approche, un graphique est vu comme une succession de couches qui, une fois superposées, donneront la figure suivante. En soi, ce principe n’est pas différent de celui de matplotlib. Néanmoins, la grammaire utilisée par plotnine est beaucoup plus intuitive et normalisée ce qui offrira beaucoup plus d’autonomie pour modifier sa figure.

La logique de ggplot (et plotnine) par Lisa (2021), image elle-même empruntée à Field (2012)

La logique de ggplot (et plotnine) par Lisa (2021), image elle-même empruntée à Field (2012)

Avec plotnine, il n’y a plus de point d’entrée dual figure-axe. Comme l’illustrent les slides ci-dessous, :

  1. On initialise une figure
  2. On met à jour les couches (layers), un niveau d’abstraction très général concernant aussi bien les données représentées que les échelles des axes ou la couleur
  3. A la fin, on peut jouer sur l’esthétique en modifiant les labels des axes, de la légende, les titres, etc.

Dérouler les slides ci-dessous ou cliquer ici pour afficher les slides en plein écran.

Exercice 4: reproduire la première figure avec plotnine

Ceci est le même exercice que l’exercice 2. L’objectif est de faire cette figure avec plotnine

5 Premières agrégations temporelles

On va maintenant se concentrer sur la dimension temporelle de notre jeu de données à travers deux approches :

  • Un diagramme en barre synthétisant l’information de notre jeu de données de manière mensuelle ;
  • Des séries instructives sur la dynamique temporelle. Cela sera l’objet de la prochaine partie.

Avant cela, nous allons enrichir ces données pour bénéficier d’un historique plus long, permettant notamment d’avoir la période Covid dans nos données, ce qui présente un intérêt du fait de la dynamique particulière du trafic dans cette période (arrêt brutal, reprise très forte…).

Voir le code pour bénéficier d’un historique plus long de données
import requests
import zipfile
import io
import os
from pathlib import Path
import pandas as pd
import geopandas as gpd

list_useful_columns = [
    "Identifiant du compteur",
    "Nom du compteur",
    "Identifiant du site de comptage",
    "Nom du site de comptage",
    "Comptage horaire",
    "Date et heure de comptage",
]


# GENERIC FUNCTION TO RETRIEVE DATA -------------------------


def download_unzip_and_read(
    url, extract_to=".", list_useful_columns=list_useful_columns
):
    """
    Downloads a zip file from the specified URL, extracts its contents, and reads the CSV file based on the filename pattern in the URL.

    Parameters:
    - url (str): The URL of the zip file to download.
    - extract_to (str): The directory where the contents of the zip file should be extracted.

    Returns:
    - df (DataFrame): The loaded pandas DataFrame from the extracted CSV file.
    """
    try:
        # Extract the file pattern from the URL (filename without the extension)
        file_pattern = url.split("/")[-1].replace("_zip/", "")

        # Send a GET request to the specified URL to download the file
        response = requests.get(url)
        response.raise_for_status()  # Ensure we get a successful response

        # Create a ZipFile object from the downloaded bytes
        with zipfile.ZipFile(io.BytesIO(response.content)) as z:
            # Extract all the contents to the specified directory
            z.extractall(path=extract_to)
            print(f"Extracted all files to {os.path.abspath(extract_to)}")

        dir_extract_to = Path(extract_to)
        # dir_extract_to = Path(f"./{file_pattern}/")

        # Look for the file matching the pattern
        csv_filename = [f.name for f in dir_extract_to.iterdir() if f.suffix == ".csv"]

        if not csv_filename:
            print(f"No file matching pattern '{file_pattern}' found.")
            return None

        # Read the first matching CSV file into a pandas DataFrame
        csv_path = os.path.join(dir_extract_to.name, csv_filename[0])
        print(f"Reading file: {csv_path}")
        df = pd.read_csv(csv_path, sep=";")

        # CONVERT TO GEOPANDAS
        df[["latitude", "longitude"]] = df["Coordonnées géographiques"].str.split(
            ",", expand=True
        )
        df["latitude"] = pd.to_numeric(df["latitude"])
        df["longitude"] = pd.to_numeric(df["longitude"])
        gdf = gpd.GeoDataFrame(
            df, geometry=gpd.points_from_xy(df.longitude, df.latitude)
        )

        # CONVERT TO TIMESTAMP
        df["Date et heure de comptage"] = (
            df["Date et heure de comptage"]
            .astype(str)
            .str.replace(r"\+.*", "", regex=True)
        )
        df["Date et heure de comptage"] = pd.to_datetime(
            df["Date et heure de comptage"], format="%Y-%m-%dT%H:%M:%S", errors="coerce"
        )
        gdf = df.loc[:, list_useful_columns]
        return gdf

    except requests.exceptions.RequestException as e:
        print(f"Error: The downloaded file has not been found: {e}")
        return None
    except zipfile.BadZipFile as e:
        print(f"Error: The downloaded file is not a valid zip file: {e}")
        return None
    except Exception as e:
        print(f"An error occurred: {e}")
        return None


def read_historical_bike_data(year):
    dataset = "comptage_velo_donnees_compteurs"
    url_comptage = f"https://opendata.paris.fr/api/datasets/1.0/comptage-velo-historique-donnees-compteurs/attachments/{year}_{dataset}_csv_zip/"
    df_comptage = download_unzip_and_read(
        url_comptage, extract_to=f"./extracted_files_{year}"
    )
    if df_comptage is None:
        url_comptage_alternative = url_comptage.replace("_csv_zip", "_zip")
        df_comptage = download_unzip_and_read(
            url_comptage_alternative, extract_to=f"./extracted_files_{year}"
        )
    return df_comptage


# IMPORT HISTORICAL DATA -----------------------------

historical_bike_data = pd.concat(
    [read_historical_bike_data(year) for year in range(2018, 2024)]
)

rename_columns_dict = {
    "Identifiant du compteur": "id_compteur",
    "Nom du compteur": "nom_compteur",
    "Identifiant du site de comptage": "id",
    "Nom du site de comptage": "nom_site",
    "Comptage horaire": "sum_counts",
    "Date et heure de comptage": "date",
}


historical_bike_data = historical_bike_data.rename(columns=rename_columns_dict)


# IMPORT LATEST MONTHS ----------------

import os
import requests
from tqdm import tqdm
import pandas as pd
import duckdb

url = "https://opendata.paris.fr/api/explore/v2.1/catalog/datasets/comptage-velo-donnees-compteurs/exports/parquet?lang=fr&timezone=Europe%2FParis"
filename = "comptage_velo_donnees_compteurs.parquet"


# DOWNLOAD FILE --------------------------------

# Perform the HTTP request and stream the download
response = requests.get(url, stream=True)

if not os.path.exists(filename):
    # Perform the HTTP request and stream the download
    response = requests.get(url, stream=True)

    # Check if the request was successful
    if response.status_code == 200:
        # Get the total size of the file from the headers
        total_size = int(response.headers.get("content-length", 0))

        # Open the file in write-binary mode and use tqdm to show progress
        with open(filename, "wb") as file, tqdm(
            desc=filename,
            total=total_size,
            unit="B",
            unit_scale=True,
            unit_divisor=1024,
        ) as bar:
            # Write the file in chunks
            for chunk in response.iter_content(chunk_size=1024):
                if chunk:  # filter out keep-alive chunks
                    file.write(chunk)
                    bar.update(len(chunk))
    else:
        print(f"Failed to download the file. Status code: {response.status_code}")
else:
    print(f"The file '{filename}' already exists.")


# READ FILE AND CONVERT TO PANDAS
query = """
SELECT id_compteur, nom_compteur, id, sum_counts, date 
FROM read_parquet('comptage_velo_donnees_compteurs.parquet')
"""

# READ WITH DUCKDB AND CONVERT TO PANDAS
df = duckdb.sql(query).df()

df.head(3)


# PUT THEM TOGETHER ----------------------------

historical_bike_data["date"] = historical_bike_data["date"].dt.tz_localize(None)

df["date"] = df["date"].dt.tz_localize(None)

historical_bike_data = historical_bike_data.loc[
    historical_bike_data["date"] < df["date"].min()
]

df = pd.concat([historical_bike_data, df])

Pour commencer, reproduisons la troisième figure qui est, encore une fois, un barplot. Ici, sur le plan sémiologique, ce n’est pas justifier d’utiliser un barplot, une simple série suffirait à fournir une information similaire.

La première question du prochain exerice implique une première rencontre avec une donnée temporelle à travers une opération assez classique en séries temporelles : changer le format d’une date pour pouvoir faire une agrégation à un pas de temps plus large.

Exercice 5: barplot des comptages mensuels
  1. Créer une variable month dont le format respecte, par exemple, le schéma 2019-08 grâce à la bonne option de la méthode dt.to_period
  2. Appliquer les conseils précédents pour construire et améliorer graduellement un graphique afin d’obtenir une figure similaire à la 3e production sur la page de l’open data parisien. Faire cette figure d’abord depuis début 2022 puis sur toute la période de notre historique
  3. Question optionnelle: représenter la même information sous forme de lollipop
month value
0 2022-01 29.489743
1 2022-02 34.567832

La figure avec les données depuis début 2022 aura cet aspect si elle a été construite avec plotnine:

Avec seaborn, elle ressemblera plutôt à ceci:

Text(0.5, 1.0, 'Moyenne mensuelle des comptages vélos')

Si vous préférez représenter cela sous forme de lollipop3:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
File /opt/conda/lib/python3.12/site-packages/plotnine/mapping/evaluation.py:223, in evaluate(aesthetics, data, env)
    222 try:
--> 223     new_val = env.eval(col, inner_namespace=data)
    224 except Exception as e:

File /opt/conda/lib/python3.12/site-packages/plotnine/mapping/_env.py:69, in Environment.eval(self, expr, inner_namespace)
     68 code = _compile_eval(expr)
---> 69 return eval(
     70     code, {}, StackedLookup([inner_namespace] + self.namespaces)
     71 )

File <string-expression>:1

NameError: name 'value' is not defined

The above exception was the direct cause of the following exception:

PlotnineError                             Traceback (most recent call last)
File /opt/conda/lib/python3.12/site-packages/IPython/core/formatters.py:925, in IPythonDisplayFormatter.__call__(self, obj)
    923 method = get_real_method(obj, self.print_method)
    924 if method is not None:
--> 925     method()
    926     return True

File /opt/conda/lib/python3.12/site-packages/plotnine/ggplot.py:141, in ggplot._ipython_display_(self)
    134 def _ipython_display_(self):
    135     """
    136     Display plot in the output of the cell
    137 
    138     This method will always be called when a ggplot object is the
    139     last in the cell.
    140     """
--> 141     self._display()

File /opt/conda/lib/python3.12/site-packages/plotnine/ggplot.py:175, in ggplot._display(self)
    172     save_format = "png"
    174 buf = BytesIO()
--> 175 self.save(buf, format=save_format, verbose=False)
    176 display_func = get_display_function(format)
    177 display_func(buf.getvalue())

File /opt/conda/lib/python3.12/site-packages/plotnine/ggplot.py:663, in ggplot.save(self, filename, format, path, width, height, units, dpi, limitsize, verbose, **kwargs)
    615 def save(
    616     self,
    617     filename: Optional[str | Path | BytesIO] = None,
   (...)
    626     **kwargs: Any,
    627 ):
    628     """
    629     Save a ggplot object as an image file
    630 
   (...)
    661         Additional arguments to pass to matplotlib `savefig()`.
    662     """
--> 663     sv = self.save_helper(
    664         filename=filename,
    665         format=format,
    666         path=path,
    667         width=width,
    668         height=height,
    669         units=units,
    670         dpi=dpi,
    671         limitsize=limitsize,
    672         verbose=verbose,
    673         **kwargs,
    674     )
    676     with plot_context(self).rc_context:
    677         sv.figure.savefig(**sv.kwargs)

File /opt/conda/lib/python3.12/site-packages/plotnine/ggplot.py:612, in ggplot.save_helper(self, filename, format, path, width, height, units, dpi, limitsize, verbose, **kwargs)
    609 if dpi is not None:
    610     self.theme = self.theme + theme(dpi=dpi)
--> 612 figure = self.draw(show=False)
    613 return mpl_save_view(figure, fig_kwargs)

File /opt/conda/lib/python3.12/site-packages/plotnine/ggplot.py:272, in ggplot.draw(self, show)
    270 self = deepcopy(self)
    271 with plot_context(self, show=show):
--> 272     self._build()
    274     # setup
    275     self.figure, self.axs = self.facet.setup(self)

File /opt/conda/lib/python3.12/site-packages/plotnine/ggplot.py:362, in ggplot._build(self)
    358 layout.setup(layers, self)
    360 # Compute aesthetics to produce data with generalised
    361 # variable names
--> 362 layers.compute_aesthetics(self)
    364 # Transform data using all scales
    365 layers.transform(scales)

File /opt/conda/lib/python3.12/site-packages/plotnine/layer.py:457, in Layers.compute_aesthetics(self, plot)
    455 def compute_aesthetics(self, plot: ggplot):
    456     for l in self:
--> 457         l.compute_aesthetics(plot)

File /opt/conda/lib/python3.12/site-packages/plotnine/layer.py:260, in layer.compute_aesthetics(self, plot)
    253 def compute_aesthetics(self, plot: ggplot):
    254     """
    255     Return a dataframe where the columns match the aesthetic mappings
    256 
    257     Transformations like 'factor(cyl)' and other
    258     expression evaluation are  made in here
    259     """
--> 260     evaled = evaluate(self.mapping._starting, self.data, plot.environment)
    261     evaled_aes = aes(**{str(col): col for col in evaled})
    262     plot.scales.add_defaults(evaled, evaled_aes)

File /opt/conda/lib/python3.12/site-packages/plotnine/mapping/evaluation.py:226, in evaluate(aesthetics, data, env)
    224 except Exception as e:
    225     msg = _TPL_EVAL_FAIL.format(ae, col, str(e))
--> 226     raise PlotnineError(msg) from e
    228 try:
    229     evaled[ae] = new_val

PlotnineError: "Could not evaluate the 'y' mapping: 'value' (original error: name 'value' is not defined)"
/opt/conda/lib/python3.12/site-packages/IPython/lib/pretty.py:787: FutureWarning: Using repr(plot) to draw and show the plot figure is deprecated and will be removed in a future version. Use plot.show().
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
File /opt/conda/lib/python3.12/site-packages/plotnine/mapping/evaluation.py:223, in evaluate(aesthetics, data, env)
    222 try:
--> 223     new_val = env.eval(col, inner_namespace=data)
    224 except Exception as e:

File /opt/conda/lib/python3.12/site-packages/plotnine/mapping/_env.py:69, in Environment.eval(self, expr, inner_namespace)
     68 code = _compile_eval(expr)
---> 69 return eval(
     70     code, {}, StackedLookup([inner_namespace] + self.namespaces)
     71 )

File <string-expression>:1

NameError: name 'value' is not defined

The above exception was the direct cause of the following exception:

PlotnineError                             Traceback (most recent call last)
File /opt/conda/lib/python3.12/site-packages/IPython/core/formatters.py:711, in PlainTextFormatter.__call__(self, obj)
    704 stream = StringIO()
    705 printer = pretty.RepresentationPrinter(stream, self.verbose,
    706     self.max_width, self.newline,
    707     max_seq_length=self.max_seq_length,
    708     singleton_pprinters=self.singleton_printers,
    709     type_pprinters=self.type_printers,
    710     deferred_pprinters=self.deferred_printers)
--> 711 printer.pretty(obj)
    712 printer.flush()
    713 return stream.getvalue()

File /opt/conda/lib/python3.12/site-packages/IPython/lib/pretty.py:419, in RepresentationPrinter.pretty(self, obj)
    408                         return meth(obj, self, cycle)
    409                 if (
    410                     cls is not object
    411                     # check if cls defines __repr__
   (...)
    417                     and callable(_safe_getattr(cls, "__repr__", None))
    418                 ):
--> 419                     return _repr_pprint(obj, self, cycle)
    421     return _default_pprint(obj, self, cycle)
    422 finally:

File /opt/conda/lib/python3.12/site-packages/IPython/lib/pretty.py:787, in _repr_pprint(obj, p, cycle)
    785 """A pprint that just redirects to the normal repr function."""
    786 # Find newlines and replace them with p.break_()
--> 787 output = repr(obj)
    788 lines = output.splitlines()
    789 with p.group():

File /opt/conda/lib/python3.12/site-packages/plotnine/ggplot.py:131, in ggplot.__repr__(self)
    125 msg = (
    126     "Using repr(plot) to draw and show the plot figure is "
    127     "deprecated and will be removed in a future version. "
    128     "Use plot.show()."
    129 )
    130 warn(msg, category=FutureWarning, stacklevel=2)
--> 131 self.show()
    132 return f"<Figure Size: ({W} x {H})>"

File /opt/conda/lib/python3.12/site-packages/plotnine/ggplot.py:150, in ggplot.show(self)
    143 def show(self):
    144     """
    145     Show plot using the matplotlib backend set by the user
    146 
    147     Users should prefer this method instead of printing or repring
    148     the object.
    149     """
--> 150     self._display() if is_inline_backend() else self.draw(show=True)

File /opt/conda/lib/python3.12/site-packages/plotnine/ggplot.py:175, in ggplot._display(self)
    172     save_format = "png"
    174 buf = BytesIO()
--> 175 self.save(buf, format=save_format, verbose=False)
    176 display_func = get_display_function(format)
    177 display_func(buf.getvalue())

File /opt/conda/lib/python3.12/site-packages/plotnine/ggplot.py:663, in ggplot.save(self, filename, format, path, width, height, units, dpi, limitsize, verbose, **kwargs)
    615 def save(
    616     self,
    617     filename: Optional[str | Path | BytesIO] = None,
   (...)
    626     **kwargs: Any,
    627 ):
    628     """
    629     Save a ggplot object as an image file
    630 
   (...)
    661         Additional arguments to pass to matplotlib `savefig()`.
    662     """
--> 663     sv = self.save_helper(
    664         filename=filename,
    665         format=format,
    666         path=path,
    667         width=width,
    668         height=height,
    669         units=units,
    670         dpi=dpi,
    671         limitsize=limitsize,
    672         verbose=verbose,
    673         **kwargs,
    674     )
    676     with plot_context(self).rc_context:
    677         sv.figure.savefig(**sv.kwargs)

File /opt/conda/lib/python3.12/site-packages/plotnine/ggplot.py:612, in ggplot.save_helper(self, filename, format, path, width, height, units, dpi, limitsize, verbose, **kwargs)
    609 if dpi is not None:
    610     self.theme = self.theme + theme(dpi=dpi)
--> 612 figure = self.draw(show=False)
    613 return mpl_save_view(figure, fig_kwargs)

File /opt/conda/lib/python3.12/site-packages/plotnine/ggplot.py:272, in ggplot.draw(self, show)
    270 self = deepcopy(self)
    271 with plot_context(self, show=show):
--> 272     self._build()
    274     # setup
    275     self.figure, self.axs = self.facet.setup(self)

File /opt/conda/lib/python3.12/site-packages/plotnine/ggplot.py:362, in ggplot._build(self)
    358 layout.setup(layers, self)
    360 # Compute aesthetics to produce data with generalised
    361 # variable names
--> 362 layers.compute_aesthetics(self)
    364 # Transform data using all scales
    365 layers.transform(scales)

File /opt/conda/lib/python3.12/site-packages/plotnine/layer.py:457, in Layers.compute_aesthetics(self, plot)
    455 def compute_aesthetics(self, plot: ggplot):
    456     for l in self:
--> 457         l.compute_aesthetics(plot)

File /opt/conda/lib/python3.12/site-packages/plotnine/layer.py:260, in layer.compute_aesthetics(self, plot)
    253 def compute_aesthetics(self, plot: ggplot):
    254     """
    255     Return a dataframe where the columns match the aesthetic mappings
    256 
    257     Transformations like 'factor(cyl)' and other
    258     expression evaluation are  made in here
    259     """
--> 260     evaled = evaluate(self.mapping._starting, self.data, plot.environment)
    261     evaled_aes = aes(**{str(col): col for col in evaled})
    262     plot.scales.add_defaults(evaled, evaled_aes)

File /opt/conda/lib/python3.12/site-packages/plotnine/mapping/evaluation.py:226, in evaluate(aesthetics, data, env)
    224 except Exception as e:
    225     msg = _TPL_EVAL_FAIL.format(ae, col, str(e))
--> 226     raise PlotnineError(msg) from e
    228 try:
    229     evaled[ae] = new_val

PlotnineError: "Could not evaluate the 'y' mapping: 'value' (original error: name 'value' is not defined)"

Enfin, sur l’ensemble de la période, la série prendra plutôt cette forme:

6 Première série temporelle

Il est plus commun de représenter les données ayant une dimension temporelle sous la forme de série que de barres empilées.

Exercice 5: barplot des comptages mensuels
  1. Créer une variable day qui transforme l’horodatage en format journalier du type 2021-05-01 avec dt.day.
  2. Reproduire la figure de la page d’open data

7 Des graphiques réactifs grâce aux librairies Javascript

7.1 L’écosystème disponible depuis Python

L’inconvénient des figures figées construites avec matplotlib ou plotnine est que celles-ci ne permettent pas d’interaction avec le lecteur. Toute l’information doit donc être contenue dans la figure ce qui peut la rendre difficile à lire. Si la figure est bien faite, avec différents niveaux d’information, cela peut bien fonctionner.

Il est néanmoins plus simple, grâce aux technologies web, de proposer des visualisations à plusieurs niveaux. Un premier niveau d’information, celui du coup d’oeil, peut suffire à assimiler les principaux messages de la visualisation. Ensuite, un comportement plus volontaire de recherche d’information secondaire peut permettre d’en savoir plus. Les visualisations réactives, qui sont maintenant la norme dans le monde de la dataviz, permettent ce type d’approche : le lecteur d’une visualisation peut passer sa souris à la recherche d’information complémentaire (par exemple les valeurs exactes) ou cliquer pour faire apparaître des informations complémentaires sur la visualisation ou autour.

Ces visualisations reposent sur le même triptyque que l’ensemble de l’écosystème web : HTML, CSS et JavaScript. Les utilisateurs de Python ne vont jamais manipuler directement ces langages, qui demandent une certaine expertise, mais vont utiliser des librairies au niveau de R qui génèreront automatiquement tout le code HTML, CSS et JavaScript permettant de créer la figure.

Il existe plusieurs écosystèmes Javascript mis à disposition des développeurs.euses par le biais de Python. Les deux principales librairies sont Plotly, associée à l’écosystème Javascript du même nom, et Altair, associée à l’écosystème Vega et Altair en Javascript4. Pour permettre aux pythonistes de découvrir la librairie Javascript émergente Observable Plot, l’ingénieur de recherche français Julien Barnier a développé pyobsplot une librairie Python permettant d’utiliser cet écosystème depuis Python.

L’interactivité ne doit pas juste être un gadget n’apportant pas de lisibilité supplémentaire, voire la détériorant. Il est rare de pouvoir se contenter de la figure produite sans avoir à fournir un travail supplémentaire pour la rendre efficace.

7.1.1 La librairie Plotly

Le package Plotly est une surcouche à la librairie Javascript Plotly.js qui permet de créer et manipuler des objets graphiques de manière très flexible afin de produire des objets réactifs sans avoir à recourir à Javascript.

Le point d’entrée recommandé est le module plotly.express (documentation ici) qui offre une approche intuitive pour construire des graphiques pouvant être modifiés a posteriori si besoin (par exemple pour customiser les axes).

Visualiser les figures produites par Plotly

Dans un notebook Jupyter classique, les lignes suivantes de code permettent d’afficher le résultat d’une commande Plotly sous un bloc de code :

Pour JupyterLab, l’extension jupyterlab-plotly s’avère nécessaire:

!jupyter labextension install jupyterlab-plotly

7.2 Réplication de l’exemple précédent avec Plotly

Les modules suivants seront nécessaires pour construire des graphiques avec plotly:

import plotly
import plotly.express as px
Exercice 7: un barplot avec Plotly

L’objectif est de reconstuire le premier diagramme en barre rouge avec Plotly.

  1. Réalisez le graphique en utilisant la fonction adéquate avec plotly.express et…
    • Ne pas prendre le thème par défaut mais un à fond blanc, pour avoir un résultat ressemblant à celui proposé sur le site de l’open-data.
    • Pour la couleur rouge, vous pouvez utiliser l’argument color_discrete_sequence.
    • Ne pas oublier de nommer les axes
    • Pensez à la couleur du texte de l’axe inférieur
  2. Tester un autre thème, à fond sombre. Pour les couleurs, faire un groupe stockant les trois plus fortes valeurs puis les autres.

La première question permet de construire le graphique suivant :

Alors qu’avec le thème sombre (question 2), on obtient :

7.3 La librairie altair

Comme ggplot/plotnine, Vega est un écosystème graphique visant à proposer une implémentation de la grammaire des graphiques de Wilkinson (2012). La syntaxe de Vega est donc basée sur un principe déclaratif: on déclare une construction par couches et transformations de données progressives.

A l’origine, Vega est basée sur une syntaxe JSON, d’où son lien fort avec Javascript. Néanmoins, il existe une API Python qui permet de faire ce type de figures interactives nativement en Python. Pour comprendre la logique de construction d’un code altair, voici comment répliquer la figure précédente avec:

Voir l’architecture d’une figure altair
import altair as alt

color_scale = alt.Scale(domain=[True, False], range=["green", "red"])

fig2 = (
    alt.Chart(df1)
1    .mark_bar()
2    .encode(
        x=alt.X(
            "average(sum_counts):Q",
            title="Moyenne du comptage par heure sur la période sélectionnée",
3        ),
        y=alt.Y("nom_compteur:N", sort="-x", title=""),
        color=alt.Color("top:N", scale=color_scale, legend=alt.Legend(title="Top")),
        tooltip=[
            alt.Tooltip("nom_compteur:N", title="Nom du compteur"),
            alt.Tooltip("sum_counts:Q", title="Moyenne horaire"),
4        ],
    )
5    .properties(title="Les 10 compteurs avec la moyenne horaire la plus élevée")
    .configure_view(strokeOpacity=0)
)

fig2.interactive()
1
On déclare d’abord le dataframe qui sera utilisé, comme nous le faisions avec ggplot(df) avec plotnine. Puis le type de figure désirée (ici un diagramme en barre, mark_bar dans la grammaire d’altair)
2
On définit notre couche principale avec encode. Celle-ci peut accepter simplement des noms de colonnes ou des constructeurs plus complexes, comme ici
3
On définit un constructeur pour notre axe des x, à la fois pour gérer l’échelle des valeurs mais aussi les paramètres de celle-ci (labels, etc.). Ici, on définit l’axe des x comme une valeur continue (:Q), moyenne de sum_counts pour chaque valeur de \(y\). Cette moyenne n’est pas indispensable, on aurait pu se contenter d’écrire sum_counts:Q voire même sum_counts mais c’est pour illustrer la gestion des transformations de données dans altair
4
Le tooltip nous permet de gérer l’interactivité de notre figure.
5
Les propriétés viennent à la fin de notre déclaration pour finaliser la figure

Informations additionnelles

environment files have been tested on.

Latest built version: 2024-11-20

Python version used:

'3.12.6 | packaged by conda-forge | (main, Sep 30 2024, 18:08:52) [GCC 13.3.0]'
Package Version
affine 2.4.0
aiobotocore 2.15.1
aiohappyeyeballs 2.4.3
aiohttp 3.10.8
aioitertools 0.12.0
aiosignal 1.3.1
alembic 1.13.3
altair 5.4.1
aniso8601 9.0.1
annotated-types 0.7.0
appdirs 1.4.4
archspec 0.2.3
asttokens 2.4.1
attrs 24.2.0
babel 2.16.0
bcrypt 4.2.0
beautifulsoup4 4.12.3
black 24.8.0
blinker 1.8.2
blis 0.7.11
bokeh 3.5.2
boltons 24.0.0
boto3 1.35.23
botocore 1.35.23
branca 0.7.2
Brotli 1.1.0
cachetools 5.5.0
cartiflette 0.0.2
Cartopy 0.24.1
catalogue 2.0.10
cattrs 24.1.2
certifi 2024.8.30
cffi 1.17.1
charset-normalizer 3.3.2
click 8.1.7
click-plugins 1.1.1
cligj 0.7.2
cloudpathlib 0.20.0
cloudpickle 3.0.0
colorama 0.4.6
comm 0.2.2
commonmark 0.9.1
conda 24.9.1
conda-libmamba-solver 24.7.0
conda-package-handling 2.3.0
conda_package_streaming 0.10.0
confection 0.1.5
contextily 1.6.2
contourpy 1.3.0
cryptography 43.0.1
cycler 0.12.1
cymem 2.0.8
cytoolz 1.0.0
dask 2024.9.1
dask-expr 1.1.15
databricks-sdk 0.33.0
debugpy 1.8.6
decorator 5.1.1
Deprecated 1.2.14
diskcache 5.6.3
distributed 2024.9.1
distro 1.9.0
docker 7.1.0
duckdb 0.10.1
en-core-web-sm 3.7.1
entrypoints 0.4
et_xmlfile 2.0.0
exceptiongroup 1.2.2
executing 2.1.0
fastexcel 0.11.6
fastjsonschema 2.20.0
fiona 1.10.1
Flask 3.0.3
folium 0.17.0
fontawesomefree 6.6.0
fonttools 4.54.1
frozendict 2.4.4
frozenlist 1.4.1
fsspec 2023.12.2
funcy 2.0
gensim 4.3.2
geographiclib 2.0
geopandas 1.0.1
geoplot 0.5.1
geopy 2.4.1
gitdb 4.0.11
GitPython 3.1.43
google-auth 2.35.0
graphene 3.3
graphql-core 3.2.4
graphql-relay 3.2.0
graphviz 0.20.3
great-tables 0.12.0
greenlet 3.1.1
gunicorn 22.0.0
h2 4.1.0
hpack 4.0.0
htmltools 0.6.0
hyperframe 6.0.1
idna 3.10
imageio 2.36.0
importlib_metadata 8.5.0
importlib_resources 6.4.5
inflate64 1.0.0
ipykernel 6.29.5
ipython 8.28.0
itsdangerous 2.2.0
jedi 0.19.1
Jinja2 3.1.4
jmespath 1.0.1
joblib 1.4.2
jsonpatch 1.33
jsonpointer 3.0.0
jsonschema 4.23.0
jsonschema-specifications 2024.10.1
jupyter-cache 1.0.0
jupyter_client 8.6.3
jupyter_core 5.7.2
kaleido 0.2.1
kiwisolver 1.4.7
langcodes 3.5.0
language_data 1.3.0
lazy_loader 0.4
libmambapy 1.5.9
locket 1.0.0
lxml 5.3.0
lz4 4.3.3
Mako 1.3.5
mamba 1.5.9
mapclassify 2.8.1
marisa-trie 1.2.1
Markdown 3.6
markdown-it-py 3.0.0
MarkupSafe 2.1.5
matplotlib 3.9.2
matplotlib-inline 0.1.7
mdurl 0.1.2
menuinst 2.1.2
mercantile 1.2.1
mizani 0.11.4
mlflow 2.16.2
mlflow-skinny 2.16.2
msgpack 1.1.0
multidict 6.1.0
multivolumefile 0.2.3
munkres 1.1.4
murmurhash 1.0.10
mypy-extensions 1.0.0
narwhals 1.14.1
nbclient 0.10.0
nbformat 5.10.4
nest_asyncio 1.6.0
networkx 3.3
nltk 3.9.1
numexpr 2.10.1
numpy 1.26.4
opencv-python-headless 4.10.0.84
openpyxl 3.1.5
opentelemetry-api 1.16.0
opentelemetry-sdk 1.16.0
opentelemetry-semantic-conventions 0.37b0
OWSLib 0.28.1
packaging 24.1
pandas 2.2.3
paramiko 3.5.0
parso 0.8.4
partd 1.4.2
pathspec 0.12.1
patsy 0.5.6
Pebble 5.0.7
pexpect 4.9.0
pickleshare 0.7.5
pillow 10.4.0
pip 24.2
platformdirs 4.3.6
plotly 5.24.1
plotnine 0.13.6
pluggy 1.5.0
polars 1.8.2
preshed 3.0.9
prometheus_client 0.21.0
prometheus_flask_exporter 0.23.1
prompt_toolkit 3.0.48
protobuf 4.25.3
psutil 6.0.0
ptyprocess 0.7.0
pure_eval 0.2.3
py7zr 0.20.8
pyarrow 17.0.0
pyarrow-hotfix 0.6
pyasn1 0.6.1
pyasn1_modules 0.4.1
pybcj 1.0.2
pycosat 0.6.6
pycparser 2.22
pycryptodomex 3.21.0
pydantic 2.9.2
pydantic_core 2.23.4
Pygments 2.18.0
pyLDAvis 3.4.1
PyNaCl 1.5.0
pynsee 0.1.8
pyogrio 0.10.0
pyOpenSSL 24.2.1
pyparsing 3.1.4
pyppmd 1.1.0
pyproj 3.7.0
pyshp 2.3.1
PySocks 1.7.1
python-dateutil 2.9.0
python-dotenv 1.0.1
python-magic 0.4.27
pytz 2024.1
pyu2f 0.1.5
pywaffle 1.1.1
PyYAML 6.0.2
pyzmq 26.2.0
pyzstd 0.16.2
querystring_parser 1.2.4
rasterio 1.4.2
referencing 0.35.1
regex 2024.9.11
requests 2.32.3
requests-cache 1.2.1
retrying 1.3.4
rich 13.9.4
rpds-py 0.21.0
rsa 4.9
ruamel.yaml 0.18.6
ruamel.yaml.clib 0.2.8
s3fs 2023.12.2
s3transfer 0.10.2
scikit-image 0.24.0
scikit-learn 1.5.2
scipy 1.13.0
seaborn 0.13.2
setuptools 74.1.2
shapely 2.0.6
shellingham 1.5.4
six 1.16.0
smart-open 7.0.5
smmap 5.0.0
sortedcontainers 2.4.0
soupsieve 2.5
spacy 3.7.5
spacy-legacy 3.0.12
spacy-loggers 1.0.5
SQLAlchemy 2.0.35
sqlparse 0.5.1
srsly 2.4.8
stack-data 0.6.2
statsmodels 0.14.4
tabulate 0.9.0
tblib 3.0.0
tenacity 9.0.0
texttable 1.7.0
thinc 8.2.5
threadpoolctl 3.5.0
tifffile 2024.9.20
toolz 1.0.0
topojson 1.9
tornado 6.4.1
tqdm 4.66.5
traitlets 5.14.3
truststore 0.9.2
typer 0.13.1
typing_extensions 4.12.2
tzdata 2024.2
Unidecode 1.3.8
url-normalize 1.4.3
urllib3 1.26.20
wasabi 1.1.3
wcwidth 0.2.13
weasel 0.4.1
webdriver-manager 4.0.2
websocket-client 1.8.0
Werkzeug 3.0.4
wheel 0.44.0
wordcloud 1.9.3
wrapt 1.16.0
xgboost 2.1.1
xlrd 2.0.1
xyzservices 2024.9.0
yarl 1.13.1
yellowbrick 1.5
zict 3.0.0
zipp 3.20.2
zstandard 0.23.0

View file history

SHA Date Author Description
cbe6459 2024-11-12 07:24:15 lgaliana Revoir quelques abstracts
9cf2bde 2024-10-18 15:49:47 lgaliana Reconstruction complète du chapitre de cartographie
c9a3f96 2024-09-24 15:18:59 Lino Galiana Finir la reprise du chapitre matplotlib (#555)
46f038a 2024-09-23 15:28:36 Lino Galiana Mise à jour du premier chapitre sur les figures (#553)
59f5803 2024-09-22 16:41:46 Lino Galiana Update bike count source data for visualisation tutorial (#552)
06d003a 2024-04-23 10:09:22 Lino Galiana Continue la restructuration des sous-parties (#492)
005d89b 2023-12-20 17:23:04 Lino Galiana Finalise l’affichage des statistiques Git (#478)
3fba612 2023-12-17 18:16:42 Lino Galiana Remove some badges from python (#476)
cf91965 2023-12-02 13:15:18 linogaliana href in dataviz chapter
1f23de2 2023-12-01 17:25:36 Lino Galiana Stockage des images sur S3 (#466)
09654c7 2023-11-14 15:16:44 Antoine Palazzolo Suggestions Git & Visualisation (#449)
889a71b 2023-11-10 11:40:51 Antoine Palazzolo Modification TP 3 (#443)
df01f01 2023-10-10 15:55:04 Lino Galiana Menus automatisés (#432)
a771183 2023-10-09 11:27:45 Antoine Palazzolo Relecture TD2 par Antoine (#418)
154f09e 2023-09-26 14:59:11 Antoine Palazzolo Des typos corrigées par Antoine (#411)
057dae1 2023-09-20 16:28:46 Lino Galiana Chapitre visualisation (#406)
1d0780c 2023-09-18 14:49:59 Lino Galiana Problème rendu chapitre matplotlib (#405)
a8f90c2 2023-08-28 09:26:12 Lino Galiana Update featured paths (#396)
3bdf3b0 2023-08-25 11:23:02 Lino Galiana Simplification de la structure 🤓 (#393)
78ea2cb 2023-07-20 20:27:31 Lino Galiana Change titles levels (#381)
8df7cb2 2023-07-20 17:16:03 linogaliana Change link
f0c583c 2023-07-07 14:12:22 Lino Galiana Images viz (#371)
f21a24d 2023-07-02 10:58:15 Lino Galiana Pipeline Quarto & Pages 🚀 (#365)
f2e8922 2023-06-12 14:54:20 Lino Galiana Remove spoiler shortcode (#364)
2dc82e7 2022-10-18 22:46:47 Lino Galiana Relec Kim (visualisation + API) (#302)
03babc6 2022-10-03 16:53:47 Lino Galiana Parler des règles de la dataviz (#291)
89c10c3 2022-08-25 08:30:22 Lino Galiana Adaptation du shortcode spoiler en notebook (#257)
494a85a 2022-08-05 14:49:56 Lino Galiana Images featured ✨ (#252)
d201e3c 2022-08-03 15:50:34 Lino Galiana Pimp la homepage ✨ (#249)
2812ef4 2022-07-07 15:58:58 Lino Galiana Petite viz sympa des prenoms (#242)
a4e2426 2022-06-16 19:34:18 Lino Galiana Improve style (#238)
02ed1e2 2022-06-09 19:06:05 Lino Galiana Règle problème plotly (#235)
299cff3 2022-06-08 13:19:03 Lino Galiana Problème code JS suite (#233)
5698e30 2022-06-03 18:28:37 Lino Galiana Finalise widget (#232)
7b9f27b 2022-06-03 17:05:15 Lino Galiana Essaie régler les problèmes widgets JS (#231)
12965ba 2022-05-25 15:53:27 Lino Galiana :launch: Bascule vers quarto (#226)
9c71d6e 2022-03-08 10:34:26 Lino Galiana Plus d’éléments sur S3 (#218)
4f67528 2021-12-12 08:37:21 Lino Galiana Improve website appareance (#194)
66a5276 2021-11-23 16:13:20 Lino Galiana Relecture partie visualisation (#181)
2a8809f 2021-10-27 12:05:34 Lino Galiana Simplification des hooks pour gagner en flexibilité et clarté (#166)
2f4d390 2021-09-02 15:12:29 Lino Galiana Utilise un shortcode github (#131)
2e4d586 2021-09-02 12:03:39 Lino Galiana Simplify badges generation (#130)
80877d2 2021-06-28 11:34:24 Lino Galiana Ajout d’un exercice de NLP à partir openfood database (#98)
6729a72 2021-06-22 18:07:05 Lino Galiana Mise à jour badge onyxia (#115)
4cdb759 2021-05-12 10:37:23 Lino Galiana :sparkles: :star2: Nouveau thème hugo :snake: :fire: (#105)
7f9f97b 2021-04-30 21:44:04 Lino Galiana 🐳 + 🐍 New workflow (docker 🐳) and new dataset for modelization (2020 🇺🇸 elections) (#99)
0a0d034 2021-03-26 20:16:22 Lino Galiana Ajout d’une section sur S3 (#97)
a5b7c99 2020-10-05 15:07:09 Lino Galiana Donne lien vers données compteurs
18be8f4 2020-10-01 17:08:53 Lino Galiana Intégration de box inspirées du thème pydata sphinx (#58)
5ac3cbe 2020-09-28 18:59:24 Lino Galiana Continue la partie graphiques (#54)
94f39ec 2020-09-24 21:25:32 Lino Galiana quelques mots sur vizu
Retour au sommet

Les références

Field, A. 2012. « Discovering Statistics Using R ». Sage.
Lisa, DeBruine. 2021. « psyTeachR Book Template ». https://github.com/psyteachr/template/.
Wilkinson, Leland. 2012. The grammar of graphics. Springer.

Notes de bas de page

  1. Ce chapitre sera construit autour de l’écosystème Quarto. En attendant ce chapitre, vous pouvez consulter la documentation exemplaire de cet écosystème et pratiquer, ce sera le meilleur moyen de découvrir.↩︎

  2. Heureusement, comme il existe un énorme corpus de code en ligne utilisant matplotlib, les assistants de code comme ChatGPT ou Github Copilot sont précieux pour construire un graphique à partir d’instructions.↩︎

  3. J’ai retiré la couleur sur l’axe des ordonnées qui, je trouve, apporte peu à la figure voire dégrade la compréhension du message.↩︎

  4. Le nom de ces librairies est inspiré de la constellation du triangle d’été dont Véga et Altair sont deux membres.↩︎

Citation

BibTeX
@book{galiana2023,
  author = {Galiana, Lino},
  title = {Python pour la data science},
  date = {2023},
  url = {https://pythonds.linogaliana.fr/},
  doi = {10.5281/zenodo.8229676},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
Galiana, Lino. 2023. Python pour la data science. https://doi.org/10.5281/zenodo.8229676.