TRNSYSの計算結果をPythonでグラフ化する
TRNSYS18のリリースに備えてPythonを勉強しています。以前に一度やりかけたことがあるのですが、だいぶ忘れているのでおさらいです。
TRNSYSの計算結果をサクッとグラフ化する
やり方としてはTRNSYSの計算結果(ファイル)を読み込んで、グラフを描くモジュールを使ってグラフ化します。
計算結果はExamlesのBegin.tpfの出力ファイル(”C:\Trnsys17\Examples\Begin\Begin.out”)をそのまま使用します。
ちなみに中身はこんな感じのテキストファイルになっています。TIME,QColl(集熱パネルの集熱量)、QAux(補助ヒーターの負荷)の3カラムの構成です。
ライブラリの準備
はじめに処理に使用するライブラリ(パッケージ)をインポートしておきます。詳細は省略しますが、それぞれファイルを読んでグラフ化するのに使用します。
なお、以下のPythonのコーディングはPython3.6/Jupyter Notebookを使って検証しています。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
ファイルを読み込む
そしてファイルを読み込む処理は、たったの一行。
df= pd.read_csv('C:\Trnsys17\Examples\Begin\Begin.out')
これで、ファイルの読み込んでDataframeという形式に展開してくれます。表示してみましょう。
df.head() で最初の数行分を表示してくれます。
読み込まれたデータが表形式で表示されています。 でもこの状態だと実は、まだだめなんですね。元データは3カラムで構成されていましたが、区切りがうまく認識されれず一行まとめて一つの値になっています。(値というか、単なるテキスト) ここで表をよく見ると、タブ区切り(\t)記号が含まれています。(赤枠の部分)
そこでファイルの読み込みの箇所で、タブ区切り記号を指定して処理を行います。
df= pd.read_csv('C:Trnsys17\Examples\Begin\Begin.out',delimiter='t')
こんどは無事にカラムごとに分けて読み込まれました。最後にUnnamedなんとかという名前のカラムがありますが、これは空のデータが入っているためなので、あまり気にしなくてOKです。
グラフを描く
そしてQColl,QAuxをグラフにプロットするのは、ほんの2行ほど。カラム名を指定して次のようにします。
df.loc[:,['Qcoll','Qaux']].plot()
plt.show() と、ここで大量のエラーメッセージが。。。
いろいろごちゃごちゃ書いてありますが、重要な点は最後の1行に書いてあります。
KeyError: "None of [['Qcoll', 'Qaux']] are in the [columns]"
(指定された'Qcoll', 'Qaux'はカラムに存在しません)
これちょっと分かり難いのですが、TRNSYSから書き出されたファイルではカラム名に空白が含まれています。Pythonで読み込む際に、空白も含めてカラム名として認識されてしまうため、’Qcoll’で指定しても、実際にはないのでエラーとして処理されてしまっています。正確に’Qcoll ’のように空白を含めてカラムを指定する必要があります。でも、これ少々面倒なので、逆にカラム名を再設定する方が簡単です。これも一行で済みます。
df.columns=['TIME','Qcoll','Qaux','UNNAMED']
この行を追加したら、再度グラフを描いてみます。
下図のような画面が表示されたら成功です。
しかし、Begin.tpfの出力は積算値なので、右肩上がりのグラフになってしまっていまいちですね。。。(なにか比較対象がないとというか、面白い表示じゃないすよね?)
ちょっと工夫すると描く範囲を指定したり、複数のデータをまとめてグラフ化することもできます。一度Pythonのスクリプトを書いてしまえば、再利用もできます。なんども繰り返し計算を行うようなケースでは気軽にグラフ表示できる方法です。
以下、実際に動かしたスクリプトです。実質3,4行でグラフが描けるので非常に楽です。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df= pd.read_csv('C:Trnsys17\Examples\Begin\Begin.out',delimiter='t')
df.columns=['TIME','Qcoll','Qaux','UNNAMED']
df.loc[:,['Qcoll','Qaux']].plot()
plt.show()