文字化け解消法で紹介したmatplotlibですが、使いこなせる気が全くしないのが正直なところ。
だってこのキーワード引数の多さったら… 覚えきれませんよ。
plot関数だけでも指定可能な引数は30以上かな。
http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot
Property Description
agg_filter unknown
alpha float (0.0 transparent through 1.0 opaque)
animated [True | False]
antialiased or aa [True | False]
axes an Axes instance
clip_box a matplotlib.transforms.Bbox instance
clip_on [True | False]
...
それでいて出来上がるのはこんな~~ダサい~~グラフ。
頑張れば綺麗なグラフも描画できるみたいなんですけど、あまり学習意欲が湧きませんよね。
そこでseabornの出番です。
Seaborn is a Python visualization library based on matplotlib. It provides a high-level interface for drawing attractive statistical graphics.
意訳すると、matplotlibのwrapperとしてより高レベルな(抽象化された)インタフェースを提供してくれるそうです。
urllibに対するrequestsパッケージみたいな位置づけかな。
インタフェースも大事ですが、こんなheatmapを10行程程度のコードで描画できてしまうなら、学習意欲が湧いてきますよね。
とは言え、いきなりheatmap描くような大そうなデータは持ち合わせていないので、我が家の家電製品の消費電力データを使って基本的なグラフを描画してみようと思います。
$ cat 冷蔵庫.csv
No.,DateTime,Watt,kWh
1,2015/03/02-23:25:44,58.9,0
2,2015/03/02-23:35:44,50.6,0.01
3,2015/03/02-23:45:44,50.3,0.02
4,2015/03/02-23:55:44,61.7,0.02
5,2015/03/03-00:05:44,72.4,0.03
6,2015/03/03-00:15:44,51.3,0.04
7,2015/03/03-00:25:44,47.7,0.05
8,2015/03/03-00:35:44,47.6,0.06
9,2015/03/03-00:45:44,20.2,0.06
10,2015/03/03-00:55:44,40.5,0.06
これはサンワサプライ製TAP-TST10で取得したログです。リアルタイムにロギングできないのが欠点ですが…まぁ安いので。
これをpandasでDataFrame化するとこうなります。
import pandas as pd
data = pd.read_csv("冷蔵庫.csv")
print(data)
No. DateTime Watt kWh
0 1 2015/03/02-23:25:44 58.9 0.00
1 2 2015/03/02-23:35:44 50.6 0.01
2 3 2015/03/02-23:45:44 50.3 0.02
3 4 2015/03/02-23:55:44 61.7 0.02
4 5 2015/03/03-00:05:44 72.4 0.03
5 6 2015/03/03-00:15:44 51.3 0.04
6 7 2015/03/03-00:25:44 47.7 0.05
7 8 2015/03/03-00:35:44 47.6 0.06
8 9 2015/03/03-00:45:44 20.2 0.06
9 10 2015/03/03-00:55:44 40.5 0.06
10 11 2015/03/03-01:05:44 59.4 0.07
...
[1441 rows x 4 columns]
print(data.DateTime)
0 2015/03/02-23:25:44
1 2015/03/02-23:35:44
2 2015/03/02-23:45:44
3 2015/03/02-23:55:44
4 2015/03/03-00:05:44
5 2015/03/03-00:15:44
6 2015/03/03-00:25:44
7 2015/03/03-00:35:44
8 2015/03/03-00:45:44
9 2015/03/03-00:55:44
10 2015/03/03-01:05:44
...
Name: DateTime, dtype: object
print(data['Watt'])
0 58.9
1 50.6
2 50.3
3 61.7
4 72.4
5 51.3
6 47.7
7 47.6
8 20.2
9 40.5
10 59.4
Name: Watt, dtype: float64
これをseabornで可視化するコードはこうなります。
import seaborn as sns
import pandas as pd
data = pd.read_csv("冷蔵庫.csv")
# 比較的簡単なpointplotを使う
ax = sns.pointplot(
x='DateTime', # x軸にDateTime
y='Watt', # y軸にWatt
data=data, # DataFrameを指定
markers=['']) # dataをplotするマーカーを非表示に
# x軸方向のデータが多すぎるので1日毎にラベルを間引く(データは間引かない)
xlabels = [datetime.split('-')[0]
if list(data.DateTime).index(datetime) % 144 is 0 else ''
for datetime in data.DateTime]
# x軸ラベルを設定&ラベル表示を90度回転
ax.set_xticklabels(xlabels, rotation='vertical')
# pngファイルに書き出す
sns.plt.savefig('冷蔵庫.png')
データが詰まりすぎてますね…。
以下のようにちょっと間引きます。
data = pd.read_csv("冷蔵庫.csv")[:360]
今度はいい感じになりました。
冷蔵庫の定格消費電力は約110Wと表記されているので、ピーク値が114.0Wなのをみると、大体スペック通りですね。
data.Watt.mean()
44.557499999999997
data.Watt.min()
2.2999999999999998
data.Watt.max()
114.0
消費電力量は?
import seaborn as sns
import pandas as pd
data = pd.read_csv("冷蔵庫.csv")
# 比較的簡単なpointplotを使う
ax = sns.pointplot(
x='DateTime', # x軸にDateTime
y='kWh', # y軸にkWh(積算消費電力量)
data=data, # DataFrameを指定
markers=['']) # dataをplotするマーカーを非表示に
# x軸方向のデータが多すぎるので1日毎にラベルを間引く(データは間引かない)
xlabels = [datetime.split('-')[0]
if list(data.DateTime).index(datetime) % 144 is 0 else ''
for datetime in data.DateTime]
# x軸ラベルを設定&ラベル表示を90度回転
ax.set_xticklabels(xlabels, rotation='vertical')
# pngファイルに書き出す
sns.plt.savefig('冷蔵庫kWh.png')
1kWh/日程度の消費電力量なことが分かります。
data.kWh.max() / 10.0
1.0589999999999999
seabornのAPI referenceやgalleryを見ると、テンション高くなりますね。
まずは道具を使いこなせるようにならねば。