駅すぱあと Python SDKを使って、定期区間控除を利用した経路探索を行う
本記事はヴァル研究所の支援として作成された記事です
駅すぱあとはAPIを公開しており、駅情報や経路探索などをAPI経由で行えます。メソッドはすべてGETメソッドで、情報取得系のみです。レスポンスはJSONまたはXMLで返ってきます。
この駅すぱあと APIを利用しやすくするSDKを開発しています。SDKはVBAとPythonで開発していますが、どちらも非公式SDKなので、公式への問い合わせはご遠慮ください。
今回は、Python SDKを使って、定期券利用時の運賃計算を行ってみます。特に、定期区間控除がある場合について解説しますので、実際の算出時の参考にしてください。Python SDKの実践的な使い方として、参考にしてください。
定期区間控除とは?
定期区間控除とは、定期券を利用している区間の運賃を控除する仕組みです。例えば、A駅からB駅までの定期券を持っている場合、A駅からC駅までの経路探索を行うと、A駅からB駅までの運賃は控除されます。交通費の精算などに使われ、経費精算での二重払いを防ぐために利用されます。
利用している機能
このデモでは、SDKの以下の機能を使っています。
必要な情報
SDKを利用する際にはAPIキーが必要です。無料トライアルがあるので、こちらから取得してください。
注意点
- SDKは非公式です。公式サポートへの問い合わせはご遠慮ください
インストール
インストールは pip
コマンドを利用してください。
pip install ekispert
初期化
先ほど取得したAPIキーを使ってSDKを初期化します。
from ekispert.client import Ekispert
client = Ekispert('YOUR_API_KEY')
定期経路シリアライズデータの作成
まず、定期券を利用している区間に関する経路データを作成します。探索する際には 定期経路文字列
も利用できますが、今回は 定期経路シリアライズデータ を使っています。
探索は courseExtremeQuery
を使います。以下のコードにて、八王子から新宿までの経路を探索し、定期経路シリアライズデータを取得します。 teiki
プロパティがある Course
オブジェクトを取得し、その中の teiki.serialize_data
を使います。
query = client.courseExtremeQuery()
query.via_list.append('八王子')
query.via_list.append('新宿')
courses = query.execute()
course = list(filter(lambda x: hasattr(x, 'teiki'), courses))[0]
serialize_data = course.teiki.serialize_data
この時に選択された路線情報は、以下のように取得できます。
for line in course.routes[0].lines:
print(line.name) # 例: JR中央線快速・東京行
定期経路シリアライズデータを使った経路探索
次に、取得した定期経路シリアライズデータを使って、定期区間控除を利用した経路探索を行います。以下のコードを実行します。
query = client.courseExtremeQuery()
query.via_list.append('八王子')
query.via_list.append('渋谷')
query.assign_teiki_serialize_data = serialize_data
courses = query.execute()
これで探索結果が取得できました。この時、 Course/Price
の中に Type = WithTeiki
があると、控除が発生しています。
for course in courses:
with_teiki = list(filter(lambda x: hasattr(x, 'type') and x.type == "WithTeiki", course.prices))
if with_teiki is None:
# 控除がない場合はスキップ
continue
with_teiki
には、料金の発生する区間情報が from_line_index
と to_line_index
に格納されています。これを使って、どの区間が料金発生しているかを確認できます。複数路線ある場合もあります。
print(course.routes[0].lines[with_teiki.from_line_index].name) # 例: JR埼京線通勤快速・新木場行
if with_teiki.from_line_index != with_teiki.to_line_index:
print(course.routes[0].lines[with_teiki.to_line_index].name)
運賃については、 Price.kind = "FareSummary"
のデータを参照します。さらにどういった経路を使ったかについては、以下のように Point
と Line
を使って取得できます。
price = list(filter(lambda x: x.kind == "FareSummary", course.prices))[0]
print(f"{price.one_way}円")
for i, point in enumerate(course.routes[0].points):
print(point.station.name)
if i != len(course.routes[0].points) - 1:
print(f" {course.routes[0].lines[i].name}")
print('--------------------------------')
たとえば以下のように出力されます。八王子から新宿までは定期を利用し、その後の区間は通常運賃が計算されます。
170円
八王子
JR中央線中央特快・東京行
新宿
JR埼京線(相鉄線直通)・海老名行
渋谷
--------------------------------
170円
八王子
JR中央線快速・東京行
三鷹
JR中央線中央特快・東京行
新宿
JR埼京線(相鉄線直通)・海老名行
渋谷
--------------------------------
410円
八王子
徒歩
京王八王子
京王線急行・新宿行
調布
京王線特急・新宿行
明大前
京王井の頭線急行・渋谷行
渋谷
--------------------------------
410円
八王子
徒歩
京王八王子
京王線特急・新宿行
明大前
京王井の頭線・渋谷行
渋谷
--------------------------------
820円
八王子
JR横浜線・東神奈川行
町田
小田急小田原線快速急行・新宿行
下北沢
京王井の頭線急行・渋谷行
渋谷
--------------------------------
まとめ
一口に交通費精算と言っても、普段使っている定期があったりすると途端に計算が複雑になります。従業員の定期情報がデータ化されていれば、こうした計算も自動化が可能です。経費精算の効率化のために、駅すぱあとAPIをご利用ください。
さらにPython SDKを使えば、Webシステムなどで簡単に駅すぱあとAPIを利用できます。ぜひ試してみてください。
Discussion