Plotly - Température 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")