最近、Certified ScrumMaster(認定スクラムマスター)を無事GETした私ですこんばんは!*1
今日はこちらの勉強会(もくもく会)でいい感じのモノが出来たので、ちょいと紹介したいと思います。
スターティングメンバー
スタメン表っぽくポジションを入れましたが、特に意味はありません*2
(2B)このエントリーの対象読者
(LF)背景
(RF)Beautifulsoupでスクレイピング
(3B)geopyでらくらくGeocoding
(CF)完成!
(C)今後の展望
(SS)【Appendix】Pythonエンジニア養成読本について
(2B)このエントリーの対象読者
以下の人にオススメします。
例によって野球ネタですが、今回は特に野球の専門知識は必要ありません。
また、例のごとくコードも公開しましたので、真似をしてみたい方が居ましたらどうぞ好きに持って行ってください。
Shinichi-Nakagawa/retrosheet_ballpark_database · GitHub
(LF)背景
以前のエントリーでRetrosheetという、MLBを代表するデータを使いやすくしたのはいいのですが、以下の問題がありました。
- どこの球場で試合をしたか?という情報が一目でわからない
- 試合データ(Game Logs)に球場を示すID情報があるが、そもそもIDに紐づく球場情報が無い
コード値だけあって、肝心の球場情報が無い、どうしよう!!!、、、と思い、本家のサイト(http://www.retrosheet.org/)を調べた所、どうやらこのページが球場情報らしい、とわかりました。
とまあこんな感じでページが特定できたので、
という所までやってみよう!と思い、早速手を付けました。
(RF)Beautifulsoupでスクレイピング
スクレイピングはPythonでは定番のライブラリ、Beautifulsoupを使いました。
kondou.com - Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)
書いたコードはこんな感じ、小難しい構成のHTMLではなかったので比較的ラクでした。
Retrosheet球場一覧をスクレイピング&Geocoding
(3B)geopyでらくらくGeocoding
球場の名前と(謎の)IDは楽に取れましたが、Geocoding(住所や建物名から緯度・経度を取得するやつ)については悩みました。
んが、適当にググった所、いい感じのライブラリを発見しました。
このライブラリは、GoogleやBing、Open Street Map(OSM)といった地図プロバイダーのGeocoding/Reverse geocoding APIに対するラッパー実装で、たったこれだけの実装でGeocodingができちゃう中々便利なコです。
たった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)
- 作者: 鈴木たかのり,清原弘貴,嶋田健志,池内孝啓,関根裕紀,若山史郎
- 出版社/メーカー: 技術評論社
- 発売日: 2015/04/17
- メディア: 大型本
- この商品を含むブログ (1件) を見る
アプリ本体はこんな感じ。本当はSQLAlchemyのラッパーを使いたかったのですが、時間が無かったのでベタ書きしました(格好わるいorz)
HTMLテンプレート(views/map.tpl)はこちら、自分のHTML&JS力の無さに泣ける...orz
これでとりあえずDatabaseの中身を見る地図アプリが完成しました。
(CF)完成!
地図アプリを実行します。
python map.py
localhost( http://localhost:8000 )にアクセスして、無事地図が見えました(^O^)
大雑把な位置は合ってるっぽいです。
セーフコ・フィールド(マリナーズ本拠地)は多少ズレてますがまあこれぐらいなら許容範囲でしょう。
このへんはGeocoding APIを変えたりしたら解決する可能性があります。
とりあえず目的は達成しました!!!
(C)今後の展望
何とかデータは出来たので、今後の展望(というかやりたいこと)を上げます。
- 以前作ったRetrosheetのデータベースと組み合わせて、「位置情報付きの試合一覧」を作る
- 「マリナーズおよびアスレチックスはメジャーリーグの中でも移動が多い・長い大変なチームなんだぜ!」*4っていうのを証明するようなネタアプリを作る
- そんなネタを通じて地図アプリを作り、自分のGIS力を鍛える
(SS)【Appendix】Pythonエンジニア養成読本について
今回はbottleを使ってWebアプリを書きました。その際こちらの書籍が大変参考になりました(ステマ)
Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)
- 作者: 鈴木たかのり,清原弘貴,嶋田健志,池内孝啓,関根裕紀,若山史郎
- 出版社/メーカー: 技術評論社
- 発売日: 2015/04/17
- メディア: 大型本
- この商品を含むブログ (1件) を見る
写経しながらGoogle Mapのコードを積み重ねて書くという感じでやったのですが、2時間もかからずに動くアプリが書けました。
PythonでWebアプリが書きたい、データ解析やインフラなコード(Ansible)をやりたい!という方は是非読んでみてください。
初心者だけでなく、中級・上級者にもオススメです!
(P)【Appendix】Pythonもくもく会
このエントリーの最初に書いたとおり、こちらのエントリーのコードはこのもくもく会で作りました。
会の進め方はPython mini Hack-a-thon*5とほとんど一緒なのですが、違いとしては、
- 発表はやりたい人だけやる
- おしゃべりはほとんど無し、TwitterのTLもあまり流れていない
とまあこんな感じです。
会話や質疑応答、発表を通じた学びを得難いですが、ノマド的に集中して作業や学習をするのにはいいもくもく会だと思いました。
おしゃべりが多い・少ない、発表ある・なしはそれぞれ一長一短あるので、自分のやることや気分に合わせて使い分けたい(というか両方出たい)なあと思う今日このごろです。
そろそろ寝ます。
*1:3月に研修、一ヶ月経った今週Webテストを受けて無事GETしました。なお、一回落ちた模様(二回目で受かった)
*2:ゴードン、イエリッチ、スタントン、プラド、モース、イチロー、リアルミュート、ヘチュバリア、フェルプスの順で入れただけ(4/17マイアミ・マーリンズのスターティングメンバー表より)
*3:OpenStreetMap Nominatim: Search
*4:メジャーリーグ各球団のフライト総距離を調べてみた:<MLB>:僕自身なんJをまとめる喜びはあった マリナーズはアメリカンリーグ北地区だからね。しょうがないね。