0
3

円ドル為替レート(実勢相場と購買力平価)のグラフ化

Last updated at Posted at 2023-06-14

はじめに

円ドル為替レートの推移を実勢相場とともに購買力平価(消費者物価、企業物価指数、輸出物価基準のもの)を描いてみた。
データは、公益財団法人国際通貨研究所( 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()
  • 出力
    image.png

おわりに

このExcelファイルは、1970年代から10年ごとにデータがブロック化され、再利用がしづらくなっている。私の能力で整理するのはなかな大変だった。

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3