@@ -109,7 +109,7 @@ avec restrictions d'accès.
109
109
110
110
111
111
Voici les éléments importants à avoir en tête sur les requêtes (j'emprunte encore
112
- à [ ` utilitR ` ] ( https://www.book.utilitr.org/api.html ) ):
112
+ à [ ` utilitR ` ] ( https://www.book.utilitr.org/api.html ) ) :
113
113
114
114
* Le __ point d’entrée__ d’un service offert par une API se présente sous la forme d’une URL (adresse web).
115
115
Chaque service proposé par une API a sa propre URL. Par exemple, dans le cas de l’OpenFood Facts,
@@ -160,11 +160,11 @@ package `request`
160
160
sur un url dont la structure est la suivante :
161
161
162
162
- il commencera par ` https://koumoul.com/data-fair/api/v1/datasets/dpe-france/values/ ` ;
163
- - il sera ensuite suivi par des paramètres de recherche? Le champ ` {field} `
164
- commande ainsi généralement par un ` ? ` qui permet ensuite de spécifier des paramètres
163
+ - il sera ensuite suivi par des paramètres de recherche. Le champ ` {field} `
164
+ commence ainsi généralement par un ` ? ` qui permet ensuite de spécifier des paramètres
165
165
sous la forme ` nom_parameter=value `
166
166
167
- A la lecture de la documentation, les premiers paramètres qu'on désire:
167
+ A la lecture de la documentation, les premiers paramètres qu'on désire :
168
168
169
169
- Le nombre de pages, ce qui nous permet d'obtenir un certain nombre d'échos. On
170
170
va seulement récupérer 10 pages ce qui correspond à une centaine d'échos. On va
@@ -177,7 +177,8 @@ fichiers
177
177
on va récupérer les données dont le code commune est ` 01450 ` . D'après la doc,
178
178
il convient de passer le code commune sous le format:
179
179
` code_insee_commune_actualise:{code_commune} ` . Pour éviter tout risque de
180
- mauvais formatage, on va utiliser ` %3A% ` pour signifier ` : `
180
+ mauvais formatage, on va utiliser ` %3A ` pour signifier ` : ` , ` %2A ` pour signifier ` * ` et
181
+ ` %22 ` pour signifier ` " ` .
181
182
- D'autres paramètres annexes, suggérés par la documentation
182
183
183
184
Cela nous donne ainsi un URL dont la structure est la suivante :
@@ -191,14 +192,14 @@ url_api = f"{api_root}?page=1&after=10&format=json&q_mode=simple&qs=code_insee_c
191
192
192
193
Si vous introduisez cet URL dans votre navigateur, vous devriez aboutir
193
194
sur un ` JSON ` non formaté[ ^ 1 ] . En ` Python ` ,
194
- on peut utiliser ` requests ` pour récupérer les données[ ^ 2 ] :
195
+ on peut utiliser ` requests ` pour récupérer les données[ ^ 2 ] :
195
196
196
197
197
198
[ ^ 1 ] : Le JSON est un format très apprécié dans le domaine du * big data*
198
199
car il permet de stocker de manière intelligente des données
199
200
de structures diverses. Il
200
201
s'agit d'un des formats privilégiés du paradigme No-SQL pour lequel
201
- cet [ excellent cours] ( http://b3d.bdpedia.fr/ ) propose plus de détails
202
+ cet [ excellent cours] ( http://b3d.bdpedia.fr/ ) propose plus de détails.
202
203
203
204
[ ^ 2 ] : Suivant les API, nous avons soit besoin de rien de plus si nous parvenons directement à obtenir un json, soit devoir utiliser un * parser* comme ` BeautifulSoup ` dans le cas contraire. Ici, le JSON peut être formaté relativement aisément.
204
205
@@ -268,7 +269,7 @@ def interactive_map_dpe(dpe):
268
269
sw = dpe[['latitude', 'longitude']].min().values.tolist()
269
270
ne = dpe[['latitude', 'longitude']].max().values.tolist()
270
271
271
- m = folium.Map(location = center, tiles='Stamen Toner ')
272
+ m = folium.Map(location = center, tiles='OpenStreetMap ')
272
273
273
274
# I can add marker one by one on the map
274
275
for i in range(0,len(dpe)):
@@ -290,55 +291,6 @@ m = interactive_map_dpe(dpe)
290
291
m
291
292
```
292
293
293
- On remarque un problème dans les données : un logement qui n'a
294
- rien à voir avec les autres. Il faudrait donc idéalement
295
- nettoyer un peu le jeu de données pour filtrer en fonction de
296
- limites géographiques.
297
-
298
- Un des paramètres qui peut permettre ceci est ` geo_distance ` .
299
- Pour commencer, on va tricher un petit peu pour déterminer
300
- les longitudes et latitudes de départ. Idéalement, on
301
- récupérerait le découpage de la commune et utiliserait, par
302
- exemple, le centroid de cette commune. Cela nécessite
303
- néanmoins l'appel à une autre API que nous n'avons
304
- pour le moment pas décrite. Nous allons donc
305
- nous contenter d'utiliser les longitudes et latitudes
306
- du point médian et fixer un rayon de plusieurs kilomètres
307
- pour exclure les points aberrants.
308
-
309
- ``` {python}
310
- x_median = dpe['longitude'].median()
311
- y_median = dpe['latitude'].median()
312
- ```
313
-
314
- La documentation nous informe du format à utiliser:
315
-
316
- > Le format est 'lon,lat,distance'. La distance optionnelle (0 par défaut) et est exprimée en mètres.
317
-
318
- ``` {python}
319
- param_distance = f'{x_median},{y_median},1000'
320
- print(param_distance)
321
- ```
322
-
323
- Notre requête devient ainsi:
324
-
325
- ``` {python}
326
- url_api = f"{api_root}?page=1&after=10&format=json&q_mode=simple&qs=code_insee_commune_actualise" + "%3A%22" + f"{code_commune}" + "%22" + f"&size={size}&select=" + "%2A&sampling=neighbors" + f"&geodistance={param_distance}"
327
- print(url_api)
328
- ```
329
-
330
- ``` {python}
331
- dpe_geo_filter = get_dpe_from_url(url_api)
332
- m_geo_filter = interactive_map_dpe(dpe)
333
- ```
334
-
335
- ``` {python}
336
- #| echo : true
337
- #| eval: false
338
- # Afficher la carte
339
- m_geo_filter
340
- ```
341
-
342
294
### Un catalogue incomplet d'API existantes
343
295
344
296
De plus en plus de sites mettent des API à disposition des développeurs et autres curieux.
0 commit comments