はじめに
円ドル為替レートの推移を実勢相場とともに購買力平価(消費者物価、企業物価指数、輸出物価基準のもの)を描いてみた。
データは、公益財団法人国際通貨研究所( https://www.iima.or.jp/ )から出されているExcelファイルのデータ( https://www.iima.or.jp/docs/ppp/pppdata.xlsx )にもとづいている。
もともとグラフも提供されているので描画の必要はないが、Excelファイルの読み込みの備忘録。
(2024/6/12追記)
輸出物価が90年基準から、他の物価指数同様に73年基準に変更されていたので、コードを若干修正した。
コード
今回はmatplotlibでグラフを描くので、日本語フォントの準備から。
pip install japanize_matplotlib
以下、コード本体。
# モジュールの読み込み
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import matplotlib.dates as mdates
import japanize_matplotlib
# データの読み込み
url = "https://www.iima.or.jp/docs/ppp/pppdata.xlsx"
sheet_name = "ドル円(USD JPY)"
data = pd.read_excel(url, sheet_name=sheet_name, skiprows=2, dtype=str)
# データの前処理
blocks = [data.iloc[:, i:i+7] for i in range(0, data.shape[1], 7)]
blocks = [block.iloc[:, :-1] for block in blocks[:-1]] + [blocks[-1]]
combined_df = pd.DataFrame()
for block in blocks:
block = block.copy()
block.columns = ['Year', 'Month', 'Monthly Average' , 'CPI', 'CGPI', 'EPI']
block = block.iloc[1:, :]
block['Year'] = block['Year'].fillna(method='ffill')
block.dropna(subset=['Monthly Average', 'CPI', 'CGPI', 'EPI'], how='all', inplace=True)
block['Date'] = pd.to_datetime(block['Year'].astype(str) + '/' + block['Month'].astype(str), format='%Y/%m')
block.drop(['Year', 'Month'], axis=1, inplace=True)
block.set_index('Date', inplace=True)
for col in ['Monthly Average', 'CPI', 'CGPI', 'EPI']:
block[col] = block[col].astype(float)
combined_df = pd.concat([combined_df, block])
# グラフの描画
plt.figure(figsize=(15, 10))
plt.title(
f'円ドル為替レート:実勢相場と購買力平価\n{combined_df.index.min().strftime("%Y/%m")}~{combined_df.index.max().strftime("%Y/%m")}',
fontsize=20
)
plt.xlabel('年', fontsize=15)
plt.ylabel('為替レート(円/ドル)', fontsize=15)
for col, label in zip(
['Monthly Average', 'CPI', 'CGPI', 'EPI'],
['実勢レート', '消費者物価PPP(73年基準)', '企業物価PPP(73年基準)', '輸出物価PPP(73年基準)']
):
plt.plot(combined_df[col], linewidth=2 if col == 'Monthly Average' else 1, label=f'{label}:{combined_df[col].iloc[-1]:.2f}')
plt.gca().xaxis.set_major_locator(ticker.FixedLocator(
mdates.date2num(pd.date_range(start='1980', end='2021', freq='10YS').to_pydatetime())
))
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y'))
plt.legend(fontsize=12)
plt.show()
おわりに
このExcelファイルは、1970年代から10年ごとにデータがブロック化され、再利用がしづらくなっている。私の能力で整理するのはなかな大変だった。