【Python】matplotlibでグラフを作成しよう!

Python


こんにちは、とりりんです。

Pythonのmatplotlibでグラフを書く方法を紹介します。

こんな方向けに書いています!

  • プログラミング勉強中の方
  • データ解析をしている方
  • データを使って練習したい方

是非最後まで読んでいただけると嬉しいです!

スポンサーリンク



データを読み込もう!

今回は、前回作成したStooqデータからダウンロードしたデータを使用します。

取得したCSVデータ(カンマ区切り)はこのようなデータとなっています。


Date,Open,High,Low,Close,Volume
2021-10-29,1081.86,1115.21,1073.205,1114.0,29918417
2021-10-28,1068.305,1081.0,1054.2,1077.04,27213173

今回は時間と終値のグラフを作成したいので、1列目と5列目のデータを使用します。

スポンサーリンク


Pythonのソースコード

まず全部のっけちゃいます!

argparseなどをpipでインストールしないと動かないかもしれません。

import argparse
import csv
import math

import matplotlib.pyplot as plt

from datetime import datetime


def main():

    args = Parse()

    GetData(args)

    return


def GetData(args):
    """
    Read CSV Data Between $start and $end
    
    Args:
        args (argparse): CommandLine Arguments
    """

    start = datetime.strptime(args.start, "%Y%m%d")
    end = datetime.strptime(args.end, "%Y%m%d")
    
    f = open(args.csvPath, "r")
    reader = csv.reader(f, delimiter=",")

    # ヘッダを読み飛ばし
    header = next(reader)

    # data: [時刻, 終値]のリスト
    data = []
    for d in reader:
        t = datetime.strptime(d[0], "%Y-%m-%d")
        if start <= t and t <= end:
            data.append([t, float(d[4])])
            
    sortData = sorted(data, key=lambda t: t[0])

    CreateGraph(args, sortData, start, end)

    return



def CreateGraph(args, data, start, end):
    """
    Create Graph Using Data

    Args:
        args  (argparse): CommandLine Arguments
        data      (list): List of Time and Closing Price
        start (datetime): Start Time of Data
        end   (datetime): End Time of Data
    """

    x, y = [], []
    for d in data:
        x.append(d[0])
        y.append(d[1])
        
    # Y軸範囲指定(max: 切り上げ, min: 切り捨て)
    ymax, ymin = math.ceil(max(y)/100)*100, math.floor(min(y)/100)*100
    
    plt.xlim([start, end])
    plt.ylim([ymin, ymax])

    plt.xlabel('Time', fontsize=12)
    plt.ylabel('ClosingPrice[$]', fontsize=12)

    plt.title(args.brand + " StockPrice", fontsize=15)
    plt.grid(True)
    plt.plot(x, y, color="red")
    
    plt.savefig(args.savePath)
    plt.show()
    
    
    return



    
def Parse():
    """
    Get CommandLine Arguments

    Note:
        Input Date: YYYYMMDD
    """
    
    parser = argparse.ArgumentParser()
    parser.add_argument("csvPath", type=str)
    parser.add_argument("start", type=str)
    parser.add_argument("end", type=str)
    parser.add_argument("-b", "--brand", type=str, default="TSLA")
    parser.add_argument("-s", "--savePath", type=str, default="./tsla.png")
    args = parser.parse_args()

    return args




if __name__ == "__main__":
    main()

コマンドライン引数を用いているため面倒くさいことになってますが、使い方は簡単です。

基本は、python [ファイル名] [コマンドライン引数]です。

例えばデータであるCSVファイルが./test.csv、グラフにしたいデータ開始時刻が2021年4月1日、終了時刻が2021年10月31日、銘柄をアップル、保存画像パスを./aapl.pngとしたい場合は、以下のようになります。

      python createGraph.py ./test.csv 20210401 20211031 -b AAPL ./aapl.png

では、各関数に関して説明します。

matplotlibのグラフだけ分かればいい!という方は、グラフ作成まで読み飛ばしてください。

スポンサーリンク

コマンドライン引数

def Parse():
    """
    Get CommandLine Arguments

    Note:
        Input Date: YYYYMMDD
    """
    
    parser = argparse.ArgumentParser()
    parser.add_argument("csvPath", type=str)
    parser.add_argument("start", type=str)
    parser.add_argument("end", type=str)
    parser.add_argument("-b", "--brand", type=str, default="TSLA")
    parser.add_argument("-s", "--savePath", type=str, default="./tsla.png")
    args = parser.parse_args()

    return args

コマンドライン引数に関しては、Parse()で取得します。

コマンドライン引数の設定は10~14行目で指定しています。

コマンドライン引数には取得したい株価データのパス、及び開始時刻と終了時刻は入れてください(これらは必須)。

時刻の形式はYYYYMMDD(例えば、20211031)です。

また、コマンドライン引数には銘柄と保存する画像のパスを指定可能(オプションなので任意)です。

これらは指定する必要はありませんが、指定しない場合はデフォルト値(銘柄はテスラ、保存ファイルパスは./tsla.png)が入ってしまいます。

変更したい場合は、コマンドライン引数に-b AAPLみたいな感じで入れてください。

データ読み込み

def GetData(args):
    """
    Read CSV Data Between $start and $end
    
    Args:
        args (argparse): CommandLine Arguments
    """

    start = datetime.strptime(args.start, "%Y%m%d")
    end = datetime.strptime(args.end, "%Y%m%d")
    
    f = open(args.csvPath, "r")
    reader = csv.reader(f, delimiter=",")

    # ヘッダを読み飛ばし
    header = next(reader)

    # data: [時刻, 終値]のリスト
    data = []
    for d in reader:
        t = datetime.strptime(d[0], "%Y-%m-%d")
        if start <= t and t <= end:
            data.append([t, float(d[4])])
            
    sortData = sorted(data, key=lambda t: t[0])

    CreateGraph(args, sortData, start, end)

    return

次にGetData(args)関数の説明です。

この関数は必要なデータを読み込む処理をしています。

まず、strptimeを使って文字列型をdatetime型に変えます(9, 10行目)。

Pythonではという概念が薄いのですが、他言語では特に重要なので覚えておきましょう。

そして、ファイルからデータを読み込みます(11, 12行目)。

また、データにはヘッダ(Date,Open,High,Low,Close,Volume)があり不要なので読み飛ばします(16行目)。

その後、dataというリストを作成し、時刻と終値を格納します(19~23行目)。

データは上で見た通り、新しい方から順になっており、その状態をそのまま変数dataに格納しています。

これをsortedを使ってソートして、古い時刻からのデータとします。

以上が終了したら、次に示すCreateGraph関数を呼び出します。

スポンサーリンク

グラフ作成

def CreateGraph(args, data, start, end):
    """
    Create Graph Using Data

    Args:
        args  (argparse): CommandLine Arguments
        data      (list): List of Time and Closing Price
        start (datetime): Start Time of Data
        end   (datetime): End Time of Data
    """

    x, y = [], []
    for d in data:
        x.append(d[0])
        y.append(d[1])
        
    # Y軸範囲指定(max: 切り上げ, min: 切り捨て)
    ymax, ymin = math.ceil(max(y)/100)*100, math.floor(min(y)/100)*100
    
    plt.xlim([start, end])
    plt.ylim([ymin, ymax])

    plt.xlabel('Time', fontsize=12)
    plt.ylabel('ClosingPrice[$]', fontsize=12)

    plt.title(args.brand + " StockPrice", fontsize=15)
    plt.grid(True)
    plt.plot(x, y, color="red")
    
    plt.savefig(args.savePath)
    plt.show()
    
    
    return

今回のメイン関数であるcreateGraph関数では、matplotlibを使ってグラフを作成します。

まず、データリストの中身は[時刻, 終値]となっているため、それぞれの要素をx, yとして取り出します(12~15行目)。

17~27行目はグラフの設定をしています。

plt.xlim, plt.ylimはX軸とY軸のラベル設定で、両端を指定します。

18行目は自動化させるために計算しているだけです。

plt.xlabel, plt.ylabelは軸名称を、plt.titleはタイトル、plt.gridはグリッド線を示します。

ラベル名称とタイトルに関しては、引数のfontsizeで大きさを指定できます。

そして、plt.plotで描画した後にplt.savefigでファイルに保存、plt.showで画面に表示します。

今回は単純なグラフでしたが、matplotlibでは2軸グラフや対数グラフなどのもっと難しいグラフも描画できますよ!

まとめ

今回は株価チャートの描画を勉強しました!

matplotlibは色々便利なので、覚えておいた方が良さそうです。

最後までご覧いただき、ありがとうございました!


Python


伊藤園の「株価」は「気温」と関係ある?

↓とりりんを応援して頂けると嬉しいです!↓
にほんブログ村 投資ブログ お金(投資)へ
にほんブログ村

スポンサーリンク



コメント

タイトルとURLをコピーしました