Commit f7823dc7 authored by Matthieu Boileau's avatar Matthieu Boileau
Browse files

Major in 05

parent f8061421
Pipeline #17075 passed with stages
in 1 minute and 36 seconds
......@@ -17,4 +17,6 @@ exos/sous_paquet/noel.py
exos/sous_paquet2/deco.py
!exos/mon_module.py
# 05
today_stras.py
test_module.py
\ No newline at end of file
%% Cell type:markdown id: tags:
# Microprojet
![](fig/python-logo.png)
- Utiliser les modules de la bibliothèque standard pour récupérer des données via un service web.
- Manipuler les dictionnaires et les chaînes de caractères
- Utiliser la bibliothèque de tracés graphiques matplotlib
- Utiliser un IDE (Spyder)
- Exécuter un fichier script
- Gérer les arguments de la ligne de commande
- Exécuter un fichier script en gérant les arguments de la ligne de commande
%% Cell type:markdown id: tags:
## Exercice
Exploiter les données du site [http://www.prevision-meteo.ch](http://www.prevision-meteo.ch) pour tracer l'évolution horaire de la température à Strasbourg aujourd'hui.
Exploiter les données du site <https://www.prevision-meteo.ch> pour tracer l'évolution horaire de la température à Strasbourg aujourd'hui.
![](fig/icon.png)
%% Cell type:markdown id: tags:
### Ouverture du fichier de prévisions
Le site [https://www.prevision-meteo.ch](https://www.prevision-meteo.ch) fournit des prévisions sous forme de fichier au format [json](https://fr.wikipedia.org/wiki/JavaScript_Object_Notation). On veut récupérer les données relatives à Strasbourg avec la méthode `urlopen()` du module `urllib.request`.
Le site <https://www.prevision-meteo.ch> fournit des prévisions sous forme de fichier au format [json](https://fr.wikipedia.org/wiki/JavaScript_Object_Notation). On veut récupérer les données relatives à Strasbourg avec la méthode `urlopen()` du module `urllib.request`.
%% Cell type:code id: tags:
```
``` python
%config InlineBackend.figure_format = 'retina'
%matplotlib inline
from urllib.request import urlopen
jsonfile_url = "https://www.prevision-meteo.ch/services/json/Strasbourg"
try:
f = urlopen(jsonfile_url, timeout=10) # open url
except Exception:
print("Le téléchargement a échoué : on lit une version locale.")
f = open("exos/Strasbourg.json")
```
%% Cell type:markdown id: tags:
### Chargement du fichier json ouvert
%% Cell type:markdown id: tags:
La méthode `json.loads()` permet de charger un fichier json comme un dictionnaire python :
%% Cell type:code id: tags:
```
``` python
import json
jsondict = json.loads(f.read()) # Read JSON file
```
%% Cell type:markdown id: tags:
### Exploration des données
On commence naïvement par afficher le contenu du fichier :
%% Cell type:code id: tags:
```
``` python
print(type(jsondict))
print(jsondict)
```
%% Cell type:markdown id: tags:
On essaie de faire mieux en affichant uniquement les clés du dictionnaire :
%% Cell type:code id: tags:
```
``` python
for k in jsondict:
print(repr(k))
```
%% Cell type:markdown id: tags:
On est intéressé par le temps d'aujourd'hui :
%% Cell type:code id: tags:
```
``` python
day = jsondict['fcst_day_0']
print(day)
```
%% Cell type:markdown id: tags:
Là aussi, on cherche les clés :
%% Cell type:code id: tags:
```
``` python
for k in day:
print(repr(k))
```
%% Cell type:markdown id: tags:
Vérifions qu'il s'agit d'aujourd'hui :
%% Cell type:code id: tags:
```
``` python
print(day['day_long'], day['date'])
```
%% Cell type:markdown id: tags:
C'est bon !
Maintenant, une entrée particulière nous intéresse :
%% Cell type:code id: tags:
```
``` python
day_hd = day['hourly_data']
for k in day_hd:
print(repr(k))
```
%% Cell type:markdown id: tags:
Regardons ce que contient une `hourly_data` :
%% Cell type:code id: tags:
```
``` python
for k in day_hd['8H00']:
print(repr(k))
```
%% Cell type:markdown id: tags:
La clé qui nous intéresse est la chaîne `'TMP2m'` qui correspond à la température à 2m du sol.
%% Cell type:code id: tags:
```
``` python
hour = '12H00'
print(f"Aujourd'hui à {hour}, il fera : {day_hd[hour]['TMP2m']} deg. C.")
```
%% Cell type:markdown id: tags:
Sauver ces lignes de commandes dans le fichier `today_stras.py` en allant de l'exécution 1 au compteur d'exécution courant indiqué dans la cellule de code ci-dessus `In [XX]`. Dans le cas présent :
%% Cell type:code id: tags:
```
``` python
# Décommenter la ligne ci-dessous
%save today_stras.py 1-12
%save today_stras.py 1-10
```
%% Cell type:markdown id: tags:
### Tracé de la température
1. Ouvrir le fichier `today_stras.py` dans Spyder et nettoyer les `print` inutiles.
2. Exécutez le code dans Spyder et utilisez la fenêtre "Variable explorer" en haut à droite pour parcourir les données de votre dictionnaire.
3. Extraire la liste des couples `(hour, temperature)` où :
- `hour` est un entier
- `temperature` est un flottant
4. ordonner la liste selon les heures croissantes
5. convertir la liste en un *numpy array* `t` avec la méthode `numpy.array()`
6. Transposer `t` pour obtenir le tableau `[[array of hours], [array of temperatures]]`
7. réaliser un tracé matplotlib en suivant [ce tutoriel](http://matplotlib.org/users/pyplot_tutorial.html) ou en intégrant les lignes de code suivantes :
7. réaliser un tracé matplotlib en suivant [ce tutoriel](https://matplotlib.org/stable/tutorials/introductory/pyplot.html) ou en intégrant les lignes de code suivantes :
%% Cell type:code id: tags:
```
``` python
import matplotlib.pyplot as plt # To be placed at the top of python file
# [Your previous code...]
# Plot T = T(hour)
# Décommentez les lignes ci-dessous
#
# fig = plt.figure() # initialise figure
# title = f"{day_of_the_week} {date_of_today}"
# fig.suptitle(title, fontsize=14, fontweight='bold')
#
# ax = fig.add_subplot(111) # initialise a plot area
# fig.subplots_adjust(top=0.85)
# ax.set_title('Day temperature')
# ax.set_xlabel('Time [h]')
# ax.set_ylabel('Temperature [deg. C]')
#
# ax.plot(t[0], t[1]) # plot t[1] (tempe) as a function of t[0] (hour)
```
%% Cell type:markdown id: tags:
> **Option :** intégrer l'icone de la météo du jour en utilisant le module `matplotlib.image`.
%% Cell type:markdown id: tags:
Pas si vite ! Êtes-vous sûr ? Vraiment ?
Alors rendez-vous dans [exos/meteo_json.py](exos/meteo_json.py)
Alors rendez-vous dans [exos/correction/meteo_json.py](exos/correction/meteo_json.py)
%% Cell type:markdown id: tags:
## Exercice sur les fonctions
Modifiez le programme météo en créant une fonction qui admet un des jours disponibles comme argument (aujourd'hui, demain, après-demain...)
À partir de [`exos/correction/meteo_json.py`](exos/correction/meteo_json.py), écrivez le programme `meteo_json_func.py` qui contient une fonction `plot_day_tempe()` admettant deux arguments :
- `day_key` : un entier représentant le jour visé (`0`: aujourd'hui, `1`: demain, `2`: après-demain...)
- `city_name`: une chaîne de caractère de la ville recherchée
%% Cell type:code id: tags:
``` python
# Pour tester votre script dans cette cellule, décommenter les lignes suivantes
# et redémarrer le noyau avant chaque modification:
#from meteo_json_func import plot_day_tempe
#plot_day_tempe(2, city_name='Marseille')
```
%% Cell type:markdown id: tags:
Pas si vite ! Êtes-vous sûr ? Vraiment ?
Alors allez voir une proposition de solution dans [exos/meteo_json_func.py](exos/meteo_json_func.py)
Alors allez voir une proposition de solution dans [exos/correction/meteo_json_func.py](exos/correction/meteo_json_func.py)
%% Cell type:code id: tags:
``` python
from exos.correction.meteo_json_func import plot_day_tempe
plot_day_tempe(2, city_name='Marseille')
```
%% Cell type:markdown id: tags:
## Exécution avec les widgets ipython
[Jupyter ipywidgets](https://ipywidgets.readthedocs.io/en/latest/index.html) permet de créer très facilement des menus interactifs pour faciliter l'exécution de code dans les notebooks.
%% Cell type:markdown id: tags:
Un exemple avec notre courbe de température :
%% Cell type:code id: tags:
```
from exos import meteo_json_func as mjf
``` python
import exos.correction.meteo_json_func as meteo
from ipywidgets import interact
def plot_city(city_name, iday):
city_json = mjf.get_json_from_name(city_name)
mjf.plot_day_tempe(city_json, f'fcst_day_{iday}')
interact(plot_city,
city_name=["Marseille", "Paris", "Toulouse", "Strasbourg"],
iday=list(range(5)));
interact(meteo.plot_day_tempe,
day_key=list(range(5)),
city_name=["Marseille", "Paris", "Toulouse", "Strasbourg"]
);
```
%% Cell type:markdown id: tags:
## Exécution en script
Pour pouvoir exécuter ce fichier en mode script
### Utilisation de `if __name__ == '__main__':`
- Ajouter en première ligne du fichier: `#! python3`
- Rendez le fichier exécutable: `chmod a+x today_stras.py`
Dans un fichier python `test_module.py`, on souhaite généralement différencier :
- le code exécuté lors de l'import du fichier **comme un module** depuis un autre programme python ou depuis un notebook Jupyter avec :
%% Cell type:code id: tags:
```
# pour permettre le tracé de la figure dans le notebook :
%matplotlib inline
# équivalent à exécuter la commande :
# python3 exos/meteo_json.py
# depuis le terminal système, décommentez et exécutez :
#%run exos/meteo_json.py