Dark Skyを使用した天気予測をCSV化する
概要
- 建築物のエネルギーデータを予測するにあたって、空調機の消費電力量が与える影響は非常に大きい。
- 外乱のあるデータを予測するには単変量解析では限界がある。多変量にすべき?
- 翌日の外気温度使えば空調機の消費電力量の予測精度ってもっと上がるかも?と思ったので手軽に集める方法を実装した。
手法
- Dark SkyのAPIを使って、気温の予測データを集めます。
- 日本気象株式会社の方が予測精度は良さそうだけど、ランニングコストがかかるため、今回はなし。
- API叩いて、1時間間隔のデータをひっぱってきて、整形してcsv出力
実装
DarkSkyのアカウントはここからつくります。FAQ大事! 以下のような感じで、設定値ファイルを作って、諸々の情報を読み込みます。 (それぞれのパラメータはconfigparserでパースします。) 経度・緯度指定じゃなくて、都市名で指定したかった。(今後の課題)
[darksky] APIKEY = hogehoge LONGITUDE = hoge経度 LATITUDE = hoge緯度 UNITS = si EXCLUDE = currently,minutely,daily,alerts,flags
get_forecastを呼び出して、出てきたjsonをパースします。jsonの内容はここに書かれています。 jsonに格納されている予測のタイムスタンプはUNIXtimeで書かれているので、JSTに直さないとダメでした。
import json import urllib.request import datetime import time import configparser inifile = configparser.ConfigParser() inifile.read('../etc/init.txt') APIKEY = inifile['darksky']['APIKEY'] LONGITUDE = inifile['darksky']['LONGITUDE'] LATITUDE = inifile['darksky']['LATITUDE'] UNITS = inifile['darksky']['UNITS'] EXCLUDE = inifile['darksky']['EXCLUDE'] #print (APIKEY) def get_forecast(): try: url = 'https://api.darksky.net/forecast/' + APIKEY + '/' + LONGITUDE + ',' + LATITUDE + '?' + 'units=' + UNITS + '&exclude=' + EXCLUDE res = urllib.request.urlopen(url) # json_loads() でPythonオブジェクトに変換 data = json.loads(res.read().decode('utf-8')) print(r'dataの取得を完了しました。') except urllib.error.HTTPError as e: print('HTTPError: ', e) except json.JSONDecodeError as e: print('JSONDecodeError: ', e) return data def convert_Unix_to_JST(date): try: ans = datetime.datetime.fromtimestamp(date) # print('UnixからJSTに変換しました。') return ans except: print('なんかエラー')
dataはAPI叩いて得たjson,itemlistは['date','温度']を突っ込んでいます。 タイムスタンプと温度以外は必要なかったので決め打ちです。 下記は、取ってきたjsonをcsvに整形して出力しています。
import numpy as np import pandas as pd import Utils.API_Control as apcon def combine_data(data, itemlist): df = pd.DataFrame(columns=itemlist) for icnt in np.arange(0, len(data['hourly']['data']), 1): add_weather_forecastser = pd.Series([str(apcon.convert_Unix_to_JST(data['hourly']['data'][icnt]['time'])), data['hourly']['data'][icnt]['temperature']], index=df.columns) df = df.append(add_weather_forecastser, ignore_index=True) df.index = df['date'] df = df.drop('date', axis=1) return df
出来上がったものがこちら
今後の予定
- 天気予測データを得たうえで、予測精度向上のためにどうやって組み込むか。
- せっかく天気予報データ得られたし、天気予報を通知するLINEBOTを練習で作る。
- 実測したデータと各社の予測値(外気温度)がどの程度の精度をもっているか検証