InfluxDB - Visualisation de données avec le client Python et Plotly

Voici un exemple de lecture de données avec le client InfluxDB Python suivi d'une visualisation des résultats avec la librairie graphique Plotly.

Données utilisées

Nous utilisons ici les données sur la qualité de l'air mesurée dans les stations RATP Châtelet et Franklin D. Roosevelt écrites en base lors du billet InfluxDB - Écriture de données au format CSV avec la commande 'influx write'.

Installation du client InfluxDB Python

pip install influxdb-client

Code source

import influxdb_client
import pandas as pd
import plotly.graph_objects as go
from influxdb_client.client.write_api import SYNCHRONOUS
from plotly.subplots import make_subplots

bucket = "ratp_bucket"
org = "ratp_org"
token = "z_4Ph73ntH1mobyqm6OJ5d6nYsM0qY8rZYIJs6bZpS0ioDW1VpujRG5l67xXV4dgAFlBgQB9681wPaft2Fp5cw=="
url = "http://localhost:8086"

client = influxdb_client.InfluxDBClient(url=url, token=token, org=org)

query = 'from(bucket:"ratp_bucket") \
          |> range(start: 2022-07-01, stop: 2022-08-31) \
          |> filter(fn:(r) => r._measurement == "qualite-air") \
          |> filter(fn:(r) => r.station == "chatelet") \
          |> filter(fn:(r) => r._field == "TEMP" or r._field == "HUMI") \
          |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")'

df = client.query_api().query_data_frame(org=org, query=query)

# modification de deux températures et humidités incohérentes par rapport aux valeurs voisines
df.loc[df["_time"] == "2022-07-31T00:00:00+02:00", "TEMP"] = float("NaN")
df.loc[df["_time"] == "2022-08-03T19:00:00+02:00", "TEMP"] = float("NaN")
df.loc[df["_time"] == "2022-07-31T00:00:00+02:00", "HUMI"] = float("NaN")
df.loc[df["_time"] == "2022-08-03T19:00:00+02:00", "HUMI"] = float("NaN")

# création du diagramme
url = "https://data.ratp.fr/explore/dataset/qualite-de-lair-mesuree-dans-la-station-chatelet/information/"
title = f"<b>Température & Humidité Station Châtelet\
<br>Juillet-Août 2022</b>\
<br>Source:<a href='{url}'>https://data.ratp.fr/</a>"

fig = make_subplots(specs=[[{"secondary_y": True}]])

# courbe de température sur l'axe y primaire
fig.add_trace(
    go.Scatter(
        mode="lines",
        x=df["_time"],
        y=df["TEMP"],
        name="Température en °C",
        line=dict(color="red", width=1),
    ),
    secondary_y=False,
)

# courbe d'humidité sur l'axe y secondaire
fig.add_trace(
    go.Scatter(
        mode="lines",
        x=df["_time"],
        y=df["HUMI"],
        name="Humidité en %",
        line=dict(color="blue", width=1),
    ),
    secondary_y=True,
)

# centrage du titre, couleur d'arrière plan, style et placement de la légende, hover label
fig.update_layout(
    title=title,
    title_x=0.5,
    plot_bgcolor="white",
    legend=dict(yanchor="top", y=1.1, xanchor="right", x=0.90, bgcolor="#efefef"),
    hovermode="x unified",
    hoverlabel=dict(
        bgcolor="white",
        bordercolor="red",
        namelength=500,
    ),
)

# légendes des 3 axes
fig.update_xaxes(
    title_text="Date",
    showgrid=False,
    showline=True,
    linecolor="black",
    linewidth=1,
)

fig.update_yaxes(
    title_text="Température en °C",
    secondary_y=False,
    color="red",
    showgrid=False,
    showline=True,
    linecolor="red",
    linewidth=1,
)

fig.update_yaxes(
    title_text="Humidité en %",
    secondary_y=True,
    color="blue",
    showgrid=False,
    showline=True,
    linecolor="blue",
    linewidth=1,
)

# affichage et sauvegarde
fig.show()
fig.write_html("influxdb-plotly.html")

client.close()

Diagramme généré