Pythonでのプロットと可視化(pandas編) 〜 pandas.DataFrameのplot

前回「Pythonでのプロットと可視化(pandas編) 〜 pandas.Seriesのplot」の続き。
今度はpandas.DataFrame形式のデータをplotする。

さて、本題に入る前に、pandas.Seriesとpandas.DataFrameの違いを把握しておく。
次のコードを実行して、pandas.Seriesとpandas.DataFrameのデータを作成して中身を見てみる。

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 1.配列データの準備
dataNdArray = np.random.randn(1000).cumsum()

# 2.Series形式およびDataFrameへ変換
s  = pd.Series(dataNdArray)
df = pd.DataFrame(dataNdArray)

pandas.Seriesとpandas.DataFrameは、それぞれ次のようなデータとなっている。

◎pandas.Series

0 0.761842
1 -0.918852
2 -0.595298
3 -1.158531
4 -0.727004
5 -2.763503
・・・・・

◎pandas.DataFrame
0
0 0.761842
1 -0.918852
2 -0.595298
3 -1.158531
4 -0.727004
5 -2.763503
・・・・・

pandas.DataFrameのカラムを指定したdf[0]のデータは、pandas.Seriesとなる。今回の場合、これは「s = pd.Series(dataNdArray)」と同じデータ。
他にも沢山違いはあるが、これらはまた別の機会に行おう。

さて可視化。
◎折れ線
まずは単純なplot。

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 1.配列データの準備
dataNdArray = np.random.randn(1000).cumsum()

# 2.Series形式およびDataFrameへ変換
df = pd.DataFrame(dataNdArray)

# 3.可視化
df.plot()

実行結果は次図。

次に、複数サブプロットを用意してそのうちの1つにグラフを描く。

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 1.配列データの準備
dataNdArray = np.random.randn(1000).cumsum()

# 2.Series形式およびDataFrameへ変換
df = pd.DataFrame(dataNdArray)

# 3.可視化
df.plot()

# 3.可視化
# 3-1-1.サブプロットの準備1(複数のサブプロットを一度に作成)
fig, axes = plt.subplots(2,1)

# 3-2-1.作成したサブプロットをplot関数の引数に指定して可視化実行
df.plot(
    ax = axes[0],
    label='random walk',
    style='k',
    alpha=1,
    kind='line',
    use_index=True,
    grid=True
)
axes[0].legend(loc='best')

結果は次図。

理由は分からないが、「label='random walk'」で指定したラベルが描かれない。。。
凡例を描くかどうかは、plot関数のオプションlegendで指定できる。デフォルトはTrueとなっている。
なので、「axes[0].legend(loc='best')」は意味をなさないのだろう
※)一旦放置して進める。

さて、これまではpandas.DataFrameのデータが1つだったが、pandas.DataFrameはテーブル構造のデータを持つことができる。そのようなデータの可視化を試してみる。
まずはデータの準備だが、ランダムウォークのデータを4列準備する。
それには、次のコードを実行すれば良い。cumsum()の引数に0を指定しないと、全てのデータの累積和を求めてしまうので0を指定して各列毎に累積和を求める。

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

np.random.randn(1000,4).cumsum(0)

データを取得したら、1次元の場合と同様に可視化するだけで良い。

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 1.配列データの準備
dataNdArray = np.random.randn(1000,4).cumsum(0)

# 2.Series形式およびDataFrameへ変換
df = pd.DataFrame(dataNdArray)

# 3.可視化
# 3-1-1.サブプロットの準備1(複数のサブプロットを一度に作成)
fig, axes = plt.subplots(2,1)

# 3-2-1.作成したサブプロットをplot関数の引数に指定して可視化実行
df.plot(
    ax = axes[0],
    label='random walk',
    style='k',
    alpha=1,
    kind='line',
    use_index=True,
    grid=True
)

結果は次図。

ところで、グラフの凡例が数字(データフレームのカラム名)となっている
これに名前を付けたい。それには、「columns=['Open','High','Low','Close']」などとして、データフレーム作成時にカラム名を与える
※)この時点で、作成するランダムウォークの列数とデータフレームへのデータ変換時のコードに依存関係が出来てしまうのが嫌だが仕方がないのだろうか。

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 1.配列データの準備
dataNdArray = np.random.randn(1000,4).cumsum(0)

# 2.Series形式およびDataFrameへ変換
df = pd.DataFrame(
    dataNdArray,
    columns=['Open','High','Low','Close']
)

# 3.可視化
# 3-1-1.サブプロットの準備1(複数のサブプロットを一度に作成)
fig, axes = plt.subplots(2,1)

# 3-2-1.作成したサブプロットをplot関数の引数に指定して可視化実行
df.plot(
    ax = axes[0],
    label='random walk',
    style='k',
    alpha=1,
    kind='line',
    use_index=True,
    grid=True
)

結果は次図だが、相変わらず凡例がおかしな位置に出来てしまう。

以上。

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理