quandlでインフレ率を取得してみる

## はじめに
株式投資を始めたことがきっかけで世界的な経済や金融に興味をもつようになりました。
機械学習で使用するデータが欲しいいうこともあり元々持ち合わせていたスキルを活かし
しばらくはスクレイピングで情報収集をしていましたが
サイト毎で異なるフォーマットなどに嫌気がさし別の方法を探ってみることにしました。
検索サイトで調べたところ[Quandl](https://www.quandl.com/)というサイトを使用している方が何名かいらっしゃったため
少し試してみることになりました。

今回は試しにPythonを使用して[Quandl](https://www.quandl.com/)のWebAPIから
各国のインフレ率を取得し表示するということをしてみたいと思います。

※[Quandl](https://www.quandl.com/)は経済や金融のデータや指標データを提供しているサイトでWebAPIを提供しておりWebAPIからデータを取得することもできます。

## 実行環境
 - Windows バージョン20H2
 - Python 3.9.4
 - jupyterlab 3.0.16
 - Quandl 3.6.1
 - matplotlib 3.4.2
 - pandas 1.2.5
 
## コードと説明
1. ライブラリのインポート

```Python:get_inflation.ipynb
import quandl
import pandas as pd
import matplotlib.pyplot as plt
```
取得したデータをグラフにして保存するためpandasとmatplotlibをインポートしています。

1. コンフィグ

```Python:get_inflation.ipynb
apikey = 'XXXXXXXXXXXXXXXX'
datatype = {'USA':'RATEINF/INFLATION_USA',
           'UK':'RATEINF/INFLATION_GBR',
           'Switzerland':'RATEINF/INFLATION_CHE',
           'Italy':'RATEINF/INFLATION_ITA',
           'France':'RATEINF/INFLATION_FRA',
           'EuroArea':'RATEINF/INFLATION_EUR',
           'Germany':'RATEINF/INFLATION_DEU',
           'NewZealand':'RATEINF/INFLATION_NZL',
           'Japan':'RATEINF/INFLATION_JPN',
           'Canada':'RATEINF/INFLATION_CAN',
           'Australia':'RATEINF/INFLATION_AUS',
           'Russia':'RATEINF/INFLATION_RUS',
           'Argentina':'RATEINF/INFLATION_ARG'}
savecsv = False
savegraph = False
```

プログラムのふるまいを定義します。XXXXXには[Quandl](https://www.quandl.com/)でアカウント登録した際に
発行されるAPIkeyを入れてください。datatypeでは[Quandl](https://www.quandl.com/)の[API説明ページ](https://www.quandl.com/data/RATEINF-Inflation-Rates)を参考に
国とシンボルを辞書型で定義しています。savecsvは取得したデータをCSVで保存したい場合はTrueに
savegraphは表示されるグラフを保存したい場合はTrueにしてください。

1. データ取得

```Python:get_inflation.ipynb
# データ取得関数
def getdata(dtype):
    data = quandl.get(dtype, start_date = '2002-03-01', column_index = '1')
    return data

# APIキーのセット
quandl.ApiConfig.api_key = apikey

# データ取得
fflg = 0
for dk in datatype.keys():
    if fflg == 0:
        tempdata = getdata(datatype[dk])
        tempdata.rename(columns = {'Value':dk}, inplace = True)
        data = tempdata
        fflg = 1
    else:
        tempdata = getdata(datatype[dk])
        tempdata.rename(columns = {'Value':dk}, inplace = True)
        data = data.join(tempdata)

# NaN埋め
data = data.fillna(method = 'ffill')
```

APIキーのセットではコンフィグで定義したAPIkeyをquandlにセットしています。
データ取得内のforでコンフィグで定義したdatatypeを引数にgetdata関数を呼び出しデータを取得しています。
実際にデータを取得している行はgetdata関数のquandl.get(～)の部分ですが
2002年3月以前のデータが無い国もあるためデータを揃えるためにこの日付以降を取得するよう指定してます。
また国によってデータの間隔が異なる場合があるため最終行ではfillnaを使用してNaNの穴埋めをしています。

1. 結果出力

```Python:get_inflation.ipynb
# CSV出力
if savecsv == True:
    data.to_csv('infration.csv')

# グラフ出力
data.plot(figsize = (15, 15), subplots = True, layout = (7,2), grid = True, sharex = False)
if savegraph == True:
    plt.savefig('infration.png')
plt.show()
```

最後に設定したコンフィグに従い結果を出力します。

## 出力されるグラフ例
![infration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610469/0405aa86-2308-d1fc-0f00-8538e221c3a8.png)

## さいごに
いかがでしたでしょうか、データの整形や出力の処理をしているため
コードは長くなってしまっていますが最低限必要な部分は

- import quandl
- quandl.ApiConfig.api_key
- quandl.get(～)

でありとてもシンプルであることがわかるかと思います。
WebAPIを使用することでとてもシンプルにデータを取得できているということが言えると思います。
[Quandl](https://www.quandl.com/)では有償のデータもありますが他にも様々なデータをシンプルに取得することができます。
スクレイピングでヒィヒィ言いながらコーディングすることを考えれば
WebAPIを提供してくださっていることに感謝しかありません。

また何か気になることがあれば投稿します。それではまた。