Google Colaboratoryを使って、BODIK APIを使ったPythonプログラムを書いてみます。
課題3:BODIK APIの検索結果をPandasのデータフレームに入れる
WebAPIの実行結果をPandasのデータフレームに格納したいというケースがある。
BODIK APIの場合、どうやるのだろうか?
問題:BODIK APIの検索結果をPandasのデータフレームに格納する。
基本情報
- Pandasは、Pythonで利用できるデータ分析のためのライブラリです。
- 通常はCSVやExcelファイルなどを読み込んでデータフレームを作成し、データフレームを使ってデータ分析を行います。
- 二次元配列からPandasのデータフレームを作成することができます。
- DataFrameのコンストラクタの第一引数にデータの二次元配列、columnsに項目名の配列を指定して生成します。
- 辞書の項目名の一覧は、辞書.keys()で取得できるが、これは配列ではない。配列にするには、list(辞書.keys())が必要です。
- 辞書の値の一覧は、辞書.values()で取得できるが、これは配列ではない。配列にするには、list(辞書.values())が必要です。
pythonで記述
まず、BODIK APIでAEDを検索する。
import requests import json api_server = 'https://wapi.bodik.jp' apiname = 'aed' url = f'{api_server}/{apiname}' response = requests.get(url) data = response.json() features = data['resultsets']['features'] for feature in features: properties = feature['properties'] print(properties)
このpropertiesを順次データフレームに入れる。
項目名の配列を作成する
まず、features(featureの配列)から先頭のfeatureをとりだし、項目名の配列を作成する。
feature_0 = features[0] properties = feature_0['properties'] headers = list(properties.keys())
データの二次元配列を作成する
次に、propertiesの値だけの配列を作成し、親の配列に格納することで、二次元配列を作成する。
array = [] for feature in features: properties = feature['properties'] values = list(properties.values()) array.append(values)
データフレームを作成する
import pandas as pd df = pd.DataFrame(array, columns=headers)
プログラム
まず、BODIK APIの実行結果から、項目名の配列(ヘッダー部)を作成する。
import requests import json import pandas as pd api_server = 'https://wapi.bodik.jp' apiname = 'aed' url = f'{api_server}/{apiname}' response = requests.get(url) data = response.json() features = data['resultsets']['features'] # ヘッダー部 feature_0 = features[0] properties = feature_0['properties'] headers = list(properties.keys()) print(headers)
次に、BODIK APIの実行結果から、データ部分を取り出す。
import requests import json import pandas as pd api_server = 'https://wapi.bodik.jp' apiname = 'aed' url = f'{api_server}/{apiname}' response = requests.get(url) data = response.json() features = data['resultsets']['features'] # ヘッダー部 feature_0 = features[0] properties = feature_0['properties'] headers = list(properties.keys()) print(headers) # データ部 for feature in features: properties = feature['properties'] values = list(properties.values()) print(values)
BODIK APIの実行結果からPandasのデータフレームを作成する。データ部は2次元配列(配列の中に配列をいれたもの)にする。
import requests import json import pandas as pd api_server = 'https://wapi.bodik.jp' apiname = 'aed' url = f'{api_server}/{apiname}' response = requests.get(url) data = response.json() features = data['resultsets']['features'] # ヘッダー部 feature_0 = features[0] properties = feature_0['properties'] headers = list(properties.keys()) # データ部 array = [] for feature in features: properties = feature['properties'] values = list(properties.values()) array.append(values) # データフレームを作成 df = pd.DataFrame(array, columns=headers) # データフレームを表示する df
BODIK APIの検索結果をPandasのデータフレームに格納することができました。この先は、Pandasを使ってデータを分析することができます。
プログラム(完成版)
コメントとエラー処理を入れて完成です。
Google Colaboratoryの場合、画面出力は最後にないとうまく表示されないので、出力部分を最後に移動させました。
import requests import json import pandas as pd df = None try: api_server = 'https://wapi.bodik.jp' apiname = 'aed' url = f'{api_server}/{apiname}' # BODIK APIを呼び出す response = requests.get(url, timeout=5.0) # APIの実行結果を確認する if response is not None and response.status_code == 200: # 結果をJSONで取得する data = response.json() # BODIK APIの検索結果を解析する if data is not None and 'resultsets' in data: resultsets = data['resultsets'] if 'features' in resultsets: features = resultsets['features'] # すくなくとも、1つのデータが必要 if len(features) > 0: # ヘッダー部 feature_0 = features[0] properties = feature_0['properties'] headers = list(properties.keys()) # データ部 array = [] for feature in features: properties = feature['properties'] values = list(properties.values()) array.append(values) # データフレームを作成 df = pd.DataFrame(array, columns=headers) else: print('検索結果は0件') else: print('no features', resultsets) else: print('no resultsets', data) else: print('status_code', response) except Exception as e: print('Exception', e) # データフレームを表示する df
お疲れ様でした。