ここでは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]をクリックします。
画像の任意の場所をクリックして閉じることもできます。
-
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()
# %%
図1は実行結果です。線グラフが表示されています。
見た目はmatplotlibのplot()メソッドで作成した線グラフと類似しています。
-
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()
# %%
図2は実行結果です。図に2本の線が表示されています。
さらに図のタイトル、凡例、Y軸のラベルも表示されています。
そしてX軸の日付が「mm/dd」の形式で斜めに表示されています。
-
ここで解説したコードをまとめて掲載
最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
# 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()
# %%
-
東京の日別感染者の推移を可視化する
# 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()
# %%
-
東京、大阪、埼玉の日別感染者を可視化する
# 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()
-
その他都道府県の日別感染者を視覚化する
# 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()
-
日別重症者の推移を視覚する
# 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()
-
日別死亡者の推移を可視化する
# 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()
-
東京の感染者,重症者,死亡者の推移を可視化する
# 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()
-
ここで解説したコードをまとめて掲載
最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
ここで掲載しているのは「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()
# %%
-
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)
-
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()
-
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()
-
ここで解説したコードをまとめて掲載
最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
# 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()
# %%
-
仮想通貨(暗号通貨)の価格データをダウンロードして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)
-
ビットコイン(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()
-
仮想通貨(暗号通貨)(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()
-
ここで解説したコードをまとめて掲載
最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
# 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年間の価格データをダウンロードしてCSVファイルに保存する
米国の
「Yahoo! Finance」
のサイトから仮想通貨(暗号通貨)を選択してビットコインの過去の価格をダウンロードします。
「Bitcoin Historical Prices」画面の「Time Period」から「Sep 17, 2014~Sep 24, 2021」の期間を選択します。
右端の[Apply]ボタンをクリックしてから[Download]ボタンをクリックしてダウンロードします。
ビットコインの価格データがCSVファイルでダウンロードされます。
図15-1は米国のYahoo! Financeからビットコインの価格データをダウンロードする画面です。
図15-2はダウンロードした価格データ(CSVファイル)をExcelで開いた画面です。
2014/9/17からの価格データが格納されていることが確認できます。
-
ビットコインの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()
-
ここで解説したコードをまとめて掲載
最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
# 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()
# %%