3.2. TP Pandas: traitement de données météo#
%matplotlib inline
# bibliotheques de base
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from validation.validation import check_function,liste_functions,info_etudiant
from IPython.display import Markdown, display
def printmd(string):
display(Markdown(string))
# test si numero étudiant spécifier
try: NUMERO_ETUDIANT
except NameError: NUMERO_ETUDIANT = None
if type(NUMERO_ETUDIANT) is not int :
NOM, PRENOM, NUMERO_ETUDIANT = info_etudiant()
printmd("**Etudiant** {} {} id={}".format(NOM,PRENOM,NUMERO_ETUDIANT))
# année
_num_ = str(NUMERO_ETUDIANT)
_an_ = (int(_num_[-2]) + int(_num_[-1]))%10 + 2010
_ville_ = chr(int(_num_[-4]) + int(_num_[-3]) + ord('A'))
printmd("**Annee {} et Ville commençant par {}**".format(_an_,_ville_))
3.2.1. Objectif#
On se propose à travers ce projet de realiser des statistiques sur des relevès d’une station meteo lors d’une annee. Nous utiliserons pour cela la bibliothèque PANDAS de Python.
Dans un premier temps, vous devez télécharger le fichier de données SYNOP sur le site :
La documentation sur le format de ces données est ici
Pour choisir le fichier, vous considérerez l’année donnée ci-dessus et une ville commençant par la lettre affichée.
Si la lettre ou l’année n’a pas de données, considérez l’année la plus proche et la lettre la plus proche.
3.2.2. Lecture des données (attention format)#
lire le fichier de données et le transformer en dataframe data1 (attention le séparateur utiliser dans le fichier est un « ; »). On affichera l’information du dataframe avec la fonction info()
## BEGIN SOLUTION
## END SOLUTION
assert isinstance(data1,pd.DataFrame)
assert 'Température' in data1.columns
assert 'Point de rosée' in data1.columns
assert 'Humidité' in data1.columns
3.2.2.1. Selection des données utiles#
A partir du fichier .csv, nous nous interesserons aux donnees suivantes : temperature, hauteur de neige fraiche, precipitations dans la derniere heure, direction du vent moyen 10 mn et vitesse du vent moyen 10 mn.
A partir du dataframe précédent, créer un dataframe data contenant uniquement les données utiles. Affichez l’information du dataframe avec la fonction info()
## BEGIN SOLUTION
## END SOLUTION
assert isinstance(data,pd.DataFrame)
assert 'Date' in data.columns
assert 'Température' in data.columns
assert 'Précipitations dans la dernière heure' in data.columns
3.2.2.2. renommage des colonnes#
Pour simplifier la programmation, renommer les colonnes en utilisant les noms suivants:
['date','temp','neige','pluie','dir','vent']
## BEGIN SOLUTION
## END SOLUTION
assert(len(data['date'] == len(data['temp'])))
assert(len(data['date'] == len(data['neige'])))
assert(len(data['date'] == len(data['pluie'])))
assert(len(data['date'] == len(data['dir'])))
assert(len(data['date'] == len(data['vent'])))
3.2.2.3. conversion des dates#
convertir la colonne date qui contient des dates sous forme de chaine de caractères en type datetime python en utilisant la fonction to_datetime
## BEGIN SOLUTION
## END SOLUTION
assert(isinstance(data['date'][0],pd._libs.tslib.Timestamp))
3.2.2.4. indexation par la date#
Apres la conversion, indexer data avec cette colonne date pour avoir les donnéees en fonction de la date
## BEGIN SOLUTION
## END SOLUTION
assert(isinstance(data.index,pd.core.indexes.datetimes.DatetimeIndex))
3.2.2.5. prise en compte de la localisation#
pour convertir les dates avec la bonne localisation, executer le code suivant
# inutile dans la version actuelle
#data=data.tz_localize('Europe/Paris')
data.head()
3.2.2.6. conversion temperature en °C#
Convertir la colonne temp en °Celsius
## BEGIN SOLUTION
## END SOLUTION
assert data.dtypes['temp'] == 'float64'
assert(data['temp'].max() < 50)
assert(data['temp'].min() > -40)
3.2.2.7. Trace des données#
tracer les graphes de la température, hauteur d’eau et de neige et vitesse du vent en fonction de la date.
## BEGIN SOLUTION
## END SOLUTION
3.2.3. Calcul sur les données#
3.2.3.1. hauteur cumulée#
Calculer et afficher la hauteur cumulée sur un an de la hauteur d’eau et neige (avec les bonnes unités)
3.2.3.2. Vitesse maximal du vent avec la date#
Déterminer la vitesse du vent maximale et la date pour laquelle celle-ci est atteinte
## BEGIN SOLUTION
## END SOLUTION
3.2.4. Regroupement des données#
Nous souhaitons dans cette partie analyser les donnees par mois. Nous representerons les résultats sous la forme d’histogrammes.
3.2.4.1. temperature moyenne par mois#
dans une variable temperatures calculer la température moyenne par mois indexer par le numéro du mois
on tracera l’histogramme et on calculera la valeur min et max en affichant le mois
## BEGIN SOLUTION
# affichage
## END SOLUTION
assert temperatures.dtypes[0] == 'float64'
assert temperatures.count()[0] == 12
assert temperatures.min()[0] > -40.0 and temperatures.max()[0] < 50.0
assert temperatures.index[0] == 1 and temperatures.index[11] == 12
3.2.4.2. hauteur d’eau cumulée par mois#
dans une variable pluie calculer la hauteur d’eau cumulée (avec la bonne unité) par mois indexée par le numero du mois
on tracera l’histogramme et on calculer la valeur max (avec les bonnes unités)
## BEGIN SOLUTION
## END SOLUTION
assert pluie.dtypes[0] == 'float64'
assert pluie.count()[0] == 12
assert pluie.min()[0] >= 0.0 and pluie.max()[0] <=10000.0
assert pluie.index[0] == 1 and pluie.index[11] == 12
3.2.4.3. Hauteur de neige cumulée par mois#
dans une variable neige calculer la hauteur de neige cumulée (avec la bonne unité) par mois indexée par le numero du mois
on tracera l’histogramme et on calculer la valeur max
## BEGIN SOLUTION
## END SOLUTION
assert neige.dtypes[0] == 'float64'
assert neige.count()[0] == 12
assert neige.min()[0] >= 0.0 and neige.max()[0] <=10.0
assert neige.index[0] == 1 and neige.index[11] == 12
3.2.4.4. Comparaison avec la moyenne climatique#
les normales climatiques entre 1981 et 2010 en France sont repertoriees sur le site :
Les valeurs sont données pour chaque mois.
Tracer la normale climatique et la température moyenne par mois
## BEGIN SOLUTION
## END SOLUTION
3.2.4.5. Calcul du nbre de jours / mois ou T> Tmoy#
créer un dictionnaire njours qui pour chaque mois donne le nombre de jours où la temperature moyenne est au-dessus des normales climatiques.
le nom des mopis est le suivant:
"Jan.","Fev.","Mars","Avr.","Mai","Juin","Juil.","Aout","Sep.","Oct.","Nov.","Dec."
On tracera le résultat sous la forme d’un histogramme
## BEGIN SOLUTION
#
## END SOLUTION
assert type(njours) == dict
assert type(njours['Jan.']) == int
assert njours['Fev.'] >= 0 and njours['Mars'] <= 31
3.2.5. Traitement des données#
Nous souhaitons dans cette partie caracteriser la direction du vent par quadrants (N,W,S,E).
Creer une colonne quad indiquant pour chaque date la direction du vent par quadrant (on effectura la conversion de l’angle en degré / nord en direction “N”,”W”,”S”,”E”)
## BEGIN SOLUTION
## END SOLUTION
assert data.dtypes['quad'] == object
for i in range(data.count()['quad']):
assert data['quad'][i] in['N','S','W','E']
3.2.5.1. calcul du nbre de jours en % sur l’année / direction du vent#
Représenter sous la forme d’un histogramme, le pourcentage associé à chaque direction du vent au cours de l’annee.
## BEGIN SOLUTION
## END SOLUTION
3.2.5.2. Conclusion et Commentaire#
Ecrire dans la cellule suivante votre commentaire sur cette analyse des données climatiques.
On utilisera pour cela la notation markdown avec le plan suivant
## Méthode
décrire l'objectif et la méthode d'analyse des résultats
## Analyse
décrire l'analyse des résultats obtenus
## Conclusion
écrire votre conclusion
3.2.6. FIN#