Pythonでログ解析(7) 〜CSVファイルからグラフを作成する!〜

ベル

気付けばなかなかの長編になってきました。これで最後です。これまでに作成してきた『CSVファイルを使ってグラフ作成』を行っていきます。CSVファイルの作成は、解析していく上で大変利用しやすいですが、ユーザに見せるのはかなり辛いものがあります。それをグラフ化してわかりやすい形にしてあげるのも、大切はスキルだと思います。最後まで勉強していきましょう!

 

これまで、PythonのインストールからCSVファイルの作成、ログの定期取得までを学習してきました。どれもな使って学習していきますので、『やり逃した!』、『忘れちゃった!』って方は、こちらからお願いします。

 

Pythonでログ解析(1) ~パソコンにPythonを入れるまで~

Pythonでログ解析(2) ~プログラムを実行するまで~

Pythonでログ解析(3) ~ログの読み込みからCSVファイルの作成まで~

Pythonでログ解析(4) 〜【番外編①】ログの定期取得マクロ〜

Pythonでログ解析(5) 〜【番外編②】ログの定期取得マクロ〜

Pythonでログ解析(6) ~ログ解析対象日を入力させるまで~

 

 

matplotlib、pandasを使おう

それでは、授業を始めます。今回、使用するモジュールは、『matplotlib』『pandas』です。matplotlibは、pythonのグラフ化でもっとも有名なモジュールになります。今回だけに限らず、触れる機会もあると思いますので、覚えておきましょう!また、pandasとは、データ解析用モジュールでCSVファイルなどを読み込んで加工したりするによく使われます。これも覚えておきましょうね!

 

モジュールのインストールとインポート

それではいつも通りモジュールのインストールから始めましょう!コマンドプロンプトを立ち上げて以下のコマンドを入力してください。

 

pip install matplotlib

 

これだけですね。インストールが終わったらいつも通りインポートしていこうと思いますので、ATOMを立ち上げて対象のPythonファイルを立ち上げてください。立ち上がってきたら、以下のコードを追記してください。

 

import pandas as pd
import matplotlib.pyplot as plt

 

今回、importの後ろに『as』がありますが、これは別名で使用することを可能とするオプションになります。後で、別名で使用する際に改めて解説しますので、忘れないでくださいね。

 

ボタンの追加と配置

それでは、グラフ化を実行するためのボタンを作成・配置していこうと思います。前回の復習になると思いますので、忘れてしまった方は思い出してくださいね!

 

ボタンの追加

前回の授業でTkinterを使って『OK』と『Close』の2つのボタンを作成しましたが、3つ目のボタン『GRAPH』を作成したいと思います。それに伴って『OK』ボタンでは、なんのことだかわからなくなるので、『CSV』に変更しておきます。

 

button1 = ttk.Button(frame1, width=15, text=‘CSV’, command=foo)
button2 = ttk.Button(frame1, width=15, text=‘GRAPH’, command=bar)
button3 = ttk.Button(frame1, width=15, text=‘Close’, command=root.destroy)

 

今回作成した『GRAPH』ボタンには、関数『bar』を実行するように紐づけます。前回の『CSV』ボタンで関数『foo』を実行させるように紐づけたのと同じなのでわかりますね。また、見た目的に左から『CSV』、『GRAPH』、『Close』の順番に表示したいため、『button』番号もわかりやすく変更しておこうと思います。以下のような表示になるように作成していこうと思います。

 

 

ボタンの配置

それでは、作成したボタンを配置していきましょう。これも前回と同様なので、以下のコードで確認だけしておいてください。

button3.grid(row=2,column=3,sticky=E)

 

 

グラフの作成

それではグラフを作成していきましょう。以下のコードで確認してください。

 

def bar():
    days = %s  % t.get()
    df = pd.read_csv(days + ‘_log_data.csv’, names=[‘num1’, ‘num2’])
    plt.plot(df[‘num1’],df[‘num2’],marker=‘o’)
    plt.show()

 

まずは、呼び出しの『def bar():』で始めます。その後、CSVファイル作成と同じように、Tkinterで入力された値を同じように使用するため、『days = ‘%s’  % t.get()』を使用します。これで入力された日付を変数『days』に代入してCSVファイルを読み込みます。その読み込みにしようするモジュールが『pandas』になります。『pd』と書かれているのは、インポート時にモジュール呼び出しを別名にしたと思います。その別名を使ってモジュールを呼び出すように変更しています。呼び出す際にファイルの1列目を『num1』、2列目を『num2』として読み込むようにしています。

 

次に『num1』、『num2』を使ってグラフを作成するように『plt.plot(df[‘num1’],df[‘num2′],marker=’o’)』と書いています。最後の『marker=’o’』でグラフのデータの値を円マークすることができます。このマークは、円以外にも星(’★’)や点(’.’)、四角形(’4’)など多くのマークがありますので、お好みで選んでください。

 

 

グラフの調整

ここまで出来たらグラフを作成することができますので、表示させてみてください。こんな画面ができていたら成功です。

 

 

って「あれ?見づらいなぁ」って思いましたよね?これは時間表示がmsec単位まで表示されていることが原因となります。また、グラフの表示画面が小さいため文字がつぶれてしまっているのも原因かと思います。その辺の調整をしてみますね。

 

文字数の変更

X軸に表示している時刻がmsecまで表示されているため、文字がつぶれてしまっています。これを秒までしか表示しないように変更していきます。以下のコードをCSVファイルに書き込む前に入れるだけで、左から8文字まで(00:00:00)だけに加工することが可能となります。

 

tm = tm[0:8]

 

 

表示画面の指定

matplotlibで簡単に表示の画面サイズも変更できるんです。以下のコマンドで縦(300ピクセル)×(1200ピクセル)の画面表示に変更することができます。

plt.figure(figsize=(12,3))

 

使用されるグラフの精度に応じて、このサイズを変更して見やすくなるように調整してみてください。

 

たったこれだけの調整で以下のような画面に変わったと思います。

 

これでグラフ化が完成しました。これ以外にもX軸・Y軸にタイトルを入れたり、X軸の時間を斜めに書くなどしてより見やすい画面に変更するなど、いろんなことができるようになっています。ぜひ、試してみてグラフに合わせて調整してみてください。きっと素敵なグラフが作成できると思います。

 

 

コードの紹介

それでは、最後に今回作成したコードを紹介させていただきます。参考にしてみてもらえればと思います。

 

import glob
import os
import csv
from tkinter import *
from tkinter import ttk
import pandas as pd
import matplotlib.pyplot as plt

# 2018年7月1日のログから抽出
# days = ‘20180701’
# DATA_DIR = (‘./log/’ + days)
# print(DATA_DIR)
# /log/20180701の配下に保存されているテキストファイルを変数「files」に入れる
# files = glob.glob(os.path.join(DATA_DIR, ‘*.txt’))

def foo():
    days = %s  % t.get()
    DATA_DIR = (‘./log/’ + days)
    files = glob.glob(os.path.join(DATA_DIR, ‘*.txt’))

    # 過去データの削除
    if os.path.exists(days + ‘_log_data.csv’) :
        os.remove(days + ‘_log_data.csv’)

    # 「files」から1ファイルずつOpenしていく
    for file in files:
        with open(file) as f:
            # openしたファイルから1行ずつ読み込んでいく
            lines = f.readlines()
            lines_strip = [line.strip() for line in lines]

            # ログ取得時間の取得
            # 「Time source is user configuration」という文字が含まれている行を抜き出して
            # 変数「l_time」に代入する
            l_time = [line for line in lines_strip if ‘Time source is user configuration’ in line]
            # 「l_time」の中に保存された1行を空白セルで区切る
            # 例)「Time source is user configuration, 00:00:00.963 UTC Sun Jul 1 2018」
            time_sp = str(l_time).split(‘ ‘)
            # 空白セルで区切られた1行から6月番目だけを抽出し、「time」に代入する
            time = time_sp[5::6]

            #Outputデータ量の取得
            # 「5 minute output rate」という文字が含まれている行を抜き出して
            # 変数「l_opt」に代入する
            l_opt = [line for line in lines_strip if ‘5 minute output rate’ in line]
            # 「l_opt」の中に保存された1行を空白セルで区切る
            # 例)「5 minute output rate 2367 bits/sec, 21 packets/sec」
            opt_sp = str(l_opt).split(‘ ‘)
            # 空白セルで区切られた1行から5月番目だけを抽出し、「opt」に代入する
            opt = opt_sp[4::5]

            i = 0
            for tm in time:
                 # 先程抽出した、変数「time」と変数「opt」を組み合わせて「table」に代入していく
                 # 間に「,」を入れることでcsv化した時に列を分割させる
                tm = tm[0:8]
                table = (tm, ‘,’, opt[i])
                 # 日付入りのCSVファイルを作成する
                 # オプションで「a」を選択することで上書きモードでオープン
                f_log = open(days + ‘_log_data.csv’, ‘a’)
                 # csvファイルに先程の「table」を書き込む
                f_log.writelines(table)
                 # 「’\n’」を入れることで改行させる
                f_log.writelines(\n)
                 # 次のデータに進む
                i += 1
                 # csvファイルを閉じる
                f_log.close()

def bar():
    days = %s  % t.get()
    df = pd.read_csv(days + ‘_log_data.csv’, names=[‘num1’, ‘num2’])
    plt.figure(figsize=(12,3))
    plt.plot(df[‘num1’],df[‘num2’],marker=‘o’)
    plt.show()

def close_window(root):
    root.destroy()

# rootの作成
root = Tk()
root.title(‘日付指定’)
frame1 = ttk.Frame(root)
label1 = ttk.Label(frame1, text=‘日付:’)

t = IntVar()

entry1 = ttk.Entry(frame1, width=15, textvariable=t)
button1 = ttk.Button(frame1, width=15, text=‘CSV’, command=foo)
button2 = ttk.Button(frame1, width=15, text=‘GRAPH’, command=bar)
button3 = ttk.Button(frame1, width=15, text=‘Close’, command=root.destroy)

frame1.grid(sticky=(N,E,S,W))
label1.grid(row=1,column=1,sticky=E)
entry1.grid(row=1,column=2,sticky=E)
button1.grid(row=2,column=1,sticky=E)
button2.grid(row=2,column=2,sticky=E)
button3.grid(row=2,column=3,sticky=E)

for child in frame1.winfo_children():
    child.grid_configure(padx=5, pady=5)

root.mainloop()

 

まとめ

ベル

Pythonでログ解析は、いかがだったでしょうか?僕自身もPythonを初めて使ってみて勉強しながらの授業でしたので、至らない点も多々あったかと思います。コード自体も例外処理もしてないですし、プログラマーから見たら読みづらいコードもありますが、今後、勉強していく中でアップデートしていきますので、また、遊びに来てください。

 

退屈なことはPythonにやらせよう

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

新品価格
¥3,996から
(2018/7/21 23:39時点)

 子供の才能を引き出す最高の学びプログラミング教育

子どもの才能を引き出す最高の学びプログラミング教育

ゲームを作りながら楽しく学べるPythonプログラミング

ゲームを作りながら楽しく学べるPythonプログラミング (Future Coders(NextPublishing))

新品価格
¥2,700から
(2018/7/21 23:44時点)

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です