Skip to content

Commit 3eb0aeb

Browse files
authored
Relecture jusqu'aux API (#439)
* typo + 1 pip install * relecture
1 parent 102ce9f commit 3eb0aeb

File tree

2 files changed

+18
-62
lines changed

2 files changed

+18
-62
lines changed

content/manipulation/04a_webscraping_TP.qmd

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,7 @@ Les informations que nous aimerions obtenir au final dans un `DataFrame` sont ce
760760

761761
Pour la question 1, l'objectif est d'obtenir le code source d'un tableau comme
762762
celui qui suit
763-
(Pokemon [Nincada](http://pokemondb.net/pokedex/nincada).)
763+
(Pokemon [Nincada](http://pokemondb.net/pokedex/nincada)).
764764

765765
::: {.cell .markdown}
766766
<div class="grid-col span-md-6 span-lg-4">
@@ -995,7 +995,7 @@ import bs4
995995
import collections
996996
import pandas as pd
997997
998-
# pour le site que nous utilisons, le user agent de Python 3 n'est pas bien passé :
998+
# pour le site que nous utilisons, le user agent de Python 3 n'est pas bien passé :
999999
# on le change donc pour celui de Mozilla
10001000
10011001
req = urllib.request.Request('http://pokemondb.net/pokedex/national',
@@ -1076,9 +1076,9 @@ print(len(liste_pokemon)) #898
10761076
liste_pokemon[0:10]
10771077
```
10781078

1079-
Enfin, vous les
1080-
informations sur les dix premiers pokémons de la liste intégrées dans un
1081-
`DataFrame` prendront l'aspect suivant:
1079+
Enfin, vous pouvez intégrer les informations
1080+
des dix premiers pokémons à un
1081+
`DataFrame`, qui aura l'aspect suivant :
10821082

10831083
```{python}
10841084
#| include: false
@@ -1119,6 +1119,10 @@ et enregistrer en local les images.
11191119
```
11201120
:::
11211121

1122+
```{python}
1123+
!pip install scikit-image
1124+
```
1125+
11221126

11231127
```{python}
11241128
#| include: false

content/manipulation/04c_API_TP.qmd

Lines changed: 9 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ avec restrictions d'accès.
109109
110110

111111
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)) :
113113

114114
* Le __point d’entrée__ d’un service offert par une API se présente sous la forme d’une URL (adresse web).
115115
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`
160160
sur un url dont la structure est la suivante :
161161

162162
- 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
165165
sous la forme `nom_parameter=value`
166166

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 :
168168

169169
- Le nombre de pages, ce qui nous permet d'obtenir un certain nombre d'échos. On
170170
va seulement récupérer 10 pages ce qui correspond à une centaine d'échos. On va
@@ -177,7 +177,8 @@ fichiers
177177
on va récupérer les données dont le code commune est `01450`. D'après la doc,
178178
il convient de passer le code commune sous le format:
179179
`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 `"`.
181182
- D'autres paramètres annexes, suggérés par la documentation
182183

183184
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
191192

192193
Si vous introduisez cet URL dans votre navigateur, vous devriez aboutir
193194
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] :
195196

196197

197198
[^1]: Le JSON est un format très apprécié dans le domaine du *big data*
198199
car il permet de stocker de manière intelligente des données
199200
de structures diverses. Il
200201
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.
202203

203204
[^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.
204205

@@ -268,7 +269,7 @@ def interactive_map_dpe(dpe):
268269
sw = dpe[['latitude', 'longitude']].min().values.tolist()
269270
ne = dpe[['latitude', 'longitude']].max().values.tolist()
270271
271-
m = folium.Map(location = center, tiles='Stamen Toner')
272+
m = folium.Map(location = center, tiles='OpenStreetMap')
272273
273274
# I can add marker one by one on the map
274275
for i in range(0,len(dpe)):
@@ -290,55 +291,6 @@ m = interactive_map_dpe(dpe)
290291
m
291292
```
292293

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-
342294
### Un catalogue incomplet d'API existantes
343295

344296
De plus en plus de sites mettent des API à disposition des développeurs et autres curieux.

0 commit comments

Comments
 (0)