ラズパイでお天気情報を取得してみます。
予報に関してはLiveDoor Weather Haks
データに関してはOpenWeatherMap
を使ってみます。
この手の情報は一次ソースとしてとっても大事。
予報については「明日晴れるの?雨降る?…..」程度が分かればいいので、LiveDoorで十分。
データについては「気温や湿度、気圧…」などの細かいとこが知りたいのでOpenWeatherMapを使います。
データはDBに保存して、後で解析に使います。
気象病ってのが世の中にはあるそうです。
日記に体調などを(できれば時刻と一緒に)都度記述しておけば、気候の傾向と体調の関係を把握できるかもしれません(^^)。
また、J.リーグの公式記録(天候別勝敗表)によれば…..
雨模様の試合でガンバ大阪の2005~2018の記録は、80試合、27勝27分26敗。きれいに分散してます。
負けない率は、67.5%です。まぁ、勝てない率も同じくらいなんですけど……。
一番勝率がいいのは「雨のち曇」の場合で7勝2分2敗。
まぁ、ゲームの結果を予測しようなんて考えると、パラメータの数がアホほど多くなるのを覚悟せねば…..。きっとシャビの頭の中にはゲームを分析・予測する変数が常人の何十倍もあったんじゃない?!
商用利用は不可というだけで、回数制限などは特に無いようです。
地域IDは全国の地点定義表から取得
Python3
以下は大阪の場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import urllib.request,urllib.error import json def get_weather(): city = "<strong>270000</strong>" #<-地域ID json_url = "http://weather.livedoor.com/forecast/webservice/json/v1" try: r = urllib.request.urlopen('%s?city=%s' % (json_url, city) ) b = r.read() sb = b.decode() obj = json.loads(sb) title = obj['title'] print(title) forecasts = obj['forecasts'] # 今日 cast = forecasts[0] today_weather = cast['dateLabel'] + "の天気は" + cast['telop'] print(today_weather) # 明日 cast = forecasts[1] tommorow_weather = cast['dateLabel'] + "の天気は" + cast['telop'] print(tommorow_weather) finally: r.close() if __name__ == '__main__': get_weather() |
無料版と有料版があります(使うのは当然無料版)
無料版では1分間に60リクエストまでと制限がありますが、そんなに頻繁に使う理由がないです。
無料版ではデータの種類も制限されます…..がこのくらいから始めてみます(相関に問題があれば別のパラメーターを探してみませう)。
気温・気圧・湿度・風速・風向・最高気温・最低気温・雲量など。
都市名と緯度・経度でデータ取得できます。緯度・経度は直近の観測場所のデータが採用されます。
どういう都市名が使えるかは都市ID(JSON)で調べられます。
APIキーを取得しておく必要があります。
都市名の場合:?q=都市名,jp <-日本
緯度・経度の場合:?lat=34.802948&lon=135.537488
Python3で取得
以下は大阪市の場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import urllib.request,urllib.error import json def get_weather(): city = "<strong>Osaka-shi</strong>" json_url = "http://api.openweathermap.org/data/2.5/find<strong>?q=" + city + ",jp</strong>&units=metric&APPID=<strong><APIキー></strong>" try: r = urllib.request.urlopen(json_url) b = r.read() sb = b.decode() obj = json.loads(sb) lists = obj['list'] #今日 cast = lists[0] tempreture = cast['main']['temp'] print("気温:" + str(tempreture) + "度") pressure = cast['main']['pressure'] print("気圧:" + str(pressure) + "hpa") humidity = cast['main']['humidity'] print("湿度:" + str(humidity) + "%") temp_min = cast['main'].get('temp_min',None) print("最低気温:" + str(temp_min) + "度") temp_max = cast['main'].get('temp_max',None) print("最高気温:" + str(temp_max) + "度") wind_speed = cast['wind']['speed'] print("風速:" + str(wind_speed) + "m") wind_degree = cast['wind'].get("deg",None) print("風向:" + str(wind_degree) + "度") cloud = cast['clouds']['all'] print("雲量:" + str(cloud) + "") description = cast['weather'][0]['description'] print("空模様:" + description + "") finally: r.close() if __name__ == '__main__': get_weather() |
OpenWeatherMapではdescriptionは英語表現なのでいまいち分かりづらい。
対照表:空模様
風向も0~360で表記されるのでピンときません。
DBから検索する際、変換しとくとわかりやすいです。
データはローカルにDB(例:SQLite)に保存しておきます。
最低2年分くらいは欲しいです。
cronに設定しておきます(60分間隔で保存)
適当にPythonコード(set.py)を作っておいて
$crontab -e
*/60 * * * * /home/pi/weather_report/set.py
WisteriaHillではこんな具合にデータ保存中。
2番目のカラムには保存時のタイムスタンプを設定。
お天気データと日記の記述の関連を解析
日記と言っても音声認識を使ったメモのようなもので十分。
Google Keep(Android)に保存してみます。
こんな感じで保存されます。
PythonでKeepからデータを検索する場合はこちら
Leave a Reply