Pythonプログラミング(総合演習課題)

このページでは、プログラミングにとりかかる前のいくつかの準備と、ウォーミングアップを行う。

プログラミングのための準備

時系列データの入手

電力データ

東北電力のサイトの、過去実績データのダウンロードの中から、 各年度の「実績データ(CSV形式)」をダウンロードし、この課題用のディレクトリ(フォルダ)に保存する。 課題で用いるデータファイルは

とする(選択した課題によっては、使わないデータもある)。

「支援プログラム」の利用

支援プログラムのダウンロード

ダウンロードしたCSVデータをプログラムで読み取ったり、時間と日付の換算、等々、いくつかの面倒な処理を 簡単化するために、課題の作成を支援するための「支援プラグラム」を用意した。 ここを右クリックして「別名でリンク先を保存」すると、 tsa-helper.cというファイルがダウンロードできる。先ほどのCSVファイルと合わせ、作業用のディレクトリに

tsa.py   juyo_2017_tohoku.csv   juyo_2018_tohoku.csv   juyo_2019_tohoku.csv

のファイルがあることを、まず確認しておく。

予行練習1:時系列の表示
# coding: utf-8
import tsa

data = tsa.read_csv("juyo_2018_tohoku.csv")

i=0
for x in data:
    print(i,x)
    i=i+1

このプログラムは、CSVファイル"juyo_2018_tohoku.csv"を読み込んで、その中から各時刻の電力量 を自動的に切り出し、float型の配列(上の例ではdata)に1時間毎の電力量の値をセットする。 配列の添え字は、元旦深夜0時を起点とした経過時間に対応する。 次いで、この関数は、その配列データの内容を、画面に表示し、 読み込んだデータ点(時系列の長さ)を戻り値として返す。 つまり、この例では、変数nにデータ点の数(全部で何時間分のデータか)がセットされる。

data=gsa.read_csv("何々")によって、配列の内容が、上の例では、data[0]が元旦0時〜1時、 data[1]が元旦1時〜2時まで、・・・、data[n-1]が大晦日23時〜24時までの電力量の値(万kWH)、 に設定される、というわけだ。

ここで、tsa.read_csv("ファイル名")の箇所が、 「支援プログラム」によって提供された機能。 「支援プログラム」を使う場合には、プログラムの先頭部分に、必ず

import tsa

と書いておくこと。

予行演習2:時系列の表示(その2)
# coding: utf-8

import tsa

data = tsa.read_csv("juyo_2018_tohoku.csv") 

for i in range(len(data)):
    tsa.print_date_plus_hour(2018,1,1,i) ; 
    print(" ",data[i]) ;

動作は「予行演習1」のプログラムと同じだが、支援プログラムのtsa.print_date_plus_hour()関数を使って、 元旦からの経過時間数の代わりに、「日時」で表示するようにした例。

予行演習3:電力の積算
# coding: utf-8

import tsa

data = tsa.read_csv("juyo_2018_tohoku.csv")

total=0
for x in data:
    total = total + x

print("年間総電力量=",total,"[万kWH]")

for文を使った「総和」計算によって、年間の(正確には、データ末尾までの)電力量を積算し、表示するプログラム。 シンプルなプログラムなので、動作の詳細について、説明の必要は無いだろう。

支援プログラムの機能や使い方については、こちらのページにまとめておいたので参照のこと。

時系列を可視化する

matplotlib

Pyplot tutorial

実際のデータの様子を可視化するのは、データについての透察を深めたり、要らぬミスを防いだりするために、 とても重要な工程である。 ここでは、汎用のプロットライブラリである matplotlib を用いて、時系列データをグラフ化してみよう。

コードの先頭部分に

import matplotlib.pyplot as plt

と記述すると、plt.関数名 で、プロット関係の関数を呼び出せるようになる。 以下はその具体的なコードの例である。

# coding: utf-8
import tsa
import matplotlib.pyplot as plt

data = tsa.read_csv("juyo_2018_tohoku.csv")

plt.plot(data,
         color=(1,0,0),
         linewidth=0.5,
         label="juyo_2018_tohoku")
plt.xlabel('TIME [HOUR]')
plt.ylabel('SUPPLY [10^4 KW]')
plt.legend()
plt.show()

上記のコードを実行すると、2018年の元旦からの1時間毎の電力供給量が下のように表示される(細かい見え方は使用している環境で異なる)。

このように、ライブラリを利用すると、少ない手間で簡単にデータを可視化することができる。 このページの例で用いた関数について、簡単な説明を以下にまとめておくが、matplotlibは非常に高機能なので、 他の関数や細かい関数の呼び出し方については、オンラインマニュアルやネット上の情報等を手がかりに調べること。

関数補足
plt.plot(データの配列, color=(赤,緑,青),
linewidth=線の太さ, label="軸のラベル")
plot(xデータ,yデータ,...)も可
線の色は三原色の強度で指定。1が最大。
linestyle="線種"で線の種類も指定可。"dashed","dashdot","dotted",等々
plt.xscale("log") X軸を対数スケールにする。yscale("log")でY軸が対数スケール。
plt.xlabel("X軸のラベル") 同様に.ylabel("Y軸のラベル")
plt.xlim(下限,上限) X軸の値の範囲。同様に、Y軸は.ylim()で設定。
plt.legend() label="何々"で指定したデータの凡例を出力する
plt.grid(True) 格子(グリッド)を描画する
plt.show() 描画結果を表示する。

複数のデータの比較を行う際に、複数のグラフを並置するのが有効である。 以下はそのコードの例である:

# coding: utf-8
import tsa
import matplotlib.pyplot as plt

data2017 = tsa.read_csv("juyo_2017_tohoku.csv")
data2018 = tsa.read_csv("juyo_2018_tohoku.csv")
data2019 = tsa.read_csv("juyo_2019_tohoku.csv")

plt.figure(1)

plt.subplot(311)
plt.plot(data2017,color=(1,0,0),linewidth=0.5,label="2017")
plt.xlim(0,8760)
plt.legend()
plt.title("SUPPLIED POWER IN TOHOKU")

plt.subplot(312)
plt.plot(data2018,color=(1,0,0),linewidth=0.5,label="2018")
plt.xlim(0,8760)
plt.ylabel('SUPPLY [10^4 KW]')
plt.legend()

plt.subplot(313)
plt.plot(data2019,color=(1,0,0),linewidth=0.5,label="2019")
plt.xlim(0,8760)
plt.xlabel('TIME [HOUR]')
plt.legend()

plt.show()

plt.subplot(整数値)の中の三桁の整数の各桁を nml とすると、nはグラフを横(行)方向に、mは縦(列)方向に、それぞれ何分割するかを指定する。l は、その分割の中で、何番目のグラフか、を表す。

この場合、各プロットの横軸を揃えるために plt.xlim(下限, 上限) によって、横軸の範囲を制限している。

出力結果