【Pandas】グラフ表示[Python]

  • URLをコピーしました!
目次

データ解析支援ライブラリPandas

前回、ランダムなデータファイルを作るプログラムを作成してみました。

今回はそのプログラムで作成したデータをデータ解析支援ライブラリPandasを使って読み込み、グラフ表示してみたいと思います。

ちなみにPandas自体はデータの読み込み、グラフ表示だけではなく、データを解析するための様々なコマンドが備えられています。

その細かな解説はまた後ほどすることにして、とりあえず使ってみるという精神で進めていきましょう。

今回使ったデータセットはこちら。

もしこの記事と全く同じ結果を得たい方は、こちらのデータセットを使ってみてください。

それでは始めていきましょう。

ライブラリのインポートとセッティング

今回使うライブラリは「os」、「pandas」、「matplotlib」です。

ということでインポート部分はこんな感じ。

import os
import pandas as pd
from matplotlib import pyplot as plt

「pandas」は慣例的に「pd」としてインポートされるので、それに倣っておきます。

「matplotlib」はいつも通り「Pyplot」を「plt」としてインポートしておきます。

次に「file_ext = “.txt”」を追加します。

import os
import pandas as pd
from matplotlib import pyplot as plt

file_ext = ".txt"

こちらは後ほど読み込むファイルを選定するために使います。

今回の場合は拡張子が「.txt」というファイルのみ読み込むようにプログラムするということです。

もし拡張子が「.csv」のファイルを読み込みたい場合は、 「file_ext = “.csv”」と変更してください。

ファイル名の取得

では次にファイル名の取得を行なっていきます。

その部分はこんな感じ。

filename = []

for f in os.listdir("./"):
    if f[-4:] == file_ext:
        filename.append(f)

print(filename)

「filename = []」でファイル名を格納するための空のリストを作ります。

「for f in os.listdir(“./”):」で現在いるフォルダの中のフォルダ名・ファイル名を全て取得し、一つずつ変数fに格納します。

ただこのままでは目的のファイル以外のものまで取得してしまうので、「if f[-4:] == file_ext:」で変数file_extと同じ、つまり拡張子が「.txt」のファイルのみ次の処理に進ませます。

ここまでで目的のファイルが取得できているので、そのファイル名をリストfilenameに格納します。

最後に「print(filename)」でちゃんと目的のファイル名が取得できているか確認してみました。

実行結果
['testdata_9.txt', 'testdata_8.txt', 'testdata_10.txt', 'testdata_5.txt', 'testdata_4.txt', 'testdata_6.txt', 'testdata_7.txt', 'testdata_3.txt', 'testdata_2.txt', 'testdata_1.txt']

順番はおかしいですが、とりあえず必要なファイル名が取得できているので、次に進むことにしましょう。

ちなみに「print(filename)」は確認用だったので、行の先頭に「#」をつけてコメントアウトしておきます。

Pandasでのデータ読み込み

ここからPandasを使う部分に入っていきます。

このセクションではファイル名を一つ取得し、そのファイル名をもつファイルをPandasで開き、そのデータを表示してみましょう。

その部分のプログラムはこんな感じ。

for f in filename:
    df = pd.read_csv(f)
    
    print(df)

「for f in filename:」でリストfilenameにあるファイル名を一つ取得し、変数fに入れます。

そして「df = pd.read_csv(f)」でファイルを開き、その中のデータを変数dfに入れます。

ということで、PandasでCSVファイルを読み込む方法は「pd.read_csv(ファイル名)」となります。

そして格納したデータを「print(df)」で表示しています。

これをリストfilenameに格納されているファイル名に対して繰り返すというわけです。

ということでここまでのプログラムはこうなります。

filename = []

for f in os.listdir("./"):
    if f[-4:] == file_ext:
        filename.append(f)

# print(filename)
        
for f in filename:
    df = pd.read_csv(f)
    
    print(df)

実行結果

  dataname  value_1  value_2  value_3  value_4  value_5  value_6
0   data_1       77        6       94       78       13       69
1   data_2       74       93       26       64       48        8
2   data_3       70       14       92       11       61       71
3   data_4       52       85       14       35       44       62
4   data_5       62       84        8       15       67       11
5   data_6        9       85       30       95        4       55
6   data_7       59       12        9       16       42       11
7   data_8       37       86       86       26       32       22
8   data_9       16       58       62       64       33       98
9  data_10        8       87       56       32       65       99
  dataname  value_1  value_2  value_3  value_4  value_5  value_6
0   data_1       75       45       18       33       56       22
1   data_2       87        1       46       69       91       54
2   data_3       27       46       63       57       79       78
3   data_4       18       34       12       83       66       40
4   data_5       80       84       43       65       60       89
5   data_6       32       66        7       56       34       92
6   data_7       77       83       67       54       21       57
7   data_8       79       88       42       49       74       38
8   data_9       64       93       50       79       38       57
9  data_10       87       39       76       84       55       91...(以下省略)

これでちゃんとデータが読み込めたことが確認できました。

確認できたので、print(df)はコメントアウトしておきます。

グラフの表示

Pandasを使った場合、グラフの表示は簡単です。

「df.plot()」 だけでグラフを表示することができます。

つまりここまでのプログラムはこんな感じ。

filename = []

for f in os.listdir("./"):
    if f[-4:] == file_ext:
        filename.append(f)

# print(filename)
        
for f in filename:
    df = pd.read_csv(f)
    
#     print(df)
    
    df.plot()

実行結果

こんなグラフが10個表示されたら成功です。

これにそれぞれのグラフにタイトルをつけるのですが、そのタイトルはそれぞれのファイル名としてみましょう。

その場合は「plt.title()」を追加し、括弧の中はファイル名、つまり今回の場合は変数fを入れます。

filename = []

for f in os.listdir("./"):
    if f[-4:] == file_ext:
        filename.append(f)

# print(filename)
        
for f in filename:
    df = pd.read_csv(f)
    
#     print(df)
    
    df.plot()
    plt.title(f)

実行結果

こんなファイルでタイトルがそれぞれ違うグラフが得られたら成功です。

あとは一つずつ保存するのは面倒なので、自動保存のコマンド「plt.savefig()」を追加しておきましょう。

filename = []

for f in os.listdir("./"):
    if f[-4:] == file_ext:
        filename.append(f)

# print(filename)
        
for f in filename:
    df = pd.read_csv(f)
    
#     print(df)
    
    df.plot()
    plt.title(f)
    
    plt.savefig(f[:-4] + ".png")

これを実行すると、グラフが自動でフォルダに保存されます。

ちなみに「f[:-4] + “.png”」としたのは、変数fは拡張子を含んだファイル名なので、その拡張子部分(後ろから4文字)を除いた部分に画像用の拡張子「.png」を追加するという操作をしています。

グラフの見栄えを整える

最後にグラフの見栄えを整えていきましょう。

今、得られているグラフはこんな感じ。

実はX軸が数字になってしまっているので、ここをデータ名に変えましょう。

この時の問題点はデータをPandasで読み込む時のこのコマンドにあります。

df = pd.read_csv(f)

またちなみに各ファイルの中のデータはこんな感じになっています。

現在のコマンドだと「dataname」の列もデータの一部として判断されていて、それぞれのデータのインデックスが左の「0 1 2 3 …」というように割り振られています。

でも本当は「dataname」の列をインデックスとして使いたいわけです。

そのためコマンドはこうなります。

df = pd.read_csv(f, index_col = 0)

「index_col = 0」を追加するとその数字の列がインデックスとして認識されます。

ということで書き直したプログラムがこちら。

filename = []

for f in os.listdir("./"):
    if f[-4:] == file_ext:
        filename.append(f)

# print(filename)
        
for f in filename:
    df = pd.read_csv(f, index_col = 0)
    
#     print(df)
    
    df.plot()
    plt.title(f)
    
    plt.savefig(f[:-4] + ".png")

実行結果

X軸が各データ名に変わったグラフが10個できたと思います。

ただ今度はX軸のデータ名がちょっと窮屈になってしまっています。

そこでX軸のデータ名を90度回転させて縦書きにしてみましょう。

そのコマンドはこんな感じ。

plt.xticks(rotation=90)

で書き換えて、実行してみます。

filename = []

for f in os.listdir("./"):
    if f[-4:] == file_ext:
        filename.append(f)

# print(filename)
        
for f in filename:
    df = pd.read_csv(f, index_col = 0)
    
#     print(df)
    
    df.plot()
    plt.title(f)
    plt.xticks(rotation=90)
    
    plt.savefig(f[:-4] + ".png")

実行結果

X軸のデータ名が縦書きになったグラフが10個得られました。

とりあえず今回はPandasを使って、データを読み込み、グラフとして表示するということをやってみました。

やはりいつも使っている方法とは違うので、戸惑った箇所はあるのですが、思ったより使いやすいかもしれないというのが個人的な感触です。

単純なデータ(例えば時間と温度、湿度くらいのデータ)だったら、Pandasを使う利点はそれほどないかもしれませんが、複数の値が一つのデータに含まれていて、さらにそのデータが大量にある場合はPandasを使う格好の場面になるでしょう。

とりあえずデータをランダムに作り出すプログラムもできたことですし、Pandasを勉強する体制は整ってきたなと。

また機会があれば、Pandasの解説をしていきたと思います。

ということで今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次