Ingestion de données rationalisée avec pandas
Amany Mahfouz
Instructor




# Afficher les colonnes contenant des données imbriquées
print(bookstores[["categories", "coordinates", "location"]].head(3))
categories \
0 [{'alias': 'bookstores', 'title': 'Bookstores'}]
1 [{'alias': 'bookstores', 'title': 'Bookstores'...
2 [{'alias': 'bookstores', 'title': 'Bookstores'}]
coordinates \
0 {'latitude': 37.7975997924805, 'longitude': -1...
1 {'latitude': 37.7885846793652, 'longitude': -1...
2 {'latitude': 37.7589836120605, 'longitude': -1...
location
0 {'address1': '261 Columbus Ave', 'address2': '...
1 {'address1': '50 2nd St', 'address2': '', 'add...
2 {'address1': '866 Valencia St', 'address2': ''...
pandas.io.json offre des outils pour lire et écrire des JSONimportjson_normalize()pd.DataFrame())attribute.nestedattributesepimport pandas as pd import requestsfrom pandas.io.json import json_normalize# Configurer les en-têtes, les paramètres et le point de terminaison de l'API api_url = "https://api.yelp.com/v3/businesses/search" headers = {"Authorization": "Bearer {}".format(api_key)} params = {"term": "bookstore", "location": "San Francisco"}# Appeler l'API et extraire les données JSON response = requests.get(api_url, headers=headers, params=params) data = response.json()
# Aplatir les données et charger dans un dataframe, avec des séparateurs _
bookstores = json_normalize(data["businesses"], sep="_")
print(list(bookstores))
['alias',
'categories',
'coordinates_latitude',
'coordinates_longitude',
...
'location_address1',
'location_address2',
'location_address3',
'location_city',
'location_country',
'location_display_address',
'location_state',
'location_zip_code',
...
'url']
print(bookstores.categories.head())
0 [{'alias': 'bookstores', 'title': 'Bookstores'}]
1 [{'alias': 'bookstores', 'title': 'Bookstores'...
2 [{'alias': 'bookstores', 'title': 'Bookstores'}]
3 [{'alias': 'bookstores', 'title': 'Bookstores'}]
4 [{'alias': 'bookstores', 'title': 'Bookstores'...
Name: categories, dtype: object
json_normalize()record_path : chaîne/liste d'attributs pointant vers les données imbriquéesmeta : liste d'autres attributs à charger dans le dataframemeta_prefix : chaîne à préfixer aux noms de colonnes meta# Aplatir les catégories et ajouter les détails d'entreprise df = json_normalize(data["businesses"], sep="_",record_path="categories",meta=["name", "alias", "rating", ["coordinates", "latitude"], ["coordinates", "longitude"]],meta_prefix="biz_")
print(df.head(4))
alias title biz_name \
0 bookstores Bookstores City Lights Bookstore
1 bookstores Bookstores Alexander Book Company
2 stationery Cards & Stationery Alexander Book Company
3 bookstores Bookstores Borderlands Books
biz_alias biz_rating biz_coordinates_latitude \
0 city-lights-bookstore-san-francisco 4.5 37.797600
1 alexander-book-company-san-francisco 4.5 37.788585
2 alexander-book-company-san-francisco 4.5 37.788585
3 borderlands-books-san-francisco 5.0 37.758984
biz_coordinates_longitude
0 -122.406578
1 -122.400631
2 -122.400631
3 -122.421638
Ingestion de données rationalisée avec pandas