"BOKU"のITな日常

還暦越えの文系システムエンジニアの”BOKU”は新しいことが大好きです。

大阪の過去の気象データと電力消費量データを組み合わせて学習データを作る

大阪の過去の気象データをダウンロードして、関西電力の電力消費量データと組み合わせたら、練習用として面白い学習データが作れると思うので、やってみます。

f:id:arakan_no_boku:20190803110716p:plain

 

気象庁のダウンロードページは面白い

 

全国の過去の気象データは、専用のダウンロードページから取得できます。

www.data.jma.go.jp

ここで、地域や取得したいデータの種類や期間などを選んでCSVに落とせます。

f:id:arakan_no_boku:20190803111112p:plain

今回は関西電力のデータといっしょに使いたいので、地域は大阪を選びます。

項目も日別項目がいろいろ選べます。

電力消費量に関係しそうなものということで。

  • 最高気温
  • 最低気温
  • 日平均相対湿度
  • 日平均風速
  • 降水量の日合計

を選んでみました。

暑い寒いだけではなく、湿度が高かったり、風がなかったりしてもエアコンとか使いますし、雨が降ってたら家にこもるので電気もつかうだろう・・みたいな、ざっくりした考え方です。

期間は、とりあえず2018/6/1から2019/6/30の1年間にします。

複数年にわたってダウンロードもできますが、前回作成した電力消費量データがそのへんの期間(1年分)なので、それにあわせます。

arakan-pgm-ai.hatenablog.com

まあ。

いつでもダウンロードできるので、あとから追加していけば良いだけのことですから。

ダウンロードすると「data.csv」等の名前で以下のようなファイルがおちてきます。

f:id:arakan_no_boku:20190803112721p:plain

よしよし。

 

ダウンロードファイの形式を把握しておく

 

ダウンロードしたCSVの形式についての説明はこちらにあります。

www.data.jma.go.jp

各項目ごとに「品質情報」や「均質値」等余分なカラムがくっついていたりしますが、それについての説明が書いてあります。

実際のところ、品質情報「8」、均質値「1」がほとんどで、それ以外の数値の場合は何かしらの問題がある・・的に理解すればよく、実際に機械学習で使う時には、品質情報や均質値の列はおとしてしまったりするのですが、いちおう、読んでおくほうがいいです。

各気象データの値についての説明はこちらにあります。

www.data.jma.go.jp

気象データは観測値なので、当然なんらかのアクシデントで部分的に欠損がでたり、観測値がなかったりということもありえます。

そんな時は「///」や「#」みたいな記号で表現していますよという説明です。

あとで、機械学習とかにかけるときは、こういう異常値を対処して全体に影響がおよばないようにしなければならないので、重要です。

 

余分な行・列を削除して整えよう

 

上記のように、品質情報や均質値などの値は、データとしては不要な値です。

それ以外にも余分なヘダー行や空白行など、データCSVとして扱うにはいらない部分もあるので、それは削除しちゃいます。

Pythonでやってもいいですが、こんなのはEXCELとかのほうが簡単で便利。

さくっと、こんな感じにしてCSVファイルを上書きします。

f:id:arakan_no_boku:20190805224343p:plain

ただ、EXCELCSV保存すると文字コードがShift-JISになっていたり、UTF-8でも「BOM付き」になっていたりするので、後で悩まなくていいように、文字コードが指定できるテキストエディタ等で、「BOM無しのUTF-8」で、保存しなおしておくことをお勧めします。

f:id:arakan_no_boku:20190805225641p:plain

そのままでも問題ない時もあるのですが、自分は何度も痛い目にあった経験から、無条件でそうするようにしています。

なので、以後の動作確認はその前提です。 

 

2つのCSVファイルをマージする

 

前回、加工した「関西電力の消費電力量実績」データと、上記の「気象データ」を年月日でマージして、日別に気象情報と電力消費量が1行にならんだデータにします。

2つのファイルをマージするプログラムは素で書くより、pandasを使う方がスマートなので、そうします。

インストールしていない場合は、以下を実行しておきます。

pip install pandas

とりあえず、2つのファイル名は以下にしています。

  • 消費電力データ:kanden.csv
  • 気象データ:data.csv

この2つを年月日でマージして、「input_kanden.csv」ファイルを出力します。

pandasだと、これがほぼ4行で書けてしまいます。

こんな感じです。

sk_data_merge.py

import pandas as pd


df_weather = pd.read_csv('data.csv')
df_kanden = pd.read_csv('kanden.csv')
df_result = pd.merge(df_weather, df_kanden, on=u'年月日')
df_result.to_csv('input_kanden.csv', mode='w', index=False)

補足します。

見ればわかる・・って感じですが、最後の「index=False」についてのみ。

pandasの場合、自動的の行番号(index)がつきます。

なので、デフォルトで出力すると、行番号付きになります。

今回は機械学習データとして使いたいので、行番号は余分です。

なので、行番号を出力しないように、これを書いてます。

これで、以下の並びのヘダーをもつCSVができました。

年月日,最高気温(℃),最低気温(℃),降水量の合計(mm),平均風速(m/s),平均湿度(%),電力量(最大),電力量(最小)

なお。

今回はわかりやすさ優先でヘダーを日本語にしていますけど、当たり前ですが、機械学習とかpandasで扱うことを考えれば、日本語は使わないほうがらくちんです。

念のため。

どっかで時間ができたら、これを使って電力量予測の回帰問題でもやってみようかな。

今回はこんなところで。

ではでは。