Skip to content

Commit cb25f42

Browse files
committed
ctd - on the teacher notebooks as well
1 parent 0a5a7ec commit cb25f42

File tree

15 files changed

+73
-244
lines changed

15 files changed

+73
-244
lines changed

notebooks/geo-tps/addresses/.teacher/README-addresses-corrige-nb.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,6 @@ import pandas as pd
8181
vous pouvez charger le fichier `data/addresses.csv`; toutes ces adresses sont situées à PARIS
8282

8383
```{code-cell} ipython3
84-
:tags: []
85-
8684
# load the data in data/addresses.csv
8785
# and display a few first lines
8886
@@ -174,8 +172,6 @@ import requests
174172
```
175173

176174
```{code-cell} ipython3
177-
:tags: []
178-
179175
# here's how to use the API
180176
181177
def localize_one(num, typ, nom):
@@ -286,6 +282,7 @@ curl -X POST -F data=@path/to/file.csv -F columns=voie -F columns=ville https://
286282
```bash
287283
curl -o lapageweb.html http://github.com/flotpython/
288284
```
285+
289286
* quand on utilise une API, comme on vient de le faire pour aller chercher la position de la rue des bernardins, on doit **passer des paramètres** à l'API
290287
et pour faire ça dans une requête http, il y a **deux mécanismes: GET et POST**
291288
@@ -334,22 +331,26 @@ sauf que nous, on ne veut pas utiliser `curl`, on veut faire cette requête en P
334331
2. le résultat - toujours au format csv - pourra être également transformé en dataframe
335332
3. qu'il ne restera plus qu'à `merge` (ou `join` si vous préférez) avec la dataframe de départ, pour ajouter les résultats de la géolocalisation dans les données de départ
336333
pour cette étape on peut envisager de ne garder que certaines colonnes de la géolocalisation (assez bavarde par ailleurs), je vous recommande de conserver uniquement:
334+
337335
* `latitude`, `longitude` - *of course*
338336
* `result_city` pour pouvoir vérifier la validité des résultats - ici on devrait toujours avoir `Paris`
339337
* `result_type` qui devrait toujours renvoyer `housenumber`, ça permet à nouveau de vérifier qu'on a bien une adresse connue
340338

341339
+++
342340

343341
````{tip}
342+
344343
* pour envoyer un POST avec des paramètres, on peut faire
345344
```python
346345
response = requests.post(url, file=some_dict, data=another_dict)
347346
```
347+
348348
* et donc dans notre cas, puisque `data` est un paramètre de type fichier, alors que `columns` est un paramètre usuel, on fera
349349
```python
350350
response = requests.post(url, files={'data': file_like}, data={'columns': ['col1', ...]})
351351
```
352352
dans lequel `file_like` désigne le résultat d'un `open()`
353+
353354
* enfin, `pd.read_csv` s'attend à un paramètre de type fichier, i.e. du genre de ce qu'on obtient avec `open()`
354355
et du coup pour reconstruire une dataframe à partir du texte obtenu dans la requête http, on a deux choix
355356
1. soit on commence par sauver le texte dans un fichier temporaire (juste faire attention à choisir un nom de fichier qui n'existe pas, de préférence dans un dossier temporaire, voir le module `tempfile`)
@@ -365,8 +366,6 @@ je vous recommande d'y aller pas à pas, commencez par juste l'étape 1, puis 1
365366
c'est utile aussi de commencer par une toute petite dataframe pour ne pas attendre des heures pendant la mise au point...
366367

367368
```{code-cell} ipython3
368-
:tags: []
369-
370369
import requests
371370
# this one is to fake a file from a string
372371
import io

notebooks/numpy-exos/.teacher/EXO-indices-corrige-nb.md

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
---
22
jupytext:
3-
cell_metadata_filter: all,-hidden,-heading_collapsed,-run_control,-trusted
4-
notebook_metadata_filter: all, -jupytext.text_representation.jupytext_version, -jupytext.text_representation.format_version,
5-
-jupytext.custom_cell_magics, -language_info.version, -language_info.codemirror_mode.version,
6-
-language_info.codemirror_mode, -language_info.file_extension, -language_info.mimetype,
7-
-toc, -vscode
83
text_representation:
94
extension: .md
105
format_name: myst

notebooks/numpy-exos/.teacher/EXO-mandelbrot-corrige-nb.md

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,6 @@ notebookname: Mandelbrot
2222
</div>
2323

2424
```{code-cell} ipython3
25-
---
26-
slideshow:
27-
slide_type: slide
28-
---
2925
import numpy as np
3026
import matplotlib.pyplot as plt
3127
%matplotlib ipympl
@@ -44,30 +40,33 @@ il s'agit de calculer l'image de la convergence de mandelbrot:
4440

4541
## comment ça marche ?
4642

47-
+++ {"cell_style": "center", "slideshow": {"slide_type": "slide"}}
43+
+++ {"cell_style": "center"}
4844

4945
* dans l'espace complexe, on définit pour chaque $c\in\mathbb{C}$ la suite
5046
* $z_0 = c$
5147
* $z_{n+1} = z_n^2 + c$
5248
* on démontre que
5349
* lorsque $|z_n|>2$, la suite diverge
5450

55-
+++ {"cell_style": "center", "slideshow": {"slide_type": "-"}}
51+
+++ {"cell_style": "center"}
5652

5753
il s'agit pour nous de
5854

5955
* partir d'un pavé rectangulaire; par exemple sur la figure, on a pris l'habituel
6056
$re \in [-2, 0.8]$ et $im \in [-1.4, 1.4]$
57+
6158
* découper ce pavé en un maillage de $h \times w$ points (sur la figure, 1000 x 1000)
6259
* on se fixe un nombre maximal `max` d'itérations (disons 20)
6360
et pour chaque point du maillage, on va calculer si la suite diverge avant `max` itérations
61+
6462
* c'est-à-dire plus spécifiquement on calcule un tableau `diverge` de la taille du maillage
6563
* pour chaque point `z`, on calcule les `max` premiers termes de la suite
6664
* et à la première itération `n` où la suite diverge (son module est supérieur à 2)
6765
alors on affecte `diverge[z] = n`
66+
6867
* on n'a plus qu'à afficher ensuite l'image obtenue `diverge` avec `plt.imshow`
6968

70-
+++ {"slideshow": {"slide_type": "slide"}}
69+
+++
7170

7271
````{admonition} indices
7372
@@ -127,24 +126,16 @@ et je vous demande de mettre ici quelques tests de votre deuxième fonction
127126

128127
# solution
129128

130-
+++ {"slideshow": {"slide_type": "slide"}}
129+
+++
131130

132131
* une adaptation libre de l'[implementation proposée dans le tutorial scipy](https://docs.scipy.org/doc/numpy/user/quickstart.html#indexing-with-boolean-arrays)
133132

134133
```{code-cell} ipython3
135-
---
136-
slideshow:
137-
slide_type: slide
138-
---
139134
import numpy as np
140135
import matplotlib.pyplot as plt
141136
```
142137

143138
```{code-cell} ipython3
144-
---
145-
slideshow:
146-
slide_type: slide
147-
---
148139
# it's a little confusing that
149140
# real part = column = second dimension
150141
# imag part = line = first dimension
@@ -194,10 +185,6 @@ def mandelbrot(height, width, *,
194185
```
195186

196187
```{code-cell} ipython3
197-
---
198-
slideshow:
199-
slide_type: slide
200-
---
201188
plt.figure(figsize=(10, 10))
202189
diverge = mandelbrot(1024, 1024)
203190
plt.imshow(diverge)

notebooks/numpy-tps/images/.teacher/README-images1-corrige-nb.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,13 @@ plt.rc('figure', figsize=(2, 2))
100100
:width: 100px
101101
:align: right
102102
```
103+
103104
* l'affichage à l'écran, d'une image couleur `rgb`, utilise les règles de la synthèse additive
104105
`(r, g, b) = (255, 255, 255)` donne la couleur blanche
105106
`(r, g, b) = (0, 0, 0)` donne du noir
106107
`(r, g, b) = (255, 0, 0)` donne du rouge
107108
`(r, g, b) = (255, 255, 0)` donne du jaune ...
109+
108110
* pour afficher le tableau `im` comme une image, utilisez: `plt.imshow(im)`
109111
* pour afficher plusieurs images dans une même cellule de notebook faire `plt.show()` après chaque `plt.imshow(...)`
110112
````
@@ -116,6 +118,7 @@ plt.rc('figure', figsize=(2, 2))
116118
1. Créez un tableau **non initialisé**, pour représenter une image carrée **de 91 pixels de côté**, d'entiers 8 bits non-signés, et affichez-le
117119
```{admonition} indices
118120
:class: tip
121+
119122
* il vous faut pouvoir stocker 3 `uint8` par pixel pour ranger les 3 couleurs
120123
* on s'intéresse uniquement à la taille, et pas au contenu puisqu'on a dit "non initialisé"; que vous ayez du blanc, du noir ou du bruit, c'est OK
121124
```
@@ -367,6 +370,7 @@ im = plt.imread(filename)
367370
368371
* vous pouvez créer plusieurs figures depuis une seule cellule
369372
pour cela, faites plusieurs fois la séquence `plt.imshow(...); plt.show()`
373+
370374
* vous pouvez ensuite choisir de 'replier' ou non la zone *output* en hauteur;
371375
c'est-à-dire d'afficher soit toute la hauteur, soit une zone de taille fixe avec une scrollbar pour naviguer
372376
pour cela cliquez dans la marge gauche de la zone *output*
@@ -447,6 +451,7 @@ R, G, B = im[:, :, 0], im[:, :, 1], im[:, :, 2]
447451
* mais pour afficher une image unidimensionnelle contenant des nombres de `0` à `255`,
448452
il faut bien lui dire à quoi correspondent les valeurs
449453
(lors de l'affichage, le `255` des rouges n'est pas le même `255` des verts)
454+
450455
* du coup, voyez le paramètre `cmap=` de `plt.imshow`; et notamment avec `'Reds'`, `'Greens'` ou `'Blues'`
451456
```
452457
@@ -483,6 +488,7 @@ for (channel, cmap) in (R, 'Reds'), (G, 'Greens'), (B, 'Blues'):
483488
```
484489

485490
5. Copiez l'image, et dans la copie, remplacer le carré de taille `(200, 200)` en bas à droite:
491+
486492
* d'abord par un carré de couleur RGB `(219, 112, 147)` (vous obtenez quelle couleur)
487493
* puis par un carré blanc avec des rayures horizontales rouges de 1 pixel d'épaisseur
488494

notebooks/numpy-tps/images/.teacher/README-images2-corrige-nb.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ on obtiendrait cette fois (observez la taille en pixels de l'image)
131131

132132
```{admonition} indice
133133
:class: tip dropdown
134+
134135
* votre fonction retourne un tuple avec deux morceaux: le nombre de lignes, et le nombre de colonnes
135136
* dans un premier temps, vous pouvez vous contenter d'une version un peu brute: on pourrait utiliser juste la racine carrée, et toujours fabriquer des carrés
136137
@@ -182,6 +183,7 @@ for n in range(1, 18):
182183

183184
````{admonition} indices
184185
:class: dropdown
186+
185187
* sont potentiellement utiles pour cet exo:
186188
* la fonction `np.indices()`
187189
* [l'indexation d'un tableau par un tableau](https://numerique.info-mines.paris/numpy-optional-indexing-nb/)
@@ -504,6 +506,7 @@ B' = 0.272 * R + 0.534 * G + 0.131 * B
504506
* dans notre cas on suppose qu'en entrée on a des entiers non-signé 8 bits
505507
* mais attention, les calculs vont devoir se faire en flottants, et pas en uint8
506508
pour ne pas avoir, par exemple, 256 devenant 0
509+
507510
* toutefois on veut tout de même en sortie des entiers non-signé 8 bits !
508511
509512
ça signifie qu'il va sans doute vous falloir faire un peu de gymnastique avec les types de vos tableaux

notebooks/numpy-tps/pentominos/.teacher/README-pentominos-corrige-nb.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ you have 12 pieces and 60 slots to fill, so you need 72 columns
256256
### model the problem
257257

258258
decide how to represent the board and pieces:
259+
259260
* using nd-arrays, so rectangular spaces
260261
* use only **booleans** to model **obstacles** in the board and the actual **contour** of pieces
261262

notebooks/numpy-tps/sounds/.teacher/README-sounds-corrige-nb.md

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -183,11 +183,8 @@ def MyAudio(what, **kwds):
183183
```
184184

185185
```{code-cell} ipython3
186-
---
187-
slideshow:
188-
slide_type: ''
189-
tags: [raises-exception, gridwidth-1-2]
190-
---
186+
:tags: [raises-exception, gridwidth-1-2]
187+
191188
# je peux me contenter de faire ceci
192189
193190
MyAudio(la_1seconde)
@@ -259,8 +256,6 @@ def sine(freq, duration=1):
259256
#MyAudio(sine(LA, 1.5), autoplay=True)
260257
```
261258

262-
+++ {"tags": []}
263-
264259
### pour les rapides
265260

266261
on veut obtenir un effet de 'note qui monte'
@@ -270,16 +265,12 @@ améliorer un peu pour générer une courbe avec un fréquence qui croit (ou dé
270265
écrire une fonction `sine_linear(freq1, freq2, duration)`
271266

272267
```{code-cell} ipython3
273-
:tags: []
274-
275268
# votre code
276269
def sine_linear(freq1, freq2, duration):
277270
...
278271
```
279272

280273
```{code-cell} ipython3
281-
:tags: []
282-
283274
# prune-cell
284275
def sine_linear(freq1, freq2, duration):
285276
t = np.linspace(0, duration, int(duration*RATE))
@@ -288,8 +279,6 @@ def sine_linear(freq1, freq2, duration):
288279
```
289280

290281
```{code-cell} ipython3
291-
:tags: []
292-
293282
# décommenter pour écouter
294283
#MyAudio(sine_linear(440, 660, 3))
295284
```
@@ -477,6 +466,7 @@ ce qui nous amène à une petite digression: profitons-en pour regarder un peu c
477466
l'encodage des **entiers signés** fonctionne comme suit; on regarde ici les types `int8` et `uint8` car c'est plus simple, le principe est exactement le même pour des tailles plus grandes
478467

479468
il y a deux types d'encodages pour les entiers:
469+
480470
* `uint8` (le `u` signifie *unsigned*): les entiers **non signés** reposent sur un encodage "naturel": on décompose en base 2, et donc avec 8 bits, on peut aller **de 0 à 255**
481471
* `int8`: par contre pour les entiers **signés**, on va devoir utiliser **un bit comme bit de signe**, ce qui limite le spectre de ce qu'il est possible d'encoder; avec en tout 8 bits on peut encoder de **-128 à 127 inclus**
482472

notebooks/numpy-tps/taylor/.teacher/README-taylor-2-numpy-corrige-nb.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,6 @@ def taylor2(X, f, n):
150150
### avec sinus au degré 10
151151

152152
```{code-cell} ipython3
153-
:tags: []
154-
155153
# Y est le sinus de X
156154
# Y2 est l'image de X par l'approximation de Taylor pour sinus au degré 10
157155

notebooks/numpy-tps/taylor/.teacher/README-taylor-3-interactive-corrige-nb.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,10 @@ le but du jeu dans cette dernière partie du TP est de créer un dashboard qui p
4747
## modes disponibles
4848

4949
la solution à cet exercice est relativement différente selon le mode de restitution choisi pour `matplotlib`; notamment il y a
50+
5051
* `%matplotlib inline` qui est le mode par défaut, **très ancien** et **pas du tout interactif** (on ne peut pas agrandir, zoomer, etc... dans la figure)
5152
c'est plutôt plus simple à coder, mais le résultat est vraiment rustique du coup, bref c'est plutôt déconseillé d'investir dans cette voie
53+
5254
* `%matplotlib notebook` qui était déjà plus moderne; avec ce mode on peut agrandir / zoomer mais il est **devenu obsolète**
5355
* `%matplotlib ipympl` qui est, en 2024, le successeur du précédent - notamment si vous voulez visualiser vos rendus interactifs
5456
ce mode nécessite une installation supplémentaire (et [voir aussi cette page pour plus de détails](#label-dashboard-ipympl))

notebooks/pandas-exos/.teacher/EXO-bornes-corrige-nb.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,13 @@ il s'agit donc de démêler l'écheveau pour fabriquer une table qui a 6 lignes,
7373

7474
* on a vu dans le cours que sur un objet Series on pouvait avoir besoin
7575
occasionnellement d'utiliser l'attribut `str`
76+
7677
* ici on a envie de passer par un objet liste; notamment je vous rappelle
7778
* la méthode `replace()` sur les chaines de caractères
7879
* la méthode `split()` sur les chaines de caractères
7980
* une fois que vous êtes arrivés à mettre une liste dans une cellule d'une Series,
8081
il peut être intéressant de remplacer ce contenu par .. un objet Series
82+
8183
* vous pourrez ensuite invoquer la méthode `.stack()` sur la Series englobante
8284

8385
+++

0 commit comments

Comments
 (0)