当記事では公共交通オープンデータセンターにあるドコモ・バイクシェアのstation_information情報をpythonを使ってダウンロードし、CSVファイルにする方法を説明します。
1. 公共交通オープンデータセンターとユーザ登録
公共交通オープンデータセンターとは:
(https://www.odpt.org/overview/ より引用)
公共交通オープンデータセンターでは、公共交通オープンデータ協議会に参画する交通事業者のデータを、一般の開発者やICTベンダー等にワンストップで提供します。
- 鉄道・バス・航空・旅客船事業者のデータを、リアルタイムデータ等も含め、広くサポートします。
- 事前処理(クレンジング)を行ったデータを、REST APIを通じて、共通のJSON形式で提供します。
- バスや旅客船のデータを中心に、GTFS形式でのデータ提供も行います。
「公共交通オープンデータを使用したい場合は、公共交通オープンデータセンター開発者サイトで、ユーザ登録が必要です。」となっているのですが、今回使用するドコモ・バイクシェアのstation_information情報はアクセストークンなしでアクセスできてしまいます。なので、以下は参考までに!
ユーザ登録が完了すると開発者サイトに記載されているAPI仕様に沿って、公共交通データを利用することが可能になります。ユーザ登録は無料です。
登録を申請いただいた後、申請内容に問題がない場合、最大2営業日程度で承認完了のメールをお送りします。
と申請フォームには書かれていましたが、私の場合は、登録して1時間もぜずに(10分くらい?)承認完了のメールが来ました。
2. アクセストークンの確認(参考)
1でも書きましたが、今回使用するドコモ・バイクシェアのstation_information情報はアクセストークンなしでアクセスできてしまいます。なので、以下は参考までに!
登録が完了したら、アクセストークンを確認しましょう。
公共交通オープンデータセンター開発者サイトにログインします。
画面右上の Account から、 「アクセストークンの確認・追加」をクリックします。
デフォルトで1つ作成されています。アクセストークンはここからコピーしてください。
3. ドコモ・バイクシェア バイクシェア関連情報(GBFS形式)
こちらにあります:
https://ckan.odpt.org/dataset/c_bikeshare_gbfs-d-bikeshare
GBFS形式で提供されています。GBFS(General Bikeshare Feed Specification)形式はマイクロモビリティの標準的なデータフォーマットとして規格化されているJSON形式のフォーマットです。
詳細は、以下のQiitaの記事がわかりやすかったです:
今回はこちらのバイクシェア関連情報 station_informationをpythonからAPIでアクセスして、CSVファイルに保存してみます。
station_information はいわゆるサイクルポート情報で、サイクルポートの名前や経度・緯度、収容台数などの情報です。
4. station_informationをpythonからAPIでアクセスして、CSVファイルに保存
では早速やってみます。
バイクシェア関連情報 station_information
にアクセスすると以下のようなWebページが表示されます。
私は最初、点線で囲まれたURLでアクセストークンを指定して情報取得していたのですが、よくみると一番上にアクセストークンなしのURLがありましたので(上のイメージの実線の四角で囲まれた部分)、こちらのURLを使用することにします。
このURLをクリックするとわかりますが、アクセスすればそのままGBFS形式のJSONが返ってきます。よってそのJSONをpandasのDataFrameに入れた後、csvとして保存すればOKです。
以下はstation_information.csv
に保存する例です:
import requests
import json
import pandas as pd
req_url = 'https://api-public.odpt.org/api/v4/gbfs/docomo-cycle-tokyo/station_information.json'
# URLにアクセス
request = requests.get(req_url)
# 必要な部分のみ抜き出し
data_json = json.loads(request.text)['data']['stations']
# pandasのDataFrameに入れる
df = pd.read_json(json.dumps(data_json))
# 保存
df.to_csv('station_information.csv', index=False)
以上です。