LoginSignup
3
5

More than 5 years have passed since last update.

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

Posted at

概要

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

手法

  • Dark SkyのAPIを使って、気温の予測データを集めます。
  • 日本気象株式会社の方が予測精度は良さそうだけど、ランニングコストがかかるため、今回はなし。
  • API叩いて、1時間間隔のデータをひっぱってきて、整形してcsv出力

実装

DarkSkyのアカウントはここからつくります。FAQ大事!
以下のような感じで、設定値ファイルを作って、諸々の情報を読み込みます。
(それぞれのパラメータはconfigparserでパースします。)
経度・緯度指定じゃなくて、都市名で指定したかった。(今後の課題)

/etc/init.txt
[darksky]
APIKEY = hogehoge
LONGITUDE = hoge経度
LATITUDE = hoge緯度
UNITS = si
EXCLUDE = currently,minutely,daily,alerts,flags

get_forecastを呼び出して、出てきたjsonをパースします。jsonの内容はここに書かれています。
jsonに格納されている予測のタイムスタンプはUNIXtimeで書かれているので、JSTに直さないとダメでした。

API関連
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に整形して出力しています。

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5