SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

関西電力の電力消費量データを機械学習を想定して加工する/Pythonサンプル

f:id:arakan_no_boku:20190730212535p:plain

目次

関西電力が提供する電力消費実績データ

関西電力が提供する「関西エリア」の電力消費実績データをダウンロードして、いろいろいじくってみます。

関西電力の関西エリア電力消費実績データはこちらからダウンロードできます。

www.kepco.co.jp

ダウンロードは月単位になってます。

この記事を書いている2019年7月時点で、当月データが既にあるのが凄いです。

f:id:arakan_no_boku:20190730213613p:plain

これを気象データとかとの相関をとったり、回帰問題にしてみたり、色々使えるデータにできないかな?というのが今回のテーマです。

とりあえずダウンロードしてみる

ZIPファイルです。

解凍してみると、こんな感じで、1日1ファイルで1月分のファイルがあります。

f:id:arakan_no_boku:20190731203811p:plain

中身はこう。

f:id:arakan_no_boku:20190731203941p:plain

レポートみたいで、とても機械学習とかに使えそうなフォーマットではありません。

加工しないと駄目ですね。

加工の方針を決める

気象庁の気象データは1日ごとの気温、湿度、風量などです。

なので、それと対比させるには電力使用量も1日毎の最高と最小のみを記録してあるデータを作ればよいです。

それに使えそうな箇所を探してみると、真ん中あたりに、1時間ごとの消費実績の一覧があり、最後の方に5分間隔値の一覧があります。

これを読み取って、最大値と最小値を出力すればよさそうです。 

とりあえず、時間情報で「0:00」とか「1:00」とかをキーに抜き出せばいいかなと思ってますが、それだと1時間ごと情報と5分毎情報で一部ダブります。

なので、予測の列の有無とかではじいて・・とか考えて・・。

 

加工するPythonプログラム

さくっと作ってみたプログラムがこんな感じです。

sk_data_kanden.py

from pathlib import Path
import csv

keylist = [
    '0:00',
    '1:00',
    '2:00',
    '3:00',
    '4:00',
    '5:00',
    '6:00',
    '7:00',
    '8:00',
    '9:00',
    '10:00',
    '11:00',
    '12:00',
    '13:00',
    '14:00',
    '15:00',
    '16:00',
    '17:00',
    '18:00',
    '19:00',
    '20:00',
    '21:00',
    '22:00',
    '23:00'
]
path = Path('./data/')
filelist = list(path.glob('*.csv'))
with open('kanden.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['年月日', '電力量(最大)', '電力量(最小)'])
    for f in filelist:
        with open(f, newline='') as csvfile:
            max = 0
            min = 9999999
            day = ''
            lines = csv.reader(csvfile, delimiter=',')
            for row in lines:
                if(len(row) >= 5):
                    if(row[1] in keylist):
                        if(row[1] == '0:00'):
                            day = row[0]
                        v = int(row[2])
                        if(max < v):
                            max = v
                        if(min > v):
                            min = v
            writer.writerow([str(day), str(max), str(min)])

カレントフォルダに「data」フォルダを作り、その下に日別のファイルをまとめておきます。

元データを見ると、1時間単位の行と、5分単位の行で列数が違うので、列数が5より大きいという条件で1時間単位の行だけに絞ってます。

あとは、時間を示す文字列をキーリストにして、一致した実績時間を比較していって、1日のMax(最大電力量)とMin(最小電力量)を記録する・・とまあ、なんのてらいもないロジックです。

でもまあ。

こういうのはスピード勝負だと思ってて。

こんなPythonスクリプト作ることで、だいたい1年間分くらいのデータが1時間ちょっとでできれば上出来かなと思ってます(笑)

あと、必要に応じて2年・3年と追加するつもりです。

その時は、書き込み用のCSVのopenをこんな風にして追加書き込みにします。

with open('kanden.csv', 'a', newline='') as csvfile:

 

出力したCSVデータのイメージ 

とりあえず、1年分ダウンロードしてCSVを作ってみました。

日付、最大消費量、最小消費量

で1行になってます。

f:id:arakan_no_boku:20190803135241p:plain

年月日等のヘダーは、あとで他のデータとマージした時に必要になるので、暫定的につけてます。

今回はわかりやすさ優先で、ヘダーを日本語にしてますが、ご存じのとおり、pythonで扱うなら日本語でないほうが楽です。

できないわけではないですが、若干、ひっかかるポイントが増えて面倒くさいです。

だから、ヘダーを英語にしてもらっても全然OKなので、補足しておきます。

さて。

次回は気象データを組み合わせ習用データを作ってみようかな・・などと考えてます。

今回はこんなところで。

ではでは。