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()