僕がデータ分析者として覚醒するまで

しがない会社員がデータ分析者として覚醒するまでのブログ

Dark Skyを使用した天気予測をCSV化する

qiita.com

概要

  • 建築物のエネルギーデータを予測するにあたって、空調機の消費電力量が与える影響は非常に大きい。
  • 外乱のあるデータを予測するには単変量解析では限界がある。多変量にすべき?
  • 翌日の外気温度使えば空調機の消費電力量の予測精度ってもっと上がるかも?と思ったので手軽に集める方法を実装した。

手法

実装

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','温度']を突っ込んでいます。 タイムスタンプと温度以外は必要なかったので決め打ちです。 下記は、取ってきたjsoncsvに整形して出力しています。

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を練習で作る。
  • 実測したデータと各社の予測値(外気温度)がどの程度の精度をもっているか検証