cours-2024-2025 | Documents de mes cours pour 2024-2025 | FX Jollois
Nous allons voir ici comment utiliser une API simple pour récupérer des données.
A partir des données de la base SIRENE (et plus particulièrement le fichier StockEtablissement
), nous voulons compléter les informations par les coordonnées géographiques via l’API Adresse (guide).
time.sleep(1)
par exemple (ne pas oublier import time
) pour retarder d’une seconde ce qui suitPour lire le fichier StockEtablissement
, nous utilisons la librarie pandas
nrows = 10
pour lire uniquement les 10 premières lignesskiprows = range(1, 6)
permet de ne pas prendre en considération les lignes 1 à 5 (et donc de garder la ligne d’en-têtes - noms de colonnes)import pandas
sirene = pandas.read_csv("StockEtablissement_utf8_1000.csv", nrows = 1000)
sirene
Le dataframe étant trop large, toutes les colonnes ne sont pas affichées. Pour avoir les colonnes contenant l’adresse, nous pouvons sélectionner celles-ci directement, comme ci-dessous par exemple
sirene[["siren", "siret", "numeroVoieEtablissement", "indiceRepetitionEtablissement",
"typeVoieEtablissement", "libelleVoieEtablissement",
"codePostalEtablissement", "libelleCommuneEtablissement"]]
Noter la présence de
NaN
dans les numéros de voie. Pour le prendre en compte, vous pouvez utiliser la fonctionisna()
de la librairiepandas
, permettant de tester si une valeur estNaN
.
Pour stocker le résultat, il faut écrire dans un fichier (nous allons garder le format csv
).
index = False
permet de ne pas avoir l’index des lignes (inutile dans notre cas)header = False
permet de ne pas ajouter les noms des colonnesmode = "a"
(pour append) permet d’ajouter des lignes à un fichier, sans écraser ce qu’il y a déjà dedansdataframe.to_csv("export_for_search.csv", index = False)
A partir d’une adresse (par exemple, le 143 Avenue de Versailles, Paris), nous allons chercher les coordonnées géographiques de ce lieu.
Pour cela, nous avons besoin du package requests
(généralement déjà présent).
import requests
adresse = "143+avenue+Versailles+paris"
url = "https://api-adresse.data.gouv.fr/search/"
recherche = url + "?q=" + adresse
reponse = requests.get(recherche)
reponse
Si le résultat est <Response [200]>
, c’est que tout est OK. Sinon, se reporter à la liste des erreurs
On peut ensuite récupérer les résultats au format JSON
reponse.json()
Dans notre cas, il y a plusieurs résultats (dans le champs features
). Généralement, le premier est celui avec le score
le plus élevé.
CSV
Comme indiqué sur la page de l’API, il est possible de requêter sur plusieurs adresses, via un fichier CSV
.
Pour faire cela en Python, voici comment on peut faire, en partant d’un fichier CSV
créé en amont à partir des données SIRENE (voir par exemple export_for_search.csv
)
import requests
url = "https://api-adresse.data.gouv.fr/search/csv/"
fichier = open("export_for_search.csv", "rb") # ouverture en lecture ("r") binaire ("b")
r = requests.post(url, files = {"data": fichier})
r.text # contenu du résultat dans un format CSV
Une fois le résultat obtenu, on peut le sauvegarder dans un fichier texte, avec l’extension csv
par exemple. Le paramètre encoding
permet de gérer l’encodage (UTF-8 est souvent à préférer, pour information).
fichier_resultat = open("export_for_search_results.csv", "w", encoding = "utf-8")
fichier_resultat.write(r.text)
fichier_resultat.close()
Une fois cela fait, on peut importer le résulat dans un DataFrame.
pandas.read_csv("export_for_search_results.csv")
Il ne reste plus qu’à faire correctement la jointure avec le premier fichier pour compléter les informations.
Ecrire le programme permettant de compléter le fichier complet de la base SIRENE. En sortie, on feut un fichier csv
avec l’ensemble des informations présentes dans le fichier original, avec en plus les coordonnées (latitude et longitude).