Plotly - Température dans les stations Châtelet et Franklin D. Roosevelt

À partir des données ouvertes (open data) de la RATP sur la qualité de l'air dans des stations, voici comment visualiser avec Pandas et Plotly les températures relevées en juillet-août 2022 dans les stations Châtelet et Franklin D. Roosevelt.

La RATP propose des données ouvertes sur son site Open Data RATP. On y trouve en particulier des données sur la qualité de l'air mesurée dans les stations Auber, Châtelet, Châtelet RER A, Franklin D. Roosevelt et Nation.

Nous avons récupéré sur les pages Qualité de l'air mesurée dans la station Châtelet et Qualité de l'air mesurée dans la station Franklin D. Roosevelt les données au format CSV sauvegardées respectivement dans les fichiers :

Le code source Python qui suit commence par changer le séparateur de fichier et le séparateur décimal, puis nettoyer les données en supprimant des valeurs non numériques (les fichiers contiennent des 'ND', des '<2'...). Ceci est réalisé par la fonction clean_csv(input_csv_name). On obtient alors deux fichiers CSV nettoyés qui seront également utiles pour des billets à venir :

Code source

import os
import pandas as pd
import plotly.express as px
import re


def clean_csv(input_csv_name):
    name, ext = os.path.splitext(input_csv_name)
    output_csv_name = name + "_clean.csv"

    input_file = open(input_csv_name, "r")
    output_file = open(output_csv_name, "w")

    for line in input_file:
        # remplacement du séparateur décimal
        new_line = line.replace(",", ".")

        # remplacement du séparateur de valeurs
        new_line = new_line.replace(";", ",")

        # suppression des valeurs non numériques
        new_line = new_line.replace("ND", "")
        new_line = re.sub("<[0-9]*", "", new_line)
        new_line = re.sub("[0-9]*>", "", new_line)

        output_file.write(new_line)

    input_file.close()
    output_file.close()

    return output_csv_name


headers = ["dtime", "no", "no2", "pm10", "co2", "temp", "humi"]

# nettoyage des fichiers CSV sources
output_csv_name_1 = clean_csv("data_chatelet.csv")
output_csv_name_2 = clean_csv("data_franklin-d-roosevelt.csv")

# dataframe pour Châtelet
df1 = pd.read_csv(output_csv_name_1, header=1, names=headers)
df1.insert(1, "station", "Châtelet")

# dataframe pour Roosevelt
df2 = pd.read_csv(output_csv_name_2, header=1, names=headers)
df2.insert(1, "station", "Franklin D. Roosevelt")

# concaténation des deux dataframes
df = pd.concat([df1, df2])
del [df1, df2]

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

# filtrage du dataframe pour ne retenir que les mois de juillet et août
filtered_df = df.loc[(df["dtime"] >= "2022-07-01") & (df["dtime"] <= "2022-08-31")]

# création du diagramme
url = "https://data.ratp.fr/"
title = f"<b>Température juillet-août 2022</b><br>Source:<a href='{url}'>{url}</a>"

fig = px.line(
    filtered_df,
    x="dtime",
    y="temp",
    color="station",
    markers=False,
    title=title,
    labels={
        "dtime": "<b>Date</b>",
        "temp": "<b>Température °C</b>",
        "station": "<b>Stations</b>",
    },
)

# centrage du titre, suppression du quadrillage et placement de la légende en haut à droite
fig.update_layout(
    title_x=0.5,
    plot_bgcolor="#fff",
    xaxis=dict(showgrid=False, linecolor="#000"),
    yaxis=dict(showgrid=False, linecolor="#000"),
    legend=dict(yanchor="top", y=0.99, xanchor="right", x=0.99, bgcolor="#efefef"),
)

# ajout d'annotations pour indiquer les températures min et max
min_value = filtered_df["temp"].min()
min_days = filtered_df[filtered_df["temp"] == min_value]["dtime"].values
max_value = filtered_df["temp"].max()
max_days = filtered_df[filtered_df["temp"] == max_value]["dtime"].values

for day in max_days:
    fig.add_annotation(x=day, y=max_value, text=f"<b>Max : {max_value} °C</b>")

for day in min_days:
    fig.add_annotation(x=day, y=min_value, text=f"<b>Min : {min_value} °C</b>")

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

Diagramme généré