Skip to content

Commit 454be89

Browse files
committed
addresses cleanup
1 parent 315b3f5 commit 454be89

File tree

5 files changed

+340
-790
lines changed

5 files changed

+340
-790
lines changed

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

Lines changed: 30 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ kernelspec:
99
name: python3
1010
language_info:
1111
name: python
12-
nbconvert_exporter: python
1312
pygments_lexer: ipython3
13+
nbconvert_exporter: python
1414
---
1515

1616
# TP géoloc addresses
@@ -62,14 +62,19 @@ on va utiliser principalement
6262

6363
+++
6464

65-
## géolocalisation
65+
## l'API de géolocalisation
6666

6767
pour obtenir des coordonnées latitude/longitude à partir d'une adresse, en France on peut utiliser un service public et gratuit ici
6868
**<https://adresse.data.gouv.fr/api-doc/adresse>**
69-
lisez bien cette page, et notamment tout en bas il y a une zone où vous pouvez faire une recherche en ligne
69+
70+
```{admonition} la doc a disparu !
71+
dans une version antérieure, cette URL donnait le mode d'emploi de l'API de géolocalisation
72+
mais ! en Octobre 2025, la documentation semble en pleine refonte,
73+
et si l'URL existe toujours, **elle ne contient plus cette information**...
74+
```
7075

7176
```{code-cell} ipython3
72-
# for starters, we only need the 'regular fit' pandas
77+
# for starters, we only need the 'regular fit' - i.e. non geo - pandas
7378
7479
import pandas as pd
7580
```
@@ -86,6 +91,10 @@ addresses.head(4)
8691

8792
et la première chose qu'on va faire, c'est naturellement d'utiliser cette API pour géolocaliser ces adresses
8893

94+
+++
95+
96+
### un petit extrait
97+
8998
mais avant cela, je vous recommande de produire un fichier `addresses-small.csv` qui contient un petit extrait, disons les 10 ou 20 premières lignes; ce sera très utile pour débugger
9099

91100
```{code-cell} ipython3
@@ -114,13 +123,13 @@ c'est très pratique de pouvoir faire une recherche des adresses 'une par une';
114123
`https://api-adresse.data.gouv.fr/search/?q=3+rue+tourelles,Paris`
115124
- observez le format de ce que vous recevez, qu'est-ce que ça peut être ?
116125
- ajoutez `&limit=1` à l'url pour que cela donne
117-
`https://api-adresse.data.gouv.fr/search/?q=3+rue+tourelles,Paris&limit=1`
118-
quelle est la différence ?
126+
`https://api-adresse.data.gouv.fr/search/?q=3+rue+tourelles,Paris&limit=1`
127+
quelle différence observez-vous dans le résultat ?
119128

120129
+++
121130

122131
````{admonition} ? et & dans l'URL
123-
:class: note
132+
:class: note dropdown
124133
125134
ici lorsqu'on envoie donc une requête vers l'URL
126135
`https://api-adresse.data.gouv.fr/search/?q=18+rue+BERNARDINS,Paris&limit=1`
@@ -159,7 +168,7 @@ et notamment vous devriez tomber sur une page qui commence avec cet exemple
159168
{'private_gists': 419, 'total_private_repos': 77, ...}
160169
```
161170

162-
qui devrait vous inspirer pour l'écriture de la fonction suivante
171+
qui devrait vous éclairer sur l'usage de base de la librairie
163172

164173
```{code-cell} ipython3
165174
# requests is the swiss knife for doing http
@@ -168,20 +177,22 @@ import requests
168177
```
169178

170179
```{code-cell} ipython3
171-
# here's how to use the API
180+
# to localize ONE address
181+
# we just need to forge the right URL
172182
173183
def localize_one(num, typ, nom):
174184
175185
# we build the URL which directly contains the address pieces
176186
url = f"https://api-adresse.data.gouv.fr/search/?q={num}+{typ}+{nom},Paris&limit=1"
187+
177188
# print(f"localize_one is fetching page\n{url}")
178189
179190
# sending request to the web server
180191
response = requests.get(url)
181192
182193
# if all is OK, http returns a code in the [200 .. 300[ range
183194
if not (200 <= response.status_code < 300):
184-
print("WHOOPS....")
195+
print(f"WHOOPS.... {response.status_code=}")
185196
return
186197
187198
# we can then read the answer
@@ -238,26 +249,6 @@ details = localize_one(18, 'rue', 'BERNARDINS')
238249
30_000 * .100
239250
```
240251

241-
````{admonition} ? et & dans l'URL
242-
:class: note dropdown
243-
244-
dans une autre dimension complètement: ici on envoie donc une requête vers l'URL
245-
`https://api-adresse.data.gouv.fr/search/?q=18+rue+BERNARDINS,Paris&limit=1`
246-
247-
Les caractères `?` et `&` jouent un rôle particulier: pour information, la syntaxe générale c'est
248-
```
249-
http://le.host.name/le/path?param1=truc&param2=bidule&param3=machinechose
250-
```
251-
252-
et donc de cette façon, c'est un peu comme si on appelait une fonction à distance, en lui passant
253-
- `q=18+rue+BERNARDINS,Paris` (`q` pour *query*)
254-
- et `limit=1` (pour avoir seulement la première réponse)
255-
256-
et pour vous faire réfléchir: il se passerait quoi si par exemple dans la colonne `name` il y avait un caractère `&` (imaginez la rue *Bouvart & Ratinet*)
257-
````
258-
259-
+++
260-
261252
### en un seul coup
262253

263254
si vous avez bien lu la page qui décrit l'API, vous devez avoir remarqué qu'il y a une autre façon de lui soumettre une recherche
@@ -393,15 +384,15 @@ def mass_post(filename, col_number, col_type, col_name, col_city):
393384
def localize_many(filename, col_number, col_type, col_name, col_city):
394385
df = pd.read_csv(filename)
395386
geoloc = mass_post(filename, col_number, col_type, col_name, col_city)
396-
# because we don't set an index, it it safe to merge
387+
# because we don't set an index, it is safe to merge
397388
geoloc = geoloc[['latitude', 'longitude', 'result_city', 'result_type']]
398389
return df.merge(geoloc, left_index=True, right_index=True)
399390
```
400391

401392
```{code-cell} ipython3
402393
:tags: [level_basic]
403394
404-
# try your code on the small sample for starters
395+
# try this code on the small sample for starters
405396
406397
addresses_small = localize_many("data/addresses-small.csv", "number", "type", "name", "city")
407398
addresses_small
@@ -423,14 +414,16 @@ addresses_small
423414
424415
# prune-cell
425416
426-
# sanity check
417+
# sanity check - should return True, True
427418
428419
addresses_small = localize_many("data/addresses-small.csv", "number", "type", "name", "city")
429420
430-
431-
( sum(addresses_small.result_city != 'Paris') == 0
432-
and
433-
sum(addresses_small.result_type != 'housenumber') == 0)
421+
(
422+
# are all addresses in Paris
423+
all(addresses_small.result_city == 'Paris'),
424+
# are all addresses for a house - as opposed to a street or worse
425+
all(addresses_small.result_type == 'housenumber'),
426+
)
434427
```
435428

436429
```{code-cell} ipython3

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

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ kernelspec:
99
name: python3
1010
language_info:
1111
name: python
12-
nbconvert_exporter: python
1312
pygments_lexer: ipython3
13+
nbconvert_exporter: python
1414
---
1515

1616
# TP géoloc addresses
@@ -62,14 +62,19 @@ on va utiliser principalement
6262

6363
+++
6464

65-
## géolocalisation
65+
## l'API de géolocalisation
6666

6767
pour obtenir des coordonnées latitude/longitude à partir d'une adresse, en France on peut utiliser un service public et gratuit ici
6868
**<https://adresse.data.gouv.fr/api-doc/adresse>**
69-
lisez bien cette page, et notamment tout en bas il y a une zone où vous pouvez faire une recherche en ligne
69+
70+
```{admonition} la doc a disparu !
71+
dans une version antérieure, cette URL donnait le mode d'emploi de l'API de géolocalisation
72+
mais ! en Octobre 2025, la documentation semble en pleine refonte,
73+
et si l'URL existe toujours, **elle ne contient plus cette information**...
74+
```
7075

7176
```{code-cell} ipython3
72-
# for starters, we only need the 'regular fit' pandas
77+
# for starters, we only need the 'regular fit' - i.e. non geo - pandas
7378
7479
import pandas as pd
7580
```
@@ -86,6 +91,10 @@ addresses.head(4)
8691

8792
et la première chose qu'on va faire, c'est naturellement d'utiliser cette API pour géolocaliser ces adresses
8893

94+
+++
95+
96+
### un petit extrait
97+
8998
mais avant cela, je vous recommande de produire un fichier `addresses-small.csv` qui contient un petit extrait, disons les 10 ou 20 premières lignes; ce sera très utile pour débugger
9099

91100
```{code-cell} ipython3
@@ -106,13 +115,13 @@ c'est très pratique de pouvoir faire une recherche des adresses 'une par une';
106115
`https://api-adresse.data.gouv.fr/search/?q=3+rue+tourelles,Paris`
107116
- observez le format de ce que vous recevez, qu'est-ce que ça peut être ?
108117
- ajoutez `&limit=1` à l'url pour que cela donne
109-
`https://api-adresse.data.gouv.fr/search/?q=3+rue+tourelles,Paris&limit=1`
110-
quelle est la différence ?
118+
`https://api-adresse.data.gouv.fr/search/?q=3+rue+tourelles,Paris&limit=1`
119+
quelle différence observez-vous dans le résultat ?
111120

112121
+++
113122

114123
````{admonition} ? et & dans l'URL
115-
:class: note
124+
:class: note dropdown
116125
117126
ici lorsqu'on envoie donc une requête vers l'URL
118127
`https://api-adresse.data.gouv.fr/search/?q=18+rue+BERNARDINS,Paris&limit=1`
@@ -151,7 +160,7 @@ et notamment vous devriez tomber sur une page qui commence avec cet exemple
151160
{'private_gists': 419, 'total_private_repos': 77, ...}
152161
```
153162

154-
qui devrait vous inspirer pour l'écriture de la fonction suivante
163+
qui devrait vous éclairer sur l'usage de base de la librairie
155164

156165
```{code-cell} ipython3
157166
# requests is the swiss knife for doing http
@@ -160,20 +169,22 @@ import requests
160169
```
161170

162171
```{code-cell} ipython3
163-
# here's how to use the API
172+
# to localize ONE address
173+
# we just need to forge the right URL
164174
165175
def localize_one(num, typ, nom):
166176
167177
# we build the URL which directly contains the address pieces
168178
url = f"https://api-adresse.data.gouv.fr/search/?q={num}+{typ}+{nom},Paris&limit=1"
179+
169180
# print(f"localize_one is fetching page\n{url}")
170181
171182
# sending request to the web server
172183
response = requests.get(url)
173184
174185
# if all is OK, http returns a code in the [200 .. 300[ range
175186
if not (200 <= response.status_code < 300):
176-
print("WHOOPS....")
187+
print(f"WHOOPS.... {response.status_code=}")
177188
return
178189
179190
# we can then read the answer
@@ -211,26 +222,6 @@ localize_one(18, 'rue', 'BERNARDINS')
211222
# your code here
212223
```
213224

214-
````{admonition} ? et & dans l'URL
215-
:class: note dropdown
216-
217-
dans une autre dimension complètement: ici on envoie donc une requête vers l'URL
218-
`https://api-adresse.data.gouv.fr/search/?q=18+rue+BERNARDINS,Paris&limit=1`
219-
220-
Les caractères `?` et `&` jouent un rôle particulier: pour information, la syntaxe générale c'est
221-
```
222-
http://le.host.name/le/path?param1=truc&param2=bidule&param3=machinechose
223-
```
224-
225-
et donc de cette façon, c'est un peu comme si on appelait une fonction à distance, en lui passant
226-
- `q=18+rue+BERNARDINS,Paris` (`q` pour *query*)
227-
- et `limit=1` (pour avoir seulement la première réponse)
228-
229-
et pour vous faire réfléchir: il se passerait quoi si par exemple dans la colonne `name` il y avait un caractère `&` (imaginez la rue *Bouvart & Ratinet*)
230-
````
231-
232-
+++
233-
234225
### en un seul coup
235226

236227
si vous avez bien lu la page qui décrit l'API, vous devez avoir remarqué qu'il y a une autre façon de lui soumettre une recherche
@@ -366,15 +357,15 @@ def mass_post(filename, col_number, col_type, col_name, col_city):
366357
def localize_many(filename, col_number, col_type, col_name, col_city):
367358
df = pd.read_csv(filename)
368359
geoloc = mass_post(filename, col_number, col_type, col_name, col_city)
369-
# because we don't set an index, it it safe to merge
360+
# because we don't set an index, it is safe to merge
370361
geoloc = geoloc[['latitude', 'longitude', 'result_city', 'result_type']]
371362
return df.merge(geoloc, left_index=True, right_index=True)
372363
```
373364

374365
```{code-cell} ipython3
375366
:tags: [level_basic]
376367
377-
# try your code on the small sample for starters
368+
# try this code on the small sample for starters
378369
379370
addresses_small = localize_many("data/addresses-small.csv", "number", "type", "name", "city")
380371
addresses_small

0 commit comments

Comments
 (0)