Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

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

手法

  • 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を練習で作る。
  • 実測したデータと各社の予測値(外気温度)がどの程度の精度をもっているか検証
snuow
データ分析者として覚醒したい会社員 普段は、エネルギー診断・分析をしています。 最近は統計・機械学習・Webアプリにお熱です。
https://snuow.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした