Lean Baseball

No Engineering, No Baseball.

【Python】bottle, Beautifulsoup, geopyを使って野球の地図を作ってみました

f:id:shinyorke:20150418225833p:plain

最近、Certified ScrumMaster(認定スクラムマスター)を無事GETした私ですこんばんは!*1

今日はこちらの勉強会(もくもく会)でいい感じのモノが出来たので、ちょいと紹介したいと思います。

mokupy.connpass.com

スターティングメンバー

スタメン表っぽくポジションを入れましたが、特に意味はありません*2

  1. (2B)このエントリーの対象読者

  2. (LF)背景

  3. (RF)Beautifulsoupでスクレイピング

  4. (3B)geopyでらくらくGeocoding

  5. (1B)bottle + Google Map APIでサクッと地図アプリを作る

  6. (CF)完成!

  7. (C)今後の展望

  8. (SS)【Appendix】Pythonエンジニア養成読本について

  9. (P)【Appendix】Pythonもくもく会

(2B)このエントリーの対象読者

以下の人にオススメします。

例によって野球ネタですが、今回は特に野球の専門知識は必要ありません。

また、例のごとくコードも公開しましたので、真似をしてみたい方が居ましたらどうぞ好きに持って行ってください。

Shinichi-Nakagawa/retrosheet_ballpark_database · GitHub

(LF)背景

以前のエントリーでRetrosheetという、MLBを代表するデータを使いやすくしたのはいいのですが、以下の問題がありました。

  • どこの球場で試合をしたか?という情報が一目でわからない
  • 試合データ(Game Logs)に球場を示すID情報があるが、そもそもIDに紐づく球場情報が無い

コード値だけあって、肝心の球場情報が無い、どうしよう!!!、、、と思い、本家のサイト(http://www.retrosheet.org/)を調べた所、どうやらこのページが球場情報らしい、とわかりました。

Park Directory

とまあこんな感じでページが特定できたので、

  • サイトをスクレイピングして球場リストを作成
  • 球場名をキーワードにGeocodingを実施して緯度・経度をデータとして追加
  • Database(SQLite3)に突っ込んでGoogle Mapに表示

という所までやってみよう!と思い、早速手を付けました。

(RF)Beautifulsoupでスクレイピング

スクレイピングPythonでは定番のライブラリ、Beautifulsoupを使いました。

kondou.com - Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)

書いたコードはこんな感じ、小難しい構成のHTMLではなかったので比較的ラクでした。

Retrosheet球場一覧をスクレイピング&Geocoding

(3B)geopyでらくらくGeocoding

球場の名前と(謎の)IDは楽に取れましたが、Geocoding(住所や建物名から緯度・経度を取得するやつ)については悩みました。

んが、適当にググった所、いい感じのライブラリを発見しました。

github.com

このライブラリは、GoogleやBing、Open Street Map(OSM)といった地図プロバイダーのGeocoding/Reverse geocoding APIに対するラッパー実装で、たったこれだけの実装でGeocodingができちゃう中々便利なコです。

geopy

たった2行で欲しいデータが取れちゃうなんて便利です。

今回は「Nominatim*3」という、OSMのGeocoding APIを使い、スクレイピングした球場名をクエリーに緯度経度をゲットしました。

(1B)bottle + Google Map APIでサクッと地図アプリを作る

その後、適当にSQLite3のデータベースを作成(詳細はcreate_database.pyを参照)、早速可視化するためGoogle Map APIを使って超簡単な地図アプリを作りました。

今回はフルスタックなWebアプリを作る気が無かったので、こちらを参考にして「bottle」という軽量Web Frameworkで実装しました。

Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)

Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)

bottlepy.org

アプリ本体はこんな感じ。本当はSQLAlchemyのラッパーを使いたかったのですが、時間が無かったのでベタ書きしました(格好わるいorz)

bottle + Google Mapなアプリ

HTMLテンプレート(views/map.tpl)はこちら、自分のHTML&JS力の無さに泣ける...orz

htmlテンプレート(野球な地図アプリ)

これでとりあえずDatabaseの中身を見る地図アプリが完成しました。

(CF)完成!

地図アプリを実行します。

python map.py

localhost( http://localhost:8000 )にアクセスして、無事地図が見えました(^O^)

f:id:shinyorke:20150419001814p:plain

大雑把な位置は合ってるっぽいです。

f:id:shinyorke:20150419001839p:plain

セーフコ・フィールドマリナーズ本拠地)は多少ズレてますがまあこれぐらいなら許容範囲でしょう。

このへんはGeocoding APIを変えたりしたら解決する可能性があります。

とりあえず目的は達成しました!!!

(C)今後の展望

何とかデータは出来たので、今後の展望(というかやりたいこと)を上げます。

(SS)【Appendix】Pythonエンジニア養成読本について

今回はbottleを使ってWebアプリを書きました。その際こちらの書籍が大変参考になりました(ステマ

Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)

Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)

写経しながらGoogle Mapのコードを積み重ねて書くという感じでやったのですが、2時間もかからずに動くアプリが書けました。

PythonでWebアプリが書きたい、データ解析やインフラなコード(Ansible)をやりたい!という方は是非読んでみてください。

初心者だけでなく、中級・上級者にもオススメです!

(P)【Appendix】Pythonもくもく会

このエントリーの最初に書いたとおり、こちらのエントリーのコードはこのもくもく会で作りました。

mokupy.connpass.com

会の進め方はPython mini Hack-a-thon*5とほとんど一緒なのですが、違いとしては、

  • 発表はやりたい人だけやる
  • おしゃべりはほとんど無し、TwitterのTLもあまり流れていない

とまあこんな感じです。

会話や質疑応答、発表を通じた学びを得難いですが、ノマド的に集中して作業や学習をするのにはいいもくもく会だと思いました。

おしゃべりが多い・少ない、発表ある・なしはそれぞれ一長一短あるので、自分のやることや気分に合わせて使い分けたい(というか両方出たい)なあと思う今日このごろです。

そろそろ寝ます。

*1:3月に研修、一ヶ月経った今週Webテストを受けて無事GETしました。なお、一回落ちた模様(二回目で受かった)

*2:ゴードン、イエリッチ、スタントン、プラド、モース、イチロー、リアルミュート、ヘチュバリア、フェルプスの順で入れただけ(4/17マイアミ・マーリンズのスターティングメンバー表より)

*3:OpenStreetMap Nominatim: Search

*4:メジャーリーグ各球団のフライト総距離を調べてみた:<MLB>:僕自身なんJをまとめる喜びはあった マリナーズアメリカンリーグ北地区だからね。しょうがないね。

*5:レポートはこちら