別棟備忘録4

*

pythonとpandasでグラフを作成する

      2015/12/04

このページの続きで、csvファイルをグラフにする第2回目
前回との違いはpandasを使ってデータを少し加工し、グラフを調整してみるところ。

参考にさせていただいたページ

StatsFragments Python, R, 統計のこととか書く
http://sinhrks.hatenablog.com/archive/category/Python

“10 Minutes to pandas” 10分でわかるpandas
http://pandas.pydata.org/pandas-docs/stable/10min.html

こちらの記事にあるような形のデータをグラフにしてみましょう。というのがテーマ。
tmp2
とりあえず1日分を切り出してtmp2.csvを作成。

pythonでグラフ化する。コード。

import numpy as np
import matplotlib.pyplot as plt
import datetime
import matplotlib.dates as mdates
import pandas as pd
def str2date(x):
xstr = str(x)
year = int(xstr[0:4])
month = int(xstr[4:6])
day = int(xstr[6:8])
hour = int(xstr[8:10])
minute = int(xstr[10:12])
return datetime.datetime(year,month,day,hour,minute)

df = pd.read_csv(‘tmp2.csv’)

df = df[df[‘pa’] > 70]
df[[‘dt’]]=df[‘yy’]*100000000+df[‘mo’]*1000000+df[‘dd’]*10000+df[‘hh’]*100+df[‘mi’]

vstr2date=np.vectorize(str2date)
t=vstr2date(df[‘dt’])
df2 = pd.DataFrame({‘Time’ : t,
‘tmp’ : df[‘tmp’],
‘pa’ : df[‘pa’],
})

fig, axes = plt.subplots(nrows=2)
df2.plot(x=[‘Time’],y=[‘tmp’],grid=True,ax=axes[0])
axes[0].set_title(‘Temperature’)
axes[0].get_xaxis().set_major_formatter(mdates.DateFormatter(“%H:%M”))
df2.plot(x=[‘Time’],y=[‘pa’],grid=True,ax=axes[1],c=’g’)
axes[1].get_xaxis().set_major_formatter(mdates.DateFormatter(“%H:%M”))
axes[1].set_title(‘Pressure’)
plt.tight_layout()
plt.savefig(“gp.png”)

ファイルはこちらに testcsv6.py

 

●苦戦した部分
※気圧計の安定感がいまひとつであるのか、たまに10kPa程度のエラーと思われるデータが記録されることがある。グラフ化に際しては70kPa未満のデータを除外して対処。
→df = df[df[‘pa’] > 70] の部分。
削除せねばと.dropをいろいろ調べたが、そもそも抽出すればそれでいいことに気づく。

※別々の列にある西暦や月のデータから日付時刻のdatetimeデータ(横軸)を生成できず苦戦。当初は何もわからずdatetime.datetime(df[‘yy’],…などとしていたが、それでは列全体がyearとして入ってしまうのでエラー。そこでサンプルのように一つ一つ値をreturnする形に訂正。(参考にさせていただいたページを失念。。)ここは多分もっと良いやり方がある…気がする。
→df[[‘dt’]]=df[‘yy’]*100000000+df[‘mo’]*1000000+df[‘dd’]*10000+df[‘hh’]*100+df[‘mi’] からの
def str2date(x):のくだり。(そもそも苦戦の始まりはまとまった状態での型変換ができなかったこと。)

gp

●Plotに関して
参考にさせていただいたページ
公式的なところ
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.plot.html

りんごがでている
http://sinhrks.hatenablog.com/entry/2015/11/15/222543

pandas で年齢階級をつくる
http://qiita.com/kshigeru/items/bfa8c11d1e6487c791d3

※データが2つあるので secondary_yで右側にy2軸を作ることも考えたが、視認性が悪く、結局2つ縦にならべることに。(secondary_yの範囲の変え方が結局よくわからなかったことも一因。)
→fig, axes = plt.subplots(nrows=2) ncols=2で横

※デフォルトでは 横軸に00:00:00 という具合の文字がたくさん並ぶので、秒を省略
→axes[0].get_xaxis().set_major_formatter(mdates.DateFormatter(“%H:%M”)) ちなみに(“%H:%M”)を(“”)とすれば、全部消える(、が[Time]は残る。)
なおaxes[0].get_xaxis().set_visible(False)としてみたら軸ラベル[Time]も消えたが、横軸のグリッドも消えた。。

※デフォルトでは[Time]とPressureが重なるので…
→plt.tight_layout() で回避

つづく → xmlrpc で画像投稿

 - Python