Python {Article017}

ようこそ「Python」へ...

生データを使用してMatplotlib(plot_date)で日付をX軸にした線グラフを作成する方法を学ぶには【Pandas+Matplotlib】

ここではWebサイトで公開されて生データを使用してPandas+MatplotlibでX軸を日付にした線グラフ(plot_date)を作成する方法を解説します。 Matplotlibのplot_date()メソッドは、線グラフを作成するplot()メソッドと類似していますがX軸を日付するのが特徴です。 COVID-19の感染者の推移とか、株価の推移を調べるのに向いています。 最初に厚労省のWebサイトからCOVID-19のデータをダウンロードしてMatplotlibのplot_date()で線グラフを作成する方法を説明します。 次に、Yahoo! FinanceからGAFAの株価をダウンロードして線グラフ(plot_date)を作成する方法も説明します。 最後に、Yahoo! Financeから仮想通貨(暗号通貨)のビットコイン、イーサリアム等の価格をダウンロードして線グラフ(plot_date)を作成する方法も説明します。

厚労省のWebサイトからCOVIC-19のデータをダウンロードするにはPandasのread_csv()メソッドを使用します。 read_csv()の引数にCSVファイルのURLを指定すると手動でダウンロードすることなく完全に自動化できます。 なお、COVIC-19のデータは「記事(Article013)」で作成しています。 事前に「記事(Article013)」で解説している手順でCSVファイルを作成しておいてください。

Yahoo! FinanceのWebサイトから株価や仮想通貨(暗号通貨)の価格をダウンロードするにはPandasのDataReaderを使用します。 DataReader()で株価をダウンロードするには引数に企業のティッカーシンボル(Apple▶AAPL)、開始日、終了日を指定します。

Yahoo! FinanceのWebサイトから仮想通貨(暗号通貨)の価格をダウンロードする場合も株価と同様PandasのDataReaderを使用します。 ビットコインの価格をダウンロードするにはDataReader()の引数に「BTC-JPY」「BTC-USD」のように指定します。 つまり、日本円に換算するときは「BTC-JPY」、米ドルに換算するときは「BTC-USD」のように指定します。 株価も仮想通貨(暗号通貨)の価格をダウンロードするのも完全に自動化できますので手動でダウンロードする必要はありません。

ここではVisula Studio Code(VSC)の「Python Interactive window」 を使用してJupter(IPython Notebook)のような環境で説明します。 VSCを通常の環境からインタラクティブな環境に切り換えるにはコードを記述するときコメント「# %%」を入力します。 詳しい、操作手順については「ここ」 を参照してください。 インタラクティブな環境では、Pythonの「print(), plt.show()」などを使う必要がないので掲載しているコードでは省略しています。 VSCで通常の環境で使用するときは、必要に応じて「print(), plt.show()」等を追加してください。

この記事では、Pandas、Matplotlibのライブラリを使用しますので 「記事(Article001) | 記事(Article002) | 記事(Article003) | 記事(Article004)」 を参照して事前にインストールしておいてください。 Pythonのコードを入力するときにMicrosoftのVisula Studio Codeを使用します。 まだ、インストールしていないときは「記事(Article001)」を参照してインストールしておいてください。

説明文の左側に図の画像が表示されていますが縮小されています。 画像を拡大するにはマウスを画像上に移動してクリックします。 画像が拡大表示されます。拡大された画像を閉じるには右上の[X]をクリックします。 画像の任意の場所をクリックして閉じることもできます。

click image to zoom!
GAFA(1)
click image to zoom!
GAFA(2)
click image to zoom!
BTC-USD(1)
click image to zoom!
BTC-USD(2)
click image to zoom!
COVID-19(1)
click image to zoom!
COVID-19(2)
click image to zoom!
COVID-19(3)

まずはMatplotlibのplot_date()で簡単な線グラフを作成してみる

  1. Matplotlibのplot_date()でシンプルな線グラフを作成する

    Visual Studio Codeを起動したら以下のコードを入力して実行[Ctrl+Enter]します。 行4-12ではPythonのライブラリを取り込んでいます。 行13では警告メッセージが表示されないように抑止しています。 行16-25ではplot_date()メソッドで作成するグラフのX軸、Y軸の値を定義しています。 行28ではmatplotlibのplot_date()メソッドで線グラフを作成しています。 plot_date()の引数1にはX軸の値を指定します。 引数2にはY軸の値を指定します。 線グラフを作成するときは引数「LineStyle='solid'」を指定します。 行27のようにplot_date()の引数に「LineStyle='solid'」を指定しないと散布図のように「ドット」が表示されます。 行31のコメント「# %%」を入力してインタラクティブ環境に切り換えることを忘れないでください。
    # Article017_Matplotlib Date Chart Part1.py
    # %%
    # Import the necessary libraries  
    import pandas as pd
    from pandas.core.frame import DataFrame
    import pandas_datareader.data as web    # pip install pandas_datareader
    import matplotlib.pyplot as plt
    import matplotlib.dates as mpl_dates
    import matplotlib.style as style
    from datetime import datetime, timedelta
    import numpy as np
    import warnings
    warnings.simplefilter('ignore')
    
    # 1) Draw a simple date chart 
    dates_x = [
        datetime(2021, 9, 24),
        datetime(2021, 9, 25),
        datetime(2021, 9, 26),
        datetime(2021, 9, 27),
        datetime(2021, 9, 28),
        datetime(2021, 9, 29),
        datetime(2021, 9, 30)
    ]
    y = [0, 1, 3, 4, 6, 5, 7]
    
    #plt.plot_date(dates_x, y)
    plt.plot_date(dates_x, y, LineStyle='solid')
    plt.show()
    # %%
    click image to zoom!
    図1
    図1は実行結果です。線グラフが表示されています。 見た目はmatplotlibのplot()メソッドで作成した線グラフと類似しています。
  2. plot_date()の各種オプションを追加する

    行2ではmatplotlibのstyle.use()メソッドでスタイル「seaborn」を指定しています。 スタイルの一覧はインタラクティブ・ウィンドウから「style.available」を入力して[Shift+Enter]で実行すると表示されます。 行3では日本語が使えるように「font.family」に日本語のフォント「Meiryo」を設定しています。 行4ではmatplotlibのfigure()メソッドで図のサイズを指定しています。 行17ではY軸の値「y2」を定義しています。 行20ではmapplotlibのplot_date()メソッドで「y2」の線グラフを作成しています。

    行22ではgcf(get the current figure)のautofmt_xdate()メソッドでX軸の日付を自動フォマットに設定しています。 この例では日付が斜めにフォマットされます。 行24-25ではmatplotlib.datesのDateFormatter()メソッドでX軸に表示する日付を「mm/dd」の形式にフォマットしています。 X軸の日付を設定するにはgca(get the current axes)のxaxis.set_major_formatter()メソッドを使用します。

    行29ではmatplotlibのlegend()メソッドで「y, y2」の凡例を設定しています。 行30ではmatplotlibのtitle()メソッドで図のタイトルを設定しています。 行34ではmatplotlibのtight_layout()メソッドで図が綺麗に表示されるようにしています。 この指定はNOTE-PCなどを使用しているときに効果があります。 行35ではmatplotlibのshow()メソッドで図を表示しています。 インタラクティブ環境のときは必要ありません。
    # Add y2 data and options(style, title, xlabel, ylabel, legend, format dates) 
    plt.style.use('seaborn')
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.figure(figsize=(10, 6))
    
    dates_x = [
        datetime(2021, 9, 24),
        datetime(2021, 9, 25),
        datetime(2021, 9, 26),
        datetime(2021, 9, 27),
        datetime(2021, 9, 28),
        datetime(2021, 9, 29),
        datetime(2021, 9, 30)
    ]
    
    y = [0, 1, 3, 4, 6, 5, 7]
    y2 = [3, 5, 1, 2, 8, 2, 9]
    
    plt.plot_date(dates_x, y, LineStyle='solid')
    plt.plot_date(dates_x, y2, LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    #date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    #plt.yscale('log')
    #plt.xticks(rotation=45)
    plt.legend(['BTC','XRP'], loc='best')
    plt.title('Crypto Prices\n(2021)')
    #plt.xlabel('2021')
    plt.ylabel('Closing Price (JPY)')
    #plt.savefig('figure.png', dpi=300)
    plt.tight_layout()
    plt.show()
    # %%
    click image to zoom!
    図2
    図2は実行結果です。図に2本の線が表示されています。 さらに図のタイトル、凡例、Y軸のラベルも表示されています。 そしてX軸の日付が「mm/dd」の形式で斜めに表示されています。
  3. ここで解説したコードをまとめて掲載

    最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
    
    # Article017_Matplotlib Date Chart Part1.py
    # %%
    # Import the necessary libraries  
    import pandas as pd
    from pandas.core.frame import DataFrame
    import pandas_datareader.data as web    # pip install pandas_datareader
    import matplotlib.pyplot as plt
    import matplotlib.dates as mpl_dates
    import matplotlib.style as style
    from datetime import datetime, timedelta
    import numpy as np
    import warnings
    warnings.simplefilter('ignore')
    
    # %%
    
    # 1) Draw a simple date chart 
    
    dates_x = [
        datetime(2021, 9, 24),
        datetime(2021, 9, 25),
        datetime(2021, 9, 26),
        datetime(2021, 9, 27),
        datetime(2021, 9, 28),
        datetime(2021, 9, 29),
        datetime(2021, 9, 30)
    ]
    
    y = [0, 1, 3, 4, 6, 5, 7]
    
    #plt.plot_date(dates_x, y)
    plt.plot_date(dates_x, y, LineStyle='solid')
    
    plt.show()
    
    # %%
    
    # 2) Add y2 data and options(style, title, xlabel, ylabel, legend, format dates) 
    
    plt.style.use('seaborn')
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    
    plt.figure(figsize=(10, 6))
    
    dates_x = [
        datetime(2021, 9, 24),
        datetime(2021, 9, 25),
        datetime(2021, 9, 26),
        datetime(2021, 9, 27),
        datetime(2021, 9, 28),
        datetime(2021, 9, 29),
        datetime(2021, 9, 30)
    ]
    
    y = [0, 1, 3, 4, 6, 5, 7]
    y2 = [3, 5, 1, 2, 8, 2, 9]
    
    plt.plot_date(dates_x, y, LineStyle='solid')
    plt.plot_date(dates_x, y2, LineStyle='solid')
    # plt.plot_date(x, y, '|g-')
    # plt.plot_date(x, y, alpha=0.7, markersize=2, c='b')
    # plt.plot_date(x, y, marker=None, linestyle='-', label=evtype)
    
    plt.gcf().autofmt_xdate()
    #date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    #plt.yscale('log')
    #plt.xticks(rotation=45)
    #plt.legend(loc='best')
    plt.legend(['BTC','XRP'], loc='best')
    plt.title('Crypto Prices\n(2021)')
    #plt.xlabel('2021')
    plt.ylabel('Closing Price (JPY)')
    #plt.savefig('figure.png', dpi=300)
    plt.tight_layout()
    
    plt.show()
    # %%

COVID-19感染状況の推移をMatplotlibのplot_date()で視覚化する

  1. 東京の日別感染者の推移を可視化する

    # Article017_Matplotlib Date Chart Part2 COVID-19.py
    # %%
    # Import the necessary libraries  
    import pandas as pd
    from pandas.core.frame import DataFrame
    import pandas_datareader.data as web    # pip install pandas_datareader
    import matplotlib.pyplot as plt
    import matplotlib.dates as mpl_dates
    import matplotlib.style as style
    from datetime import datetime, timedelta
    import numpy as np
    import warnings
    warnings.simplefilter('ignore')
    
    # %%
    
    # 0) Load the csv files 
    csv_file = 'data/csv/covid-19/japan/combined.csv'
    #csv_file = 'https://money-or-ikigai.com/menu/python/article/data/covid-19/combined.csv'
    raw = pd.read_csv(csv_file) 
    
    # Convert str to datetime
    raw['date'] = pd.to_datetime(raw['date'])
    
    # %%
    # 1) Draw a date chart for Tokyo (title, legend, date format,...)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    plt.style.use('fivethirtyeight')    # plt.style.available
    plt.figure(figsize=(10,6))
    
    # Select file_id = 'new_cases'
    filter_by = (raw['file_id'] == 'new_cases') 
    df = raw[filter_by]
    
    # Select prefecture == 'Tokyo' & date >= 2021-08-01
    filter_by = (df['prefecture'] == 'Tokyo') & (df['date'] >= '2021-08-01')
    dfx = df[filter_by]
    
    plt.plot_date(dfx.date, dfx.new_cases, label='東京', LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.legend(loc='best')
    plt.title('COVID-19 日別感染者\n(2021)')
    #plt.xlabel('日付')
    plt.ylabel('感染者')
    plt.tight_layout()
    
    plt.show()
    
    # %%
    click image to zoom!
    図3

  2. 東京、大阪、埼玉の日別感染者を可視化する

    # 2) Draw New Cases (Tokyo, Osaka, Saitama)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    plt.style.use('fivethirtyeight')    # plt.style.available
    plt.figure(figsize=(10,6))
    
    # Select file_id = 'new_cases'
    filter_by = (raw['file_id'] == 'new_cases') 
    df = raw[filter_by]
    
    # Select Tokyo, Osaka, Saitama
    prefs = ['Tokyo','Osaka','Saitama']
    prefs_label = ['東京','大阪','埼玉']
    
    for pref in prefs:
        filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-07-22') 
        dfx = df[filter_by]     
        grp = dfx.groupby('date')['new_cases'].sum() 
        plt.plot_date(grp.index, grp.values, label=prefs_label.pop(0), LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.legend(loc='best')
    plt.title('COVID-19 日別感染者\n(2021)')
    plt.ylabel('感染者')
    plt.tight_layout()
    
    plt.show()
    click image to zoom!
    図4

  3. その他都道府県の日別感染者を視覚化する

    # 3) Draw New Cases (Saitma, Kanagawa, Chiba)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    plt.style.use('fivethirtyeight')    # plt.style.available
    plt.figure(figsize=(10,6))
    
    # Select file_id = 'new_cases'
    filter_by = (raw['file_id'] == 'new_cases') 
    df = raw[filter_by]
    
    # Select Kanagawa, Chiba, Saitama
    prefs = ['Kanagawa','Chiba','Saitama']
    prefs_label = ['神奈川','千葉','埼玉']
    
    for pref in prefs:
        filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-07-22') 
        dfx = df[filter_by]     
        grp = dfx.groupby('date')['new_cases'].sum() 
        plt.plot_date(grp.index, grp.values, label=prefs_label.pop(0), LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.legend(loc='best')
    plt.title('COVID-19 日別感染者\n(2021)')
    plt.ylabel('感染者')
    plt.tight_layout()
    
    plt.show()
    
    # %%
    
    # 4) Draw New Cases (Osaka, Hyogo, Aichi)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    plt.style.use('fivethirtyeight')    # plt.style.available
    plt.figure(figsize=(10,6))
    
    # Select file_id = 'new_cases'
    filter_by = (raw['file_id'] == 'new_cases') 
    df = raw[filter_by]
    
    # Select Osaka, Hyogo, Aichi
    prefs = ['Osaka','Hyogo','Aichi']
    prefs_label = ['大阪','兵庫','愛知']
    
    for pref in prefs:
        filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-07-22') 
        dfx = df[filter_by]     
        grp = dfx.groupby('date')['new_cases'].sum() 
        plt.plot_date(grp.index, grp.values, label=prefs_label.pop(0), LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.legend(loc='best')
    plt.title('COVID-19 日別感染者\n(2021)')
    plt.ylabel('感染者')
    plt.tight_layout()
    
    plt.show()
    click image to zoom!
    図5-1 神奈川,千葉,埼玉

    click image to zoom!
    図5-2 大阪,兵庫,愛知

  4. 日別重症者の推移を視覚する

    # 5) Draw Sever Cases (Tokyo, Osaka, Saitama)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    plt.style.use('fivethirtyeight')    # plt.style.available
    plt.figure(figsize=(10,6))
    
    # Select file_id = 'new_cases'
    filter_by = (raw['file_id'] == 'new_cases') 
    df = raw[filter_by]
    
    # Select Tokyo, Osaka, Saitama
    prefs = ['Tokyo','Osaka','Saitama']
    prefs_label = ['東京','大阪','埼玉']
    
    for pref in prefs:
        filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-07-22') 
        dfx = df[filter_by]     
        grp = dfx.groupby('date')['severe_cases'].sum() 
        plt.plot_date(grp.index, grp.values, label=prefs_label.pop(0), LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.legend(loc='best')
    plt.title('COVID-19 日別重症者\n(2021)')
    plt.ylabel('重症者')
    plt.tight_layout()
    
    plt.show()
    click image to zoom!
    図6 東京,大阪,埼玉

  5. 日別死亡者の推移を可視化する

    # 6) Draw New Deaths (Tokyo, Osaka, Saitama)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    plt.style.use('fivethirtyeight')    # plt.style.available
    plt.figure(figsize=(10,6))
    
    # Select file_id = 'new_cases'
    filter_by = (raw['file_id'] == 'new_cases') 
    df = raw[filter_by]
    
    # Select Tokyo, Osaka, Saitama
    prefs = ['Tokyo','Osaka','Saitama']
    prefs_label = ['東京','大阪','埼玉']
    
    for pref in prefs:
        filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-07-22') 
        dfx = df[filter_by]     
        grp = dfx.groupby('date')['new_deaths'].sum() 
        plt.plot_date(grp.index, grp.values, label=prefs_label.pop(0), LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.legend(loc='best')
    plt.title('COVID-19 日別死亡者\n(2021)')
    plt.ylabel('死亡者')
    plt.tight_layout()
    
    plt.show()
    click image to zoom!
    図7 東京,大阪,埼玉

  6. 東京の感染者,重症者,死亡者の推移を可視化する

    # 6) Draw new_cases, severe_cases, new_deaths (Tokyo)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    plt.style.use('fivethirtyeight')    # plt.style.available
    plt.figure(figsize=(10,6))
    
    # Select file_id = 'new_cases'
    filter_by = (raw['file_id'] == 'new_cases') 
    df = raw[filter_by]
    
    # Select Tokyo
    pref = 'Tokyo'
    cases = ['new_cases','severe_cases','new_deaths']
    cases_label = ['感染者','重症者','死亡者']
    
    for case in cases:    
        filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-07-22') 
        dfx = df[filter_by]     
        grp = dfx.groupby('date')[case].sum() 
        plt.plot_date(grp.index, grp.values, label=cases_label.pop(0), LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.legend(loc='best')
    plt.title('COVID-19 東京(日別)\n(2021)')
    plt.ylabel('人数')
    plt.tight_layout()
    
    plt.show()
    
    # %%
    
    # 7) Draw new_cases, severe_cases, new_deaths (Tokyo) : add yscale(log)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    plt.style.use('fivethirtyeight')    # plt.style.available
    plt.figure(figsize=(10,6))
    
    # Select file_id = 'new_cases'
    filter_by = (raw['file_id'] == 'new_cases') 
    df = raw[filter_by]
    
    # Select Tokyo
    pref = 'Tokyo'
    cases = ['new_cases','severe_cases','new_deaths']
    cases_label = ['感染者','重症者','死亡者']
    
    for case in cases:    
        filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-07-22') 
        dfx = df[filter_by]     
        grp = dfx.groupby('date')[case].sum() 
        plt.plot_date(grp.index, grp.values, label=cases_label.pop(0), LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.yscale('log')
    
    plt.xticks(rotation=45)
    plt.legend(loc='best')
    plt.title('COVID-19 東京(日別)\n(2021)')
    plt.ylabel('人数 : yscale(log)')
    plt.tight_layout()
    
    plt.show()
    click image to zoom!
    図8-1 東京

    click image to zoom!
    図8-2 東京:yscale(log)

  7. ここで解説したコードをまとめて掲載

    最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。

    ここで掲載しているのは「Version 2」です。 グラフの凡例に都道府県の直近の感染者数などを表示するようにしています。
    
    # Article017_Matplotlib Date Chart Part2 COVID-19 (2).py  Version 2 => combined_v2.csv
    # %%
    # Import the necessary libraries  
    import pandas as pd
    from pandas.core.frame import DataFrame
    import pandas_datareader.data as web    # pip install pandas_datareader
    import matplotlib.pyplot as plt
    import matplotlib.dates as mpl_dates
    import matplotlib.style as style
    from datetime import datetime, timedelta
    import numpy as np
    import warnings
    warnings.simplefilter('ignore')
    
    # %%
    
    # 0) Load the csv files 
    csv_file = 'data/csv/covid-19/japan/combined_v2.csv'
    #csv_file = 'https://money-or-ikigai.com/menu/python/article/data/covid-19/combined_v2.csv'
    #raw = pd.read_csv(csv_file) 
    raw = pd.read_csv(csv_file, parse_dates=['date'])
    #raw = pd.read_csv(csv_file, parse_dates=['date'], index_col='date')
    # Convert str to datetime
    #raw['date'] = pd.to_datetime(raw['date'])
    
    # %%
    # 1) Draw a date chart for Tokyo (title, legend, date format,...)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    plt.style.use('fivethirtyeight')    # plt.style.available
    plt.figure(figsize=(10,6))
    
    # Get Last date new_cases
    df = raw
    filter_by = (df['prefecture'] == 'Tokyo') 
    dfx = df[filter_by]
    last_date = dfx.date.max()
    filter_by = (df['prefecture'] == 'Tokyo')  & (df['date'] == last_date)
    dfx = df[filter_by]
    new_cases = dfx['new_cases'].values[0]
    
    # Select prefecture == 'Tokyo' & date >= 2021-08-01
    filter_by = (df['prefecture'] == 'Tokyo') & (df['date'] >= '2021-08-01')
    dfx = df[filter_by]
    
    plt.plot_date(dfx.date, dfx.new_cases, label=f'東京({new_cases})', LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.legend(loc='best')
    plt.title('COVID-19 日別感染者\n(2021)')
    #plt.xlabel('日付')
    plt.ylabel('感染者')
    plt.tight_layout()
    
    plt.show()
    
    # %%
    
    # 2) Draw New Cases (Tokyo, Osaka, Saitama)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    plt.style.use('fivethirtyeight')    # plt.style.available
    plt.figure(figsize=(10,6))
    
    # Select Tokyo, Osaka, Saitama
    df = raw
    prefs = ['Tokyo','Osaka','Saitama']
    prefs_label = ['東京','大阪','埼玉']
    
    def get_new_cases(dft):
        last_date = dft.date.max()
        filter_by = (df['date'] == last_date)
        dft = dft[filter_by]
        new_cases = dft['new_cases'].values[0]     
        return new_cases
    
    for pref in prefs:
        filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-07-22') 
        dfx = df[filter_by]    
        new_cases = get_new_cases(dfx)
        label = f'{prefs_label.pop(0)}({new_cases})'
        grp = dfx.groupby('date')['new_cases'].sum() 
        plt.plot_date(grp.index, grp.values, label=label, LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.legend(loc='best')
    plt.title('COVID-19 日別感染者\n(2021)')
    plt.ylabel('感染者')
    plt.tight_layout()
    
    plt.show()
    
    # %%
    
    # 3) Draw New Cases (Saitma, Kanagawa, Chiba)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    plt.style.use('fivethirtyeight')    # plt.style.available
    plt.figure(figsize=(10,6))
    
    # Select Kanagawa, Chiba, Saitama
    df = raw
    prefs = ['Kanagawa','Chiba','Saitama']
    prefs_label = ['神奈川','千葉','埼玉']
    
    def get_new_cases(dft):
        last_date = dft.date.max()
        filter_by = (df['date'] == last_date)
        dft = dft[filter_by]
        new_cases = dft['new_cases'].values[0]     
        return new_cases
    
    for pref in prefs:
        filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-07-22') 
        dfx = df[filter_by]     
        new_cases = get_new_cases(dfx)
        label = f'{prefs_label.pop(0)}({new_cases})'    
        grp = dfx.groupby('date')['new_cases'].sum() 
        plt.plot_date(grp.index, grp.values, label=label, LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.legend(loc='best')
    plt.title('COVID-19 日別感染者\n(2021)')
    plt.ylabel('感染者')
    plt.tight_layout()
    
    plt.show()
    
    # %%
    
    # 4) Draw New Cases (Osaka, Hyogo, Aichi)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    plt.style.use('fivethirtyeight')    # plt.style.available
    plt.figure(figsize=(10,6))
    
    # Select Osaka, Hyogo, Aichi
    df = raw
    prefs = ['Osaka','Hyogo','Aichi']
    prefs_label = ['大阪','兵庫','愛知']
    
    def get_new_cases(dft):
        last_date = dft.date.max()
        filter_by = (df['date'] == last_date)
        dft = dft[filter_by]
        new_cases = dft['new_cases'].values[0]     
        return new_cases
    
    for pref in prefs:
        filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-07-22') 
        dfx = df[filter_by]    
        new_cases = get_new_cases(dfx)
        label = f'{prefs_label.pop(0)}({new_cases})'       
        grp = dfx.groupby('date')['new_cases'].sum() 
        plt.plot_date(grp.index, grp.values, label=label, LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.legend(loc='best')
    plt.title('COVID-19 日別感染者\n(2021)')
    plt.ylabel('感染者')
    plt.tight_layout()
    
    plt.show()
    
    # %%
    
    # 5) Draw Sever Cases (Tokyo, Osaka, Saitama)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    plt.style.use('fivethirtyeight')    # plt.style.available
    plt.figure(figsize=(10,6))
    
    # Select Tokyo, Osaka, Saitama
    df = raw
    prefs = ['Tokyo','Osaka','Saitama']
    prefs_label = ['東京','大阪','埼玉']
    
    def get_severe_cases(dft):
        last_date = dft.date.max()
        filter_by = (df['date'] == last_date)
        dft = dft[filter_by]
        severe_cases = dft['severe_cases'].values[0]     
        return int(severe_cases)
    
    for pref in prefs:
        filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-07-22') 
        dfx = df[filter_by] 
        severe_cases = get_severe_cases(dfx)
        label = f'{prefs_label.pop(0)}({severe_cases})'        
        grp = dfx.groupby('date')['severe_cases'].sum() 
        plt.plot_date(grp.index, grp.values, label=label, LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.legend(loc='best')
    plt.title('COVID-19 日別重症者\n(2021)')
    plt.ylabel('重症者')
    plt.tight_layout()
    
    plt.show()
    
    # %%
    
    # 6) Draw New Deaths (Tokyo, Osaka, Saitama)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    plt.style.use('fivethirtyeight')    # plt.style.available
    plt.figure(figsize=(10,6))
    
    # Select Tokyo, Osaka, Saitama
    df = raw
    prefs = ['Tokyo','Osaka','Saitama']
    prefs_label = ['東京','大阪','埼玉']
    
    def get_new_deaths(dft):
        last_date = dft.date.max()
        filter_by = (df['date'] == last_date)
        dft = dft[filter_by]
        new_deaths = dft['new_deaths'].values[0]     
        return int(new_deaths)
    
    for pref in prefs:
        filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-07-22') 
        dfx = df[filter_by]     
        new_deaths = get_new_deaths(dfx)
        label = f'{prefs_label.pop(0)}({new_deaths})'     
        grp = dfx.groupby('date')['new_deaths'].sum() 
        plt.plot_date(grp.index, grp.values, label=label, LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.legend(loc='best')
    plt.title('COVID-19 日別死亡者\n(2021)')
    plt.ylabel('死亡者')
    plt.tight_layout()
    
    plt.show()
    
    # %%
    
    # 6) Draw new_cases, severe_cases, new_deaths (Tokyo)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    plt.style.use('fivethirtyeight')    # plt.style.available
    plt.figure(figsize=(10,6))
    
    # Select Tokyo
    df = raw
    pref = 'Tokyo'
    cases = ['new_cases','severe_cases','new_deaths']
    cases_label = ['感染者','重症者','死亡者']
    
    for case in cases:    
        filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-07-22') 
        dfx = df[filter_by]     
        grp = dfx.groupby('date')[case].sum() 
        plt.plot_date(grp.index, grp.values, label=cases_label.pop(0), LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.legend(loc='best')
    plt.title('COVID-19 東京(日別)\n(2021)')
    plt.ylabel('人数')
    plt.tight_layout()
    
    plt.show()
    
    # %%
    
    # 7) Draw new_cases, severe_cases, new_deaths (Tokyo) : add yscale(log)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    plt.style.use('fivethirtyeight')    # plt.style.available
    plt.figure(figsize=(10,6))
    
    # Select Tokyo
    df = raw
    pref = 'Tokyo'
    cases = ['new_cases','severe_cases','new_deaths']
    cases_label = ['感染者','重症者','死亡者']
    
    for case in cases:    
        filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-07-22') 
        dfx = df[filter_by]     
        grp = dfx.groupby('date')[case].sum() 
        plt.plot_date(grp.index, grp.values, label=cases_label.pop(0), LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.yscale('log')
    
    plt.xticks(rotation=45)
    plt.legend(loc='best')
    plt.title('COVID-19 東京(日別)\n(2021)')
    plt.ylabel('人数 : yscale(log)')
    plt.tight_layout()
    
    plt.show()
    
    # %%
    

GAFAの株価の推移をMatplotlibのplot_date()で視覚化する

  1. GAFAMの株価をダウンロードしてCSVファイルに保存する

    # Article017_Matplotlib Date Chart Part3 Stock.py
    # %%
    # Import the necessary libraries  
    import pandas as pd
    from pandas.core.frame import DataFrame
    import pandas_datareader.data as web    # pip install pandas_datareader
    import matplotlib.pyplot as plt
    import matplotlib.dates as mpl_dates
    import matplotlib.style as style
    import datetime as dt
    from datetime import timedelta
    import numpy as np
    import warnings
    warnings.simplefilter('ignore')
    
    # %%
    
    # 0-1) Load Data from Yahoo Finace
    start = dt.datetime(2010, 1, 1)
    end = dt.datetime.now()
    df = web.DataReader(['GOOGL','AMZN','FB','AAPL'], 'yahoo', start=start, end=end)
    #print(df.info())
    #print(df.head(3))                       #print(df.tail(3))
    csv_file = 'data/csv/article017/stock_before_stack.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    
    df = df.stack().reset_index()           # Remove Symbols and reset date index 
    #print(df.info())
    #print(df.head(3))                      #print(df.tail(3))
    csv_file = 'data/csv/article017/stock.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    click image to zoom!
    図9

  2. Amazonの株価推移を可視化する

    # Load stock data from the csv file
    csv_file = 'data/csv/article017/stock.csv'
    df = pd.read_csv(csv_file)
    #print(df.info())       
    df['Date'] = pd.to_datetime(df['Date']) # Convert str to datetime
    #print(df.info())  
    # Date	Symbols	Adj Close	Close	High	Low	Open	Volume
    #print(df.head(5))
    
    # %%
    
    # 1) Draw a date chart for Amazon 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    # Select Symbols = 'AMZN' & date >= 2021-08-01
    filter_by = (df['Symbols'] == 'AMZN') & (df['Date'] >= '2021-08-01')
    dfx = df[filter_by]
    
    plt.plot_date(dfx.Date, dfx.Close, label='Amazon', LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'Amazon Stock Prices (株価)\n(2021)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    click image to zoom!
    図10 2021/08/01~

  3. GAFAの株価推移を可視化する

    # 2) Draw Amazon, Google, Facebook, Apple  
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    symbols = ['GOOGL','AMZN','FB','AAPL']
    
    for symbol in symbols:    
        # Select Symbols = 'GAFA' & date >= 2021-01-01
        filter_by = (df['Symbols'] == symbol) & (df['Date'] >= '2021-01-01')
        dfx = df[filter_by]
        plt.plot_date(dfx.Date, dfx.Close, label=symbol, LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'GAFA Stock Prices (株価)\n(2021)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # 3) Draw Amazon, Google, Facebook, Apple  
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    symbols = ['GOOGL','AMZN','FB','AAPL']
    
    for symbol in symbols:    
        # Select Symbols = 'AMZN' & date >= 2019-01-01
        filter_by = (df['Symbols'] == symbol) & (df['Date'] >= '2019-01-01')
        dfx = df[filter_by]
        plt.plot_date(dfx.Date, dfx.Close, label=symbol, LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'GAFA Stock Prices (株価)\n(2019-2021)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # 3) Draw Amazon, Google, Facebook, Apple  
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    symbols = ['GOOGL','AMZN','FB','AAPL']
    
    for symbol in symbols:    
        # Select Symbols = 'AMZN' & date >= 2017-01-01
        filter_by = (df['Symbols'] == symbol) & (df['Date'] >= '2017-01-01')
        dfx = df[filter_by]
        plt.plot_date(dfx.Date, dfx.Close, label=symbol, LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'GAFA Stock Prices (株価)\n(2017-2021)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # 3) Draw Amazon, Google, Facebook, Apple  (yscale)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    symbols = ['GOOGL','AMZN','FB','AAPL']
    
    for symbol in symbols:    
        # Select Symbols = 'AMZN' & date >= 2017-01-01
        filter_by = (df['Symbols'] == symbol) & (df['Date'] >= '2017-01-01')
        dfx = df[filter_by]
        plt.plot_date(dfx.Date, dfx.Close, label=symbol, LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.yscale('log')
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD) : yscale(log)')
    plt.title(f'GAFA Stock Prices (株価)\n(2017-2021)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    click image to zoom!
    図11-1 2021/01/01~

    click image to zoom!
    図11-2 2019/01/01~

    click image to zoom!
    図11-3 2017/01/01~

    click image to zoom!
    図11-4 yscale(log)

  4. ここで解説したコードをまとめて掲載

    最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
    
    # Article017_Matplotlib Date Chart Part3 Stock.py
    # %%
    # Import the necessary libraries  
    import pandas as pd
    from pandas.core.frame import DataFrame
    import pandas_datareader.data as web    # pip install pandas_datareader
    import matplotlib.pyplot as plt
    import matplotlib.dates as mpl_dates
    import matplotlib.style as style
    import datetime as dt
    from datetime import timedelta
    import numpy as np
    import warnings
    warnings.simplefilter('ignore')
    
    # %%
    
    # 0-1) Load Data from Yahoo Finace
    start = dt.datetime(2010, 1, 1)
    end = dt.datetime.now()
    df = web.DataReader(['GOOGL','AMZN','FB','AAPL'], 'yahoo', start=start, end=end)
    #print(df.info())
    #print(df.head(3))                       #print(df.tail(3))
    csv_file = 'data/csv/article017/stock_before_stack.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    
    df = df.stack().reset_index()           # Remove Symbols and reset date index 
    #print(df.info())
    #print(df.head(3))                      #print(df.tail(3))
    csv_file = 'data/csv/article017/stock.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    
    # %%
    
    # 0-2)Load stock data from the csv file
    csv_file = 'data/csv/article017/stock.csv'
    df = pd.read_csv(csv_file)
    #print(df.info())       
    df['Date'] = pd.to_datetime(df['Date']) # Convert str to datetime
    #print(df.info())  
    # Date	Symbols	Adj Close	Close	High	Low	Open	Volume
    #print(df.head(5))
    
    # %%
    
    # 1) Draw a date chart for Amazon 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    # Select Symbols = 'AMZN' & date >= 2021-08-01
    filter_by = (df['Symbols'] == 'AMZN') & (df['Date'] >= '2021-08-01')
    dfx = df[filter_by]
    
    plt.plot_date(dfx.Date, dfx.Close, label='Amazon', LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'Amazon Stock Prices (株価)\n(2021)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # 2) Draw Amazon, Google, Facebook, Apple  
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    symbols = ['GOOGL','AMZN','FB','AAPL']
    
    for symbol in symbols:    
        # Select Symbols = 'GAFA' & date >= 2021-01-01
        filter_by = (df['Symbols'] == symbol) & (df['Date'] >= '2021-01-01')
        dfx = df[filter_by]
        plt.plot_date(dfx.Date, dfx.Close, label=symbol, LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'GAFA Stock Prices (株価)\n(2021)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # 3) Draw Amazon, Google, Facebook, Apple  
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    symbols = ['GOOGL','AMZN','FB','AAPL']
    
    for symbol in symbols:    
        # Select Symbols = 'AMZN' & date >= 2019-01-01
        filter_by = (df['Symbols'] == symbol) & (df['Date'] >= '2019-01-01')
        dfx = df[filter_by]
        plt.plot_date(dfx.Date, dfx.Close, label=symbol, LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'GAFA Stock Prices (株価)\n(2019-2021)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # 3) Draw Amazon, Google, Facebook, Apple  
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    symbols = ['GOOGL','AMZN','FB','AAPL']
    
    for symbol in symbols:    
        # Select Symbols = 'AMZN' & date >= 2017-01-01
        filter_by = (df['Symbols'] == symbol) & (df['Date'] >= '2017-01-01')
        dfx = df[filter_by]
        plt.plot_date(dfx.Date, dfx.Close, label=symbol, LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'GAFA Stock Prices (株価)\n(2017-2021)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # 3) Draw Amazon, Google, Facebook, Apple  (yscale)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    symbols = ['GOOGL','AMZN','FB','AAPL']
    
    for symbol in symbols:    
        # Select Symbols = 'AMZN' & date >= 2017-01-01
        filter_by = (df['Symbols'] == symbol) & (df['Date'] >= '2017-01-01')
        dfx = df[filter_by]
        plt.plot_date(dfx.Date, dfx.Close, label=symbol, LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.yscale('log')
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD) : yscale(log)')
    plt.title(f'GAFA Stock Prices (株価)\n(2017-2021)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    

仮想通貨(暗号通貨)の価格の推移をMatplotlibのplot_date()で視覚化する

  1. 仮想通貨(暗号通貨)の価格データをダウンロードしてCSVファイルに保存する

    # Article017_Matplotlib Date Chart Part4 Crypto.py
    # %%
    # Import the necessary libraries  
    import pandas as pd
    from pandas.core.frame import DataFrame
    import pandas_datareader.data as web    # pip install pandas_datareader
    import matplotlib.pyplot as plt
    import matplotlib.dates as mpl_dates
    import matplotlib.style as style
    import datetime as dt
    from datetime import timedelta
    import numpy as np
    import warnings
    warnings.simplefilter('ignore')
    
    # %%
    
    # 0-1) Load Data from Yahoo Finace
    start = dt.datetime(2010, 1, 1)
    end = dt.datetime.now()
    crypto = ['BTC-JPY', 'ETC-JPY', 'LTC-JPY', 'XRP-JPY', 'SC-JPY']
    df = web.DataReader(crypto, 'yahoo', start=start, end=end)
    #print(df.info())
    #print(df.head(3))                       #print(df.tail(3))
    csv_file = 'data/csv/article017/crypto_before_stack.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    
    df = df.stack().reset_index()           # Remove Symbols and reset date index 
    #print(df.info())
    #print(df.head(3))                      #print(df.tail(3))
    csv_file = 'data/csv/article017/crypto.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    click image to zoom!
    図12

  2. ビットコイン(Bitcoin)の価格推移を可視化する

    # Load stock data from the csv file
    csv_file = 'data/csv/article017/crypto.csv'
    df = pd.read_csv(csv_file)
    #print(df.info())       
    df['Date'] = pd.to_datetime(df['Date']) # Convert str to datetime
    #print(df.info())  
    # Date	Symbols	Adj Close	Close	High	Low	Open	Volume
    #print(df.head(5))
    
    # %%
    
    # 1) Draw a date chart for BTC-JPY 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    # Select Symbols = 'BTC-JPY' & date >= 2020-09-01
    filter_by = (df['Symbols'] == 'BTC-JPY') & (df['Date'] >= '2020-09-01')
    dfx = df[filter_by]
    
    plt.plot_date(dfx.Date, dfx.Close, label='Bitcoin', LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    #date_format = mpl_dates.DateFormatter('%m/%d')
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (円)')
    plt.title(f'Bitcoin Prices (仮想通貨(暗号通貨)価格)\n(2020-2021)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    click image to zoom!
    図13 2020/09/01~

  3. 仮想通貨(暗号通貨)(BTC,ETC,LTC,XRP)の価格推移を可視化する

    # 2) Draw 'BTC-JPY', 'ETC-JPY', 'LTC-JPY', 'XRP-JPY'
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    symbols = ['BTC-JPY', 'ETC-JPY', 'LTC-JPY', 'XRP-JPY']
    
    for symbol in symbols:    
        # Select Symbols = '???' & date >= 2020-09-01
        filter_by = (df['Symbols'] == symbol) & (df['Date'] >= '2020-09-01')
        dfx = df[filter_by]
        plt.plot_date(dfx.Date, dfx.Close, label=symbol, LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    #date_format = mpl_dates.DateFormatter('%m/%d')
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.yscale('log')
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (円): yscale(log)')
    plt.title(f'Cryptocurrency Prices (仮想通貨(暗号通貨)価格)\n(2020-2021)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    click image to zoom!
    図14 2020/09/01~

  4. ここで解説したコードをまとめて掲載

    最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
    
    # Article017_Matplotlib Date Chart Part4 Crypto.py
    # %%
    # Import the necessary libraries  
    import pandas as pd
    from pandas.core.frame import DataFrame
    import pandas_datareader.data as web    # pip install pandas_datareader
    import matplotlib.pyplot as plt
    import matplotlib.dates as mpl_dates
    import matplotlib.style as style
    import datetime as dt
    from datetime import timedelta
    import numpy as np
    import warnings
    warnings.simplefilter('ignore')
    
    # %%
    
    # 0-1) Load Data from Yahoo Finace
    start = dt.datetime(2010, 1, 1)
    end = dt.datetime.now()
    crypto = ['BTC-JPY', 'ETC-JPY', 'LTC-JPY', 'XRP-JPY', 'SC-JPY']
    df = web.DataReader(crypto, 'yahoo', start=start, end=end)
    #print(df.info())
    #print(df.head(3))                       #print(df.tail(3))
    csv_file = 'data/csv/article017/crypto_before_stack.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    
    df = df.stack().reset_index()           # Remove Symbols and reset date index 
    #print(df.info())
    #print(df.head(3))                      #print(df.tail(3))
    csv_file = 'data/csv/article017/crypto.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    
    # %%
    
    # 0-2) Load stock data from the csv file
    csv_file = 'data/csv/article017/crypto.csv'
    df = pd.read_csv(csv_file)
    #print(df.info())       
    df['Date'] = pd.to_datetime(df['Date']) # Convert str to datetime
    #print(df.info())  
    # Date	Symbols	Adj Close	Close	High	Low	Open	Volume
    #print(df.head(5))
    
    # %%
    
    # 1) Draw a date chart for BTC-JPY 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    # Select Symbols = 'BTC-JPY' & date >= 2020-09-01
    filter_by = (df['Symbols'] == 'BTC-JPY') & (df['Date'] >= '2020-09-01')
    dfx = df[filter_by]
    
    plt.plot_date(dfx.Date, dfx.Close, label='Bitcoin', LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    #date_format = mpl_dates.DateFormatter('%m/%d')
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (円)')
    plt.title(f'Bitcoin Prices (仮想通貨(暗号通貨)価格)\n(2020-2021)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # 2) Draw 'BTC-JPY', 'ETC-JPY', 'LTC-JPY', 'XRP-JPY'
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    symbols = ['BTC-JPY', 'ETC-JPY', 'LTC-JPY', 'XRP-JPY']
    
    for symbol in symbols:    
        # Select Symbols = '???' & date >= 2020-09-01
        filter_by = (df['Symbols'] == symbol) & (df['Date'] >= '2020-09-01')
        dfx = df[filter_by]
        plt.plot_date(dfx.Date, dfx.Close, label=symbol, LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    #date_format = mpl_dates.DateFormatter('%m/%d')
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.yscale('log')
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (円): yscale(log)')
    plt.title(f'Cryptocurrency Prices (仮想通貨(暗号通貨)価格)\n(2020-2021)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    
    

ビットコインの7年間の価格推移をMatplotlibのplot_date()で視覚化する

  1. ビットコインの7年間の価格データをダウンロードしてCSVファイルに保存する

    米国の 「Yahoo! Finance」 のサイトから仮想通貨(暗号通貨)を選択してビットコインの過去の価格をダウンロードします。 「Bitcoin Historical Prices」画面の「Time Period」から「Sep 17, 2014~Sep 24, 2021」の期間を選択します。 右端の[Apply]ボタンをクリックしてから[Download]ボタンをクリックしてダウンロードします。 ビットコインの価格データがCSVファイルでダウンロードされます。

    click image to zoom!
    図15-1
    図15-1は米国のYahoo! Financeからビットコインの価格データをダウンロードする画面です。
    click image to zoom!
    図15-2
    図15-2はダウンロードした価格データ(CSVファイル)をExcelで開いた画面です。 2014/9/17からの価格データが格納されていることが確認できます。
  2. ビットコインの7年間の期間の価格推移を視覚化する

    # Load stock data from the csv file
    csv_file = 'data/csv/article017/BTC-USD.csv'
    df = pd.read_csv(csv_file)
    #print(df.info())       
    df['Date'] = pd.to_datetime(df['Date']) # Convert str to datetime
    #print(df.info())  
    # Date	Symbols	Adj Close	Close	High	Low	Open	Volume
    #print(df.head(5))
    
    # %%
    
    # 1) Draw a date chart for BTC-USD 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    filter_by = (df['Date'] >= '2014-09-17')
    dfx = df[filter_by]
    
    plt.plot_date(dfx.Date, dfx.Close, label='Bitcoin', LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'Bitcoin Prices\n(2014/09/17~2021/09/24)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # 2) Draw a date chart for BTC-USD 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    filter_by = (df['Date'] >= '2018-01-01')
    dfx = df[filter_by]
    
    plt.plot_date(dfx.Date, dfx.Close, label='Bitcoin', LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'Bitcoin Prices\n(2018/01/01~2021/09/24)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # 3) Draw a date chart for BTC-USD 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    filter_by = (df['Date'] >= '2020-01-01')
    dfx = df[filter_by]
    
    plt.plot_date(dfx.Date, dfx.Close, label='Bitcoin', LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'Bitcoin Prices\n(2020/01/01~2021/09/24)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # 4) Draw a date chart for BTC-USD 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    filter_by = (df['Date'] >= '2020-11-01')
    dfx = df[filter_by]
    
    plt.plot_date(dfx.Date, dfx.Close, label='Bitcoin', LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'Bitcoin Prices\n(2020/11/01~2021/09/24)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # 4) Draw a date chart for BTC-USD 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    filter_by = (df['Date'] >= '2021-01-01')
    dfx = df[filter_by]
    
    plt.plot_date(dfx.Date, dfx.Close, label='Bitcoin', LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'Bitcoin Prices\n(2021/01/01~2021-09/24)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    click image to zoom!
    図16-1 2014/09/17~

    click image to zoom!
    図16-2 2018/01/01~

    click image to zoom!
    図16-3 2020/01/01~

    click image to zoom!
    図16-4 2020/11/01~

    click image to zoom!
    図16-5 2021/01/01~

  3. ここで解説したコードをまとめて掲載

    最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
    
    # Article017_Matplotlib Date Chart Part5 BTC-USD.py
    # %%
    # Import the necessary libraries  
    import pandas as pd
    from pandas.core.frame import DataFrame
    import pandas_datareader.data as web    # pip install pandas_datareader
    import matplotlib.pyplot as plt
    import matplotlib.dates as mpl_dates
    import matplotlib.style as style
    import datetime as dt
    from datetime import timedelta
    import numpy as np
    import warnings
    warnings.simplefilter('ignore')
    
    # %%
    
    # 0) Load stock data from the csv file
    csv_file = 'data/csv/article017/BTC-USD.csv'
    df = pd.read_csv(csv_file)
    #print(df.info())       
    df['Date'] = pd.to_datetime(df['Date']) # Convert str to datetime
    #print(df.info())  
    # Date	Symbols	Adj Close	Close	High	Low	Open	Volume
    #print(df.head(5))
    
    # %%
    
    # 1) Draw a date chart for BTC-USD 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    filter_by = (df['Date'] >= '2014-09-17')
    dfx = df[filter_by]
    
    plt.plot_date(dfx.Date, dfx.Close, label='Bitcoin', LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'Bitcoin Prices\n(2014/09/17~2021/09/24)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # 2) Draw a date chart for BTC-USD 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    filter_by = (df['Date'] >= '2018-01-01')
    dfx = df[filter_by]
    
    plt.plot_date(dfx.Date, dfx.Close, label='Bitcoin', LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'Bitcoin Prices\n(2018/01/01~2021/09/24)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # 3) Draw a date chart for BTC-USD 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    filter_by = (df['Date'] >= '2020-01-01')
    dfx = df[filter_by]
    
    plt.plot_date(dfx.Date, dfx.Close, label='Bitcoin', LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'Bitcoin Prices\n(2020/01/01~2021/09/24)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # 4) Draw a date chart for BTC-USD 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    filter_by = (df['Date'] >= '2020-11-01')
    dfx = df[filter_by]
    
    plt.plot_date(dfx.Date, dfx.Close, label='Bitcoin', LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%Y/%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'Bitcoin Prices\n(2020/11/01~2021/09/24)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # 4) Draw a date chart for BTC-USD 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    filter_by = (df['Date'] >= '2021-01-01')
    dfx = df[filter_by]
    
    plt.plot_date(dfx.Date, dfx.Close, label='Bitcoin', LineStyle='solid')
    
    plt.gcf().autofmt_xdate()
    date_format = mpl_dates.DateFormatter('%m/%d')
    plt.gca().xaxis.set_major_formatter(date_format)
    
    plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'Bitcoin Prices\n(2021/01/01~2021-09/24)')
    plt.legend(loc='best')
    plt.tight_layout()
    plt.show()
    
    # %%