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を練習で作る。
- 実測したデータと各社の予測値(外気温度)がどの程度の精度をもっているか検証
Memo:[Django]バージョンによるurls.py内のincludeの仕様の違い
概要
Urlディスパッチャの記述でハマった。
問題
旧DjangoのTutorialでは、下記のようにしなければならなかった。
urlpatterns = [ url(r'^testapp/', include('testapp.urls', namespace='testapp')), ]
新しいDjangoで上記を写経すると下記のエラーがでる。(Django==2.0.3を使用)
url(r'^testapp/', include('testapp.urls', namespace='testapp')), File "C:\Users\****\PycharmProjects\Tutorial\venv\lib\site-packages\django\urls\conf.py", line 39, in include 'Specifying a namespace in include() without providing an app_name ' django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.
'Specifying a namespace in include() without providing an app_name '
Googleさん:'app_nameを指定せずにinclude()で名前空間を指定する'
解決策
新Django(Django==2.0.3)では、下記のようにすることでエラーをはかなくなった。
要するに、namespaceでapp_nameを指定するのではなく、2-タプルで渡してね。ってことみたい。
urlpatterns = [ url(r'^testapp/', include(('testapp.urls', 'testapp'),)), ]
層化抽出法
層化抽出法とは
- 母集団をあらかじめいくつかの層(グループ)に分けておき、各層の中から必要な数の調査対象を無作為に抽出する方法
統計検定2級の試験問題に出てきたんだけど、母集団をいくつかのグループに分ける必要がある。その分けるグループは当然ながら偏った性質を持っていてはいけない。
各層はランダムかつ母集団とよく似た性質にわけるようにする。 実際に標本集団を作るときは偏った性質の層を作らないようにする必要がある。
はやく統計検定2級受けたい。。。
自己相関関数と偏自己相関関数
コレログラム
コレログラムは、時系列データにおいて、周期性や自己相関がどの時点にあるかを
判断できるグラフである。
時系列データを分析する上で、どこに相関があるかは重要で、ARモデルなどで係数を推定するために必要なものである。
自己相関
自己相関関数は、原系列に対して、遅れのあるデータを作成し、それらの1次遅れ・2次遅れ・・・n次遅れのデータを作成し、それぞれ相関をとることで周期性や何次遅れのデータが原系列にとって相関があるかを知ることができる。
bellcurve.jp
偏自己相関
偏自己相関は、自己相関が時系列データのn次遅れのデータそれぞれに行うに対して、偏自己相関は自己相関係数から、時間によって受ける影響を除去した自己相関となる。