バスロケ、バスコンシェルジュDBへの問い合わせ

次のクラスファイルbus_db.pyが、自分の開発ディレクトリに置かれているとする。 (Google Driveの「2019年度>バス予測>DBクエリpython」に置く)

考えられる手順

  • 対象とするバス路線を決める > routeID
  • その路線の特定の時刻の運行IDを調べる > BusID
  • 年月日とBusID及び現在時刻を指定して、現在時刻以前に当該バスが経由するバス停ペアを通ったバスの所要時間(interval)を抽出
  • 予測にそれらの所要時間を利用 (全部得られるとは限らない)

下のプログラムは、現在時刻を始発時刻として、これから通る各バス停ペアごとに先行バスの所要時間を抽出したプログラム例

In [13]:
# -*- coding: utf-8 -*-
"""

バス停のIDは
http://8tops.yamanashi.ac.jp/~toyoki/buslog2016/getLocatiosYamanashi.php
で得ることができる。(テスト用に利用)


"""
from bus_db import bus_db
import pprint
db = bus_db()

# 特定日の特定バス(busID)運行を得る
BusID = "5019"     # 別例 4986
today = "20190419"  # 別例 20190422

# 
this_bus = db.getPassingTimeByBusID(BusID, today + "000000", today + "235959")
pprint.pprint(this_bus) # このバスの情報を出力してみる

present_time = this_bus[0]['time'][-6:]  # とりあえず始発時刻時点

# 始発時刻で、対象バスが経由するバス停ペアを通過した先行バス所要時間を抽出してみる
for n, b in enumerate(this_bus):
    # 2つのバス停間を指定時刻以前に通過したバスの所要時間を検索
    # 引数: 年月日(YYYYmmdd) 検索時刻(HHMMSS) 最初のバス停 次のバス停
    if n == len(this_bus)-1:
        break
    #print(b['PlatformID'])
    #print(this_bus[n+1]['PlatformID'])
    result = db.getForegoingData(today, present_time,
                                 b['PlatformID'], this_bus[n+1]['PlatformID'],
                                 1)
    foregoingBusData = {'start': b['PlatformID'], 'end': this_bus[n+1]['PlatformID'], 
                        'foregoingBus': result}
    pprint.pprint(foregoingBusData)
[{'OrderNum': 1, 'PlatformID': 766, 'delayTime': 22, 'time': '20190419184522'},
 {'OrderNum': 2, 'PlatformID': 765, 'delayTime': 135, 'time': '20190419184815'},
 {'OrderNum': 3, 'PlatformID': 763, 'delayTime': 201, 'time': '20190419185021'},
 {'OrderNum': 4, 'PlatformID': 715, 'delayTime': 343, 'time': '20190419185343'},
 {'OrderNum': 5, 'PlatformID': 717, 'delayTime': 313, 'time': '20190419185413'},
 {'OrderNum': 6, 'PlatformID': 719, 'delayTime': 313, 'time': '20190419185513'},
 {'OrderNum': 7, 'PlatformID': 720, 'delayTime': 313, 'time': '20190419185613'},
 {'OrderNum': 8, 'PlatformID': 721, 'delayTime': 343, 'time': '20190419185743'},
 {'OrderNum': 9, 'PlatformID': 723, 'delayTime': 410, 'time': '20190419185950'},
 {'OrderNum': 10,
  'PlatformID': 725,
  'delayTime': 409,
  'time': '20190419190049'},
 {'OrderNum': 11,
  'PlatformID': 727,
  'delayTime': 379,
  'time': '20190419190219'},
 {'OrderNum': 12,
  'PlatformID': 728,
  'delayTime': 349,
  'time': '20190419190249'},
 {'OrderNum': 13,
  'PlatformID': 792,
  'delayTime': 409,
  'time': '20190419190449'},
 {'OrderNum': 14,
  'PlatformID': 795,
  'delayTime': 417,
  'time': '20190419190557'},
 {'OrderNum': 15,
  'PlatformID': 793,
  'delayTime': 732,
  'time': '20190419191112'},
 {'OrderNum': 16,
  'PlatformID': 239,
  'delayTime': 716,
  'time': '20190419191356'},
 {'OrderNum': 17,
  'PlatformID': 236,
  'delayTime': 701,
  'time': '20190419191441'},
 {'OrderNum': 18,
  'PlatformID': 235,
  'delayTime': 746,
  'time': '20190419191526'},
 {'OrderNum': 19,
  'PlatformID': 133,
  'delayTime': 715,
  'time': '20190419191655'},
 {'OrderNum': 20,
  'PlatformID': 130,
  'delayTime': 700,
  'time': '20190419191740'},
 {'OrderNum': 21,
  'PlatformID': 127,
  'delayTime': 701,
  'time': '20190419191941'},
 {'OrderNum': 22,
  'PlatformID': 120,
  'delayTime': 656,
  'time': '20190419191956'}]
{'end': 765, 'foregoingBus': [], 'start': 766}
{'end': 763, 'foregoingBus': [], 'start': 765}
{'end': 715,
 'foregoingBus': [{'busID': 5014,
                   'endTime': '20190419171343',
                   'interval': 50.0,
                   'startTime': '20190419171253'}],
 'start': 763}
{'end': 717,
 'foregoingBus': [{'busID': 5014,
                   'endTime': '20190419171418',
                   'interval': 35.0,
                   'startTime': '20190419171343'}],
 'start': 715}
{'end': 719,
 'foregoingBus': [{'busID': 5014,
                   'endTime': '20190419171513',
                   'interval': 55.0,
                   'startTime': '20190419171418'}],
 'start': 717}
{'end': 720, 'foregoingBus': [], 'start': 719}
{'end': 721, 'foregoingBus': [], 'start': 720}
{'end': 723,
 'foregoingBus': [{'busID': 5014,
                   'endTime': '20190419171910',
                   'interval': 60.0,
                   'startTime': '20190419171810'}],
 'start': 721}
{'end': 725, 'foregoingBus': [], 'start': 723}
{'end': 727,
 'foregoingBus': [{'busID': 5014,
                   'endTime': '20190419172148',
                   'interval': 103.0,
                   'startTime': '20190419172005'}],
 'start': 725}
{'end': 728,
 'foregoingBus': [{'busID': 5014,
                   'endTime': '20190419172242',
                   'interval': 54.0,
                   'startTime': '20190419172148'}],
 'start': 727}
{'end': 792,
 'foregoingBus': [{'busID': 5014,
                   'endTime': '20190419172406',
                   'interval': 84.0,
                   'startTime': '20190419172242'}],
 'start': 728}
{'end': 795,
 'foregoingBus': [{'busID': 5014,
                   'endTime': '20190419172421',
                   'interval': 15.0,
                   'startTime': '20190419172406'}],
 'start': 792}
{'end': 793,
 'foregoingBus': [{'busID': 5014,
                   'endTime': '20190419172531',
                   'interval': 70.0,
                   'startTime': '20190419172421'}],
 'start': 795}
{'end': 239,
 'foregoingBus': [{'busID': 5014,
                   'endTime': '20190419172902',
                   'interval': 211.0,
                   'startTime': '20190419172531'}],
 'start': 793}
{'end': 236,
 'foregoingBus': [{'busID': 4921,
                   'endTime': '20190419183104',
                   'interval': 75.0,
                   'startTime': '20190419182949'}],
 'start': 239}
{'end': 235,
 'foregoingBus': [{'busID': 4921,
                   'endTime': '20190419183149',
                   'interval': 45.0,
                   'startTime': '20190419183104'}],
 'start': 236}
{'end': 133,
 'foregoingBus': [{'busID': 4921,
                   'endTime': '20190419183404',
                   'interval': 135.0,
                   'startTime': '20190419183149'}],
 'start': 235}
{'end': 130, 'foregoingBus': [], 'start': 133}
{'end': 127,
 'foregoingBus': [{'busID': 4921,
                   'endTime': '20190419183757',
                   'interval': 188.0,
                   'startTime': '20190419183449'}],
 'start': 130}
{'end': 120,
 'foregoingBus': [{'busID': 4921,
                   'endTime': '20190419183927',
                   'interval': 90.0,
                   'startTime': '20190419183757'}],
 'start': 127}
In [16]:
# BusIDから路線名を得る
from bus_db import bus_db
db = bus_db()
db.getRouteInfoByBusID('5019')
Out[16]:
[{'generalName': '敷島営業所〜湯村〜県立中央病院〜甲府駅〜千秋橋〜山梨大学附属病院',
  'GenRouteID': 60,
  'routeID': 566,
  'routeName': '山梨大学医学部付属病院発 甲府駅行き'}]
In [11]:
# 時刻表を得る
db.getTimeTableByBusID('5019')
Out[11]:
[{'ID': 766,
  'stopName': '山梨大学医学部附属病院',
  'platformName': '',
  'OrderNum': 1,
  'time': datetime.timedelta(0, 67500)},
 {'ID': 765,
  'stopName': '井之口西',
  'platformName': '',
  'OrderNum': 2,
  'time': datetime.timedelta(0, 67560)},
 {'ID': 763,
  'stopName': '常永駅',
  'platformName': '',
  'OrderNum': 3,
  'time': datetime.timedelta(0, 67620)},
 {'ID': 715,
  'stopName': '上河東四ツ角',
  'platformName': '',
  'OrderNum': 4,
  'time': datetime.timedelta(0, 67680)},
 {'ID': 717,
  'stopName': '中島',
  'platformName': '',
  'OrderNum': 5,
  'time': datetime.timedelta(0, 67740)},
 {'ID': 719,
  'stopName': '押原',
  'platformName': '',
  'OrderNum': 6,
  'time': datetime.timedelta(0, 67800)},
 {'ID': 720,
  'stopName': '押越',
  'platformName': '',
  'OrderNum': 7,
  'time': datetime.timedelta(0, 67860)},
 {'ID': 721,
  'stopName': '国母駅入口',
  'platformName': '',
  'OrderNum': 8,
  'time': datetime.timedelta(0, 67920)},
 {'ID': 723,
  'stopName': '国母八丁目',
  'platformName': '',
  'OrderNum': 9,
  'time': datetime.timedelta(0, 67980)},
 {'ID': 725,
  'stopName': '上条',
  'platformName': '',
  'OrderNum': 10,
  'time': datetime.timedelta(0, 68040)},
 {'ID': 727,
  'stopName': '甲府市地方卸売市場入口',
  'platformName': '',
  'OrderNum': 11,
  'time': datetime.timedelta(0, 68160)},
 {'ID': 728,
  'stopName': '国母小学校',
  'platformName': '',
  'OrderNum': 12,
  'time': datetime.timedelta(0, 68220)},
 {'ID': 792,
  'stopName': '国母・下石田四ツ角',
  'platformName': '',
  'OrderNum': 13,
  'time': datetime.timedelta(0, 68280)},
 {'ID': 795,
  'stopName': '国母一丁目',
  'platformName': '',
  'OrderNum': 14,
  'time': datetime.timedelta(0, 68340)},
 {'ID': 793,
  'stopName': '千秋橋',
  'platformName': '',
  'OrderNum': 15,
  'time': datetime.timedelta(0, 68340)},
 {'ID': 239,
  'stopName': '伊勢一丁目',
  'platformName': '',
  'OrderNum': 16,
  'time': datetime.timedelta(0, 68520)},
 {'ID': 236,
  'stopName': '相生三丁目',
  'platformName': '',
  'OrderNum': 17,
  'time': datetime.timedelta(0, 68580)},
 {'ID': 235,
  'stopName': '甲府市自治研修センター南',
  'platformName': '',
  'OrderNum': 18,
  'time': datetime.timedelta(0, 68580)},
 {'ID': 133,
  'stopName': '甲府地方裁判所',
  'platformName': '',
  'OrderNum': 19,
  'time': datetime.timedelta(0, 68700)},
 {'ID': 130,
  'stopName': '丸の内三丁目',
  'platformName': '',
  'OrderNum': 20,
  'time': datetime.timedelta(0, 68760)},
 {'ID': 127,
  'stopName': '県会議事堂',
  'platformName': '',
  'OrderNum': 21,
  'time': datetime.timedelta(0, 68880)},
 {'ID': 120,
  'stopName': '甲府駅バスターミナル',
  'platformName': '4番',
  'OrderNum': 22,
  'time': datetime.timedelta(0, 68940)}]
In [18]:
# RouteIDを与えて、乗り場列を得る
db.getPlatformsByRouteID(566)
Out[18]:
[{'ID': 766,
  'LAT': 35.61037209965,
  'LNG': 138.53904336691,
  'OrderNum': 1,
  'stopName': '山梨大学医学部附属病院',
  'platformName': ''},
 {'ID': 765,
  'LAT': 35.61464164653,
  'LNG': 138.53547871113,
  'OrderNum': 2,
  'stopName': '井之口西',
  'platformName': ''},
 {'ID': 763,
  'LAT': 35.617552570563,
  'LNG': 138.53364944458,
  'OrderNum': 3,
  'stopName': '常永駅',
  'platformName': ''},
 {'ID': 715,
  'LAT': 35.619392830421,
  'LNG': 138.53262484074,
  'OrderNum': 4,
  'stopName': '上河東四ツ角',
  'platformName': ''},
 {'ID': 717,
  'LAT': 35.620980129554,
  'LNG': 138.53453457355,
  'OrderNum': 5,
  'stopName': '中島',
  'platformName': ''},
 {'ID': 719,
  'LAT': 35.623729483857,
  'LNG': 138.53775858879,
  'OrderNum': 6,
  'stopName': '押原',
  'platformName': ''},
 {'ID': 720,
  'LAT': 35.626459121968,
  'LNG': 138.5409745574,
  'OrderNum': 7,
  'stopName': '押越',
  'platformName': ''},
 {'ID': 721,
  'LAT': 35.631486470316,
  'LNG': 138.54613512754,
  'OrderNum': 8,
  'stopName': '国母駅入口',
  'platformName': ''},
 {'ID': 723,
  'LAT': 35.634021825722,
  'LNG': 138.54840427637,
  'OrderNum': 9,
  'stopName': '国母八丁目',
  'platformName': ''},
 {'ID': 725,
  'LAT': 35.636524402059,
  'LNG': 138.5510596633,
  'OrderNum': 10,
  'stopName': '上条',
  'platformName': ''},
 {'ID': 727,
  'LAT': 35.639687389482,
  'LNG': 138.55457603931,
  'OrderNum': 11,
  'stopName': '甲府市地方卸売市場入口',
  'platformName': ''},
 {'ID': 728,
  'LAT': 35.640925520002,
  'LNG': 138.55614513159,
  'OrderNum': 12,
  'stopName': '国母小学校',
  'platformName': ''},
 {'ID': 792,
  'LAT': 35.644583124527,
  'LNG': 138.56072366238,
  'OrderNum': 13,
  'stopName': '国母・下石田四ツ角',
  'platformName': ''},
 {'ID': 795,
  'LAT': 35.645337293911,
  'LNG': 138.56167048216,
  'OrderNum': 14,
  'stopName': '国母一丁目',
  'platformName': ''},
 {'ID': 793,
  'LAT': 35.647416672046,
  'LNG': 138.56425076723,
  'OrderNum': 15,
  'stopName': '千秋橋',
  'platformName': ''},
 {'ID': 239,
  'LAT': 35.650513842487,
  'LNG': 138.568139970303,
  'OrderNum': 16,
  'stopName': '伊勢一丁目',
  'platformName': ''},
 {'ID': 236,
  'LAT': 35.653144490411,
  'LNG': 138.567252159119,
  'OrderNum': 17,
  'stopName': '相生三丁目',
  'platformName': ''},
 {'ID': 235,
  'LAT': 35.655633391532,
  'LNG': 138.566337525845,
  'OrderNum': 18,
  'stopName': '甲府市自治研修センター南',
  'platformName': ''},
 {'ID': 133,
  'LAT': 35.659139951595,
  'LNG': 138.56678545475,
  'OrderNum': 19,
  'stopName': '甲府地方裁判所',
  'platformName': ''},
 {'ID': 130,
  'LAT': 35.661190640351,
  'LNG': 138.567225337029,
  'OrderNum': 20,
  'stopName': '丸の内三丁目',
  'platformName': ''},
 {'ID': 127,
  'LAT': 35.664736180934,
  'LNG': 138.567807376385,
  'OrderNum': 21,
  'stopName': '県会議事堂',
  'platformName': ''},
 {'ID': 120,
  'LAT': 35.66667777165703,
  'LNG': 138.56864690780685,
  'OrderNum': 22,
  'stopName': '甲府駅バスターミナル',
  'platformName': '4番'}]
In [ ]:
# そのほかの関数はソースを参照 (他にほしい関数があれば連絡してほしい)