For AI agents: the complete documentation index is available at https://docs.ovhcloud.com/fr/llms.txt, the full documentation bundle is available at https://docs.ovhcloud.com/fr/llms-full.txt, and this page is available as Markdown at https://docs.ovhcloud.com/fr/guides/public-cloud/data-platform/tutorials-velib-availability-superset-dashboard.md.

Construire un dashboard de disponibilité des Vélib' dans Superset

Voir en Markdown

Découvrez comment construire un dashboard Superset sur l'historique des Vélib' : vélos disponibles maintenant, rythme de la journée, stations à problèmes et tendances jour après jour

Objectif

Ce guide vous explique comment construire un dashboard Superset sur l'historique des Vélib' : où trouver un vélo maintenant, comment le réseau respire au fil de la journée, quelles stations sont souvent vides ou pleines, et comment chaque journée se compare aux autres.

C'est la deuxième partie de « Collecter chaque heure la disponibilité des Vélib' en SQL ». Superset interroge le Lakehouse via Trino : tout le SQL de cette page est donc en dialecte Trino.

Prérequis

Pour suivre ce guide, vous devez :

Ce que vous allez construire

À la fin de cette partie, votre dashboard ressemble à ceci :

L'onglet Now du dashboard Vélib' availability, avec les quatre tuiles de chiffres clés, la carte des stations par statut et le tableau des stations vides

Données cartographiques © les contributeurs d'OpenStreetMap. Données Vélib' © Smovengo / Syndicat Autolib' Vélib' Métropole, publiées par la Ville de Paris sous Open Database License (ODbL).

OngletContenuDataset
Now4 tuiles, carte des stations, tableau des stations videsstation_current
Daily rhythmvélos heure par heure, journée type, vélos électriques et mécaniques, deux heatmapsnetwork_hourly
Stationsles plus souvent vides, les plus souvent pleines, bornes hors service par communestation_profile
Trendsheures-stations vides par jour, chiffres quotidiensvelib_daily

Chaque graphique suit le même chemin dans Superset : Charts > + Chart, choisissez le dataset et le type de graphique, renseignez les paramètres, cliquez sur Create chart, puis sur Save avec le nom du graphique et le dashboard Vélib' availability. Le premier graphique enregistré crée le dashboard ; vous disposez les graphiques dans ses onglets à l'étape 5.

Info

Remarque : vos graphiques ressembleront aux captures, mais pas avec les mêmes valeurs : les chiffres dépendent du moment et de la durée de votre collecte. L'onglet Now est complet dès la première collecte. Les onglets Daily rhythm, Stations et Trends ne prennent une forme semblable que quelques jours plus tard : d'ici là, les courbes sont courtes, les heatmaps ont des cellules vides et les classements bougent encore.

En pratique

Étape 1 : construire l'onglet Now

Ces graphiques utilisent le dataset station_current : une ligne par station, à la dernière collecte.

Chiffres clés

Les quatre tuiles utilisent le type de graphique Big Number.

TuileMetricSubheaderNumber format
Bikes available nowOnglet Simple : colonne bikes, agrégat SUMbikes in stations, latest collection,d
Electric bikesCustom SQL : SUM(ebike) * 1e0 / NULLIF(SUM(bikes), 0)of available bikes are electric.1%
Empty stationsCustom SQL : SUM(CASE WHEN bikes = 0 AND is_open THEN 1 ELSE 0 END)open stations with no bike,d
Docks out of serviceCustom SQL : SUM(CASE WHEN is_open THEN out_of_service_docks ELSE 0 END)docks neither free nor holding a bike,d

Valeurs attendues, au moment de la rédaction : environ 19 000 vélos, environ 40 % de vélos électriques, environ 100 stations vides et plus de 1 000 bornes hors service. Les chiffres changent à chaque collecte.

1e0 évite une division entière, qui renverrait 0. Une station fermée n'est pas comptée comme vide, et dans une station fermée toutes les bornes paraissent indisponibles : les deux dernières tuiles ne comptent que les stations ouvertes.

Le graphique Big Number Bikes available now avec la métrique SUM(bikes), qui affiche 18 931

Stations par statut (Stations by status)

La carte montre chaque station, colorée selon son état à la dernière collecte.

ParamètreValeur
Chart typedeck.gl Scatterplot
Longitude & Latitudelon et lat
Row limit10000
Ignore null locationscoché
Categorical Colorstatus
Minimum Radius3
Tooltip contentsvide
Customize tooltips templatevide

Utilisez deck.gl Scatterplot : c'est le seul type de carte qui dessine un point par station avec une couleur par catégorie. MapBox demande une clé Mapbox, donc un compte tiers. Les cartes en grille et en hexagones regroupent les stations dans des cellules, et perdent la station.

Le graphique deck.gl Scatterplot Stations by status avec Categorical Color sur status, et la carte de Paris avec un point par station coloré en Closed, Available, Empty ou Full

Données cartographiques © les contributeurs d'OpenStreetMap.

Stations vides en ce moment (Empty stations right now)

Le tableau donne les détails que la carte ne peut pas afficher dans une infobulle.

ParamètreValeur
Chart typeTable
Query modeRaw records
Columnsstation_name, commune, capacity, free_docks, out_of_service_docks
Filtersstatus égal à Empty
Orderingcapacity, décroissant
Row limit250

Raw records affiche une ligne par station, sans regroupement. Le tri par capacité fait remonter les plus grandes stations vides : elles laissent le plus d'usagers sans vélo.

Le tableau contient autant de lignes que la tuile Empty stations en affiche. Pour chaque station, free_docks plus out_of_service_docks égale capacity : une station vide n'a aucun vélo, donc chaque borne est soit libre, soit hors service.

Le tableau Empty stations right now en mode Raw records, filtré sur le statut Empty et trié par capacité

Étape 2 : construire l'onglet Daily rhythm

Ces graphiques utilisent le dataset network_hourly : une ligne par heure pour tout le réseau. Ils se remplissent au fil de la collecte.

Vélos en station, heure par heure (Bikes in stations, hour by hour)

Le réseau respire : les vélos disponibles baissent quand ils roulent, et reviennent la nuit.

ParamètreValeur
Chart typeLine Chart
X-axiscollected_hour_paris
Time grainHour
MetricsOnglet Simple : colonne bikes, agrégat MAX
Filterscollected_hour_paris : Last week

network_hourly contient déjà une ligne par heure : l'agrégat ne regroupe rien, et MAX renvoie la valeur de l'heure. Seule exception : la nuit du passage à l'heure d'hiver, deux heures UTC tombent sur la même heure de Paris, et MAX garde alors la plus haute des deux au lieu de les additionner. Le filtre garde les sept derniers jours, soit 168 points, pour que le graphique reste lisible à mesure que la collecte s'allonge.

Le graphique en courbe Bikes in stations, hour by hour sur la dernière semaine, avec un pic au-dessus de 20 000 vélos chaque nuit et une baisse chaque jour

Ce graphique montre ce qui s'est réellement passé, jour après jour. Le suivant fait la moyenne de tous les jours en une journée type.

Journée type (Typical day)

La journée moyenne, heure par heure, avec une courbe pour les jours de semaine et une pour le week-end.

ParamètreValeur
Chart typeLine Chart
X-axishour_of_day
MetricsOnglet Simple : colonne bikes, agrégat AVG
Dimensionsday_type
X-axis sortvaleur de l'axe, croissant

L'axe X est l'heure de la journée, de 0 à 23 : toutes les collectes de 8 h sont regroupées, quel que soit le jour, et la moyenne donne le nombre type de vélos disponibles à 8 h. La courbe Weekend apparaît d'elle-même dès que la collecte couvre un samedi.

En semaine, la courbe baisse à l'heure de pointe du matin, vers 9 h, et plus encore à celle du soir, vers 18 h.

Le graphique en courbe Typical day de 0 à 23 heures, avec une courbe pour la semaine et une pour le week-end, toutes deux au plus bas vers 18 h

Vélos électriques et mécaniques (Electric and mechanical bikes)

Deux courbes, une par type de vélo, pour comparer leurs variations.

ParamètreValeur
Chart typeLine Chart
X-axiscollected_hour_paris
Time grainHour
MetricsOnglet Simple : MAX de mechanical, puis MAX de ebike
Filterscollected_hour_paris : Last week

La courbe des vélos électriques varie bien plus que celle des mécaniques, entre la nuit et les heures de pointe.

Le graphique en courbe Electric and mechanical bikes sur la dernière semaine, où la courbe des vélos électriques varie bien plus que celle des mécaniques

Quand est-il difficile de trouver un vélo ? (When is it hard to find a bike?)

Une heatmap du jour de la semaine en fonction de l'heure, colorée selon la part de stations vides. Les cellules les plus sombres sont les créneaux où il est le plus difficile de trouver un vélo.

ParamètreValeur
Chart typeHeatmap
X-axishour_of_day
Y-axisday_of_week
MetricCustom SQL : AVG(empty_stations * 1e0 / stations)
Sort X AxisAxis ascending
Sort Y AxisAxis descending
Normalize Acrossheatmap
Value Format.1%

La métrique divise les stations vides par les stations ouvertes : la part reste comparable quand quelques stations ferment ou rouvrent. 1e0 évite une division entière.

Triez les deux axes par leur valeur : l'ordre par défaut suit les résultats de la requête, et Metric ascending trierait les heures selon leur part de stations vides. Axis ascending range les heures de 0 à 23, et Axis descending sur l'axe Y place le lundi en haut, comme un calendrier.

En semaine, les cellules les plus sombres arrivent en fin de matinée, entre 9 h et 11 h, avec jusqu'à environ 10 % de stations vides. Les nuits et le week-end sont les plus clairs.

Cela ne contredit pas la journée type, où le moins de vélos sont garés vers 18 h. Le soir, il y a moins de vélos en station, mais le matin, ils sont plus mal répartis : la heatmap suivante montre que les stations pleines ont elles aussi leur pic en fin de matinée. Certaines stations se vident pendant que d'autres se remplissent, et le nombre de stations vides mesure ce déséquilibre, pas le nombre de vélos.

La heatmap When is it hard to find a bike? des jours de la semaine en fonction des heures, plus sombre en semaine entre 9 h et 11 h

Quand est-il difficile de rendre un vélo ? (When is it hard to return a bike?)

La heatmap miroir : la part de stations ouvertes sans borne libre, où les usagers ne peuvent pas rendre leur vélo.

Le plus rapide est de partir du graphique précédent : changez la métrique, cliquez sur Save, sélectionnez Save as... et saisissez le nouveau nom.

ParamètreValeur
Chart typeHeatmap
X-axishour_of_day
Y-axisday_of_week
MetricCustom SQL : AVG(full_stations * 1e0 / stations)
Sort X AxisAxis ascending
Sort Y AxisAxis descending
Normalize Acrossheatmap
Value Format.1%

Gardez les mêmes tris que pour la première heatmap, pour que les deux se lisent cellule par cellule. Chaque heatmap a sa propre échelle de couleurs, de son minimum à son maximum : comparez les valeurs, pas seulement les couleurs.

Les stations pleines n'ont pas leur pic aux mêmes heures que les stations vides : les cellules les plus sombres arrivent la nuit en semaine, puis en fin de matinée, avec jusqu'à environ 5,5 % de stations pleines.

La heatmap des stations pleines, plus sombre les nuits de semaine et en fin de matinée en semaine

Étape 3 : construire l'onglet Stations

Ces graphiques utilisent le dataset station_profile : une ligne par station, sur toute la collecte. Tous trois utilisent le type de graphique Bar Chart, en orientation Horizontal : elle laisse de la place pour les noms.

Les plus souvent vides (Most often empty)

Les dix stations qui passent le plus de temps sans aucun vélo.

ParamètreValeur
X-axisstation_name
MetricsOnglet Simple : colonne empty_hours_pct, agrégat MAX
Row limit10
X-axis sortpar la métrique, décroissant
OrientationHorizontal, dans l'onglet Customize
Axis titleShare of hours with no bike (%)

station_profile contient déjà une ligne par station : MAX renvoie la part de la station.

Le graphique classe les dix stations selon leur part d'heures sans vélo.

Le graphique en barres horizontales Most often empty, qui classe dix stations selon leur part d'heures sans vélo

Les plus souvent pleines (Most often full)

Les dix stations où les usagers ne peuvent pas rendre leur vélo, faute de borne libre.

ParamètreValeur
X-axisstation_name
MetricsOnglet Simple : colonne full_hours_pct, agrégat MAX
Row limit10
X-axis sortpar la métrique, décroissant
OrientationHorizontal, dans l'onglet Customize
Axis titleShare of hours with no free dock (%)

Le plus rapide est de partir du graphique précédent : changez la métrique et le titre de l'axe, cliquez sur Save, sélectionnez Save as... et saisissez le nouveau nom. Le graphique classe les dix stations selon leur part d'heures sans borne libre.

Le graphique en barres horizontales qui classe dix stations selon leur part d'heures sans borne libre

Bornes hors service par commune (Docks out of service by commune)

Une vue de maintenance : où se trouvent les bornes en panne, rapportées au nombre de bornes de chaque commune.

ParamètreValeur
X-axiscommune
MetricsCustom SQL : SUM(avg_out_of_service_docks) * 1e0 / SUM(capacity)
FiltersCustom SQL, clause HAVING : COUNT(*) >= 5
Row limit15
X-axis sortpar la métrique, décroissant
OrientationHorizontal, dans l'onglet Customize
Number format.1%

Une part plutôt qu'un nombre de bornes : les communes comptent des nombres de stations très différents, et les plus grandes écraseraient les autres en valeur absolue. Le filtre HAVING s'applique après le regroupement par commune, et écarte les communes de moins de 5 stations, où une seule borne en panne les ferait monter en tête.

Le graphique classe les communes selon leur part de bornes hors service.

Le graphique en barres horizontales Docks out of service by commune avec le filtre HAVING COUNT(*) >= 5, qui classe quinze communes selon leur part de bornes hors service

Ces graphiques utilisent le dataset velib_daily : une ligne par jour pour tout le réseau. Ils demandent plusieurs jours de collecte.

Heures-stations vides par jour (Empty station-hours per day)

Une barre par jour : le total des heures passées vides par l'ensemble des stations, un indicateur de la difficulté à trouver un vélo ce jour-là.

ParamètreValeur
Chart typeBar Chart
X-axisday
Time grainDay
MetricsOnglet Simple : colonne empty_station_hours, agrégat MAX
Dimensionsday_type
FiltersCustom SQL, clause WHERE : observed_hours >= 23

Seuls les jours complets comptent : un jour avec quelques heures de collecte aurait moins d'heures vides, et ne serait pas comparable. Le seuil de 23 heures plutôt que 24 tolère une heure manquée. La dimension day_type colore différemment la semaine et le week-end : le week-end reste bien en dessous de la semaine.

De nombreux facteurs font varier ces chiffres d'un jour à l'autre : la météo (la pluie et le froid éloignent les usagers du vélo), les vacances scolaires, les jours fériés, les grèves ou perturbations des transports en commun (qui envoient plus d'usagers vers les Vélib') et les grands événements. Un jour férié, comme le 11 novembre, apparaît comme un jour de semaine, mais devrait ressembler à un dimanche. Comparez des jours semblables, et lisez une évolution sur plusieurs jours plutôt que sur une seule barre.

Le graphique en barres Empty station-hours per day, avec les jours de semaine entre environ 1 300 et 2 000 heures-stations vides et le week-end plus bas

Chiffres quotidiens (Daily figures)

Le tableau complet des chiffres quotidiens, pour lire les valeurs exactes derrière les graphiques.

ParamètreValeur
Chart typeTable
Query modeRaw records
Columnsday, day_type, observed_hours, min_bikes, max_bikes, daily_swing, avg_fill_rate_pct, empty_station_hours, peak_empty_stations
Orderingday, décroissant
Row limit100
Show cell barsdécoché, dans l'onglet Customize
Timestamp format%Y-%m-%d, dans l'onglet Customize

Contrairement au graphique précédent, le tableau garde les jours incomplets : la colonne observed_hours montre quels jours sont complets, et révèle un jour avec des collectes manquantes. Le premier jour de collecte, qui commence à midi sur la capture, et le jour en cours affichent moins de 24 heures observées.

En semaine, le réseau passe d'environ 20 000 vélos garés la nuit à environ 16 000 à 17 000 à l'heure la plus chargée : quelque 3 000 à 5 000 vélos roulent au pic.

Le tableau Daily figures en mode Raw records, une ligne par jour avec les heures observées, le plus petit et le plus grand nombre de vélos et l'écart de la journée

Étape 5 : assembler le dashboard

  1. Ouvrez Dashboards, puis le dashboard Vélib' availability, et cliquez sur Edit dashboard.

  2. Depuis Layout elements, ajoutez un composant Tabs avec 4 onglets : Now, Daily rhythm, Stations et Trends.

  3. Depuis Charts, placez les graphiques dans chaque onglet :

    OngletGraphiques, dans l'ordreDisposition
    NowBikes available now, Electric bikes, Empty stations, Docks out of service, Stations by status, Empty stations right nowles quatre tuiles sur une ligne, puis la carte et le tableau en pleine largeur
    Daily rhythmBikes in stations, hour by hour, Typical day, Electric and mechanical bikes, When is it hard to find a bike?, When is it hard to return a bike?la chronologie en pleine largeur, la journée type et les vélos électriques côte à côte, puis les deux heatmaps en pleine largeur
    StationsMost often empty, Most often full, Docks out of service by communeles deux classements côte à côte, puis les communes en pleine largeur
    TrendsEmpty station-hours per day, Daily figuresle graphique en pleine largeur, puis le tableau
  4. Cliquez sur Save.

L'onglet Daily rhythm du dashboard, avec la chronologie heure par heure, la journée type et les vélos électriques côte à côte, et les deux heatmaps

Ce que vous avez construit

Vous disposez d'un dashboard en quatre onglets qui transforme un historique brut des Vélib' en réponses : où trouver un vélo maintenant, quand le réseau est sous tension, quelles stations font le plus souvent défaut à leurs usagers, et comment chaque journée se compare aux autres.

À partir de là, vous pouvez ajouter des filtres de dashboard sur commune, ou appliquer le même pipeline à une autre API publique qui ne donne qu'un état actuel. Pour un autre dashboard Superset construit sur la Data Platform, consultez « Construire un dashboard des ventes d'une boutique en ligne dans Superset ».

Aller plus loin

Pour une formation ou une assistance technique sur la mise en œuvre de nos solutions, contactez votre commercial ou consultez la page Professional Services pour obtenir un devis et faire analyser votre projet par nos experts.

Posez vos questions, faites-nous part de vos commentaires et interagissez directement avec l’équipe qui développe la Data Platform sur le canal Discord dédié.

Si vous avez besoin d'une assistance concernant vos services OVHcloud, créez une demande depuis notre centre d'aide.

Rejoignez notre communauté d'utilisateurs.

Cette page vous a-t-elle aidé ?