山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

Pythonクローリング&スクレイピング[増補改訂版] ―データ収集・解析のための実践開発ガイドー その12

第5章 クローリング・スクレイピングの実践とデータの活用

今回は時系列データを扱います。

時系列データ

為替

為替レートのデータをダウンロードします。

日本銀行時系列統計データ検索サイト

国債金利

国債金利情報 : 財務省

有効求人倍率

一般職業紹介状況(職業安定業務統計) 一般職業紹介状況 7月分 | ファイル | 統計データを探す | 政府統計の総合窓口

データをプロット

matplotlib を使って時系列データをプロットします。名前の通り MATLAB のような使い方ができるようです。

日本語に対応するためにフォントをインストールします。

sudo apt install -y fonts-migmix

matplotlib でエラーが出たので次のサイトを参考にしました。

matplotlib にフォントが無いと怒られる場合の対処 - Qiita

from datetime import datetime

import pandas as pd
import matplotlib

matplotlib.use('Agg')  # デスクトップ環境が不要 (Anti-Grain Geometry engine)
matplotlib.rcParams['font.family'] = 'MigMix 1P'

import matplotlib.pyplot as plt

def main():
    # 為替データの読み込み
    df_exchange = pd.read_csv(
        'csv/exchange.csv', encoding='cp932', header=1, names=['date', 'USD', 'rate'], index_col=0, parse_dates=True,
    )
    # 金利データの読み込み
    df_jgbcm = pd.read_csv(
        'csv/jgbcm_all.csv', encoding='cp932', header=1, index_col=0, parse_dates=True, date_parser=parse_japanese_data, na_values=['-'],
    )
    # 有効求人倍率の読み込み
    df_jobs = pd.read_excel(
        'xls/第3表.xls', skiprows=3, skipfooter=3, usecols='W,Y:AJ', index_col=0
    )
    df_jobs.columns = [c.split('.')[0] for c in df_jobs.columns]
    s_jobs = df_jobs.stack()
    s_jobs.index = [parse_year_and_month(y, m) for y, m in s_jobs.index]

    min_date = datetime(1973, 1, 1)
    max_date = datetime.now()

    # 為替データをプロット
    plt.subplot(3, 1, 1)
    plt.plot(df_exchange.index, df_exchange.USD, label='ドル・円')
    plt.xlim(min_date, max_date)
    plt.ylim(50, 250)
    plt.legend(loc='best')

    # 国債金利データをプロット
    plt.subplot(3, 1, 2)
    plt.plot(df_jgbcm.index, df_jgbcm['1年'], label='1年国債金利')
    plt.plot(df_jgbcm.index, df_jgbcm['5年'], label='5年国債金利')
    plt.plot(df_jgbcm.index, df_jgbcm['10年'], label='10年国債金利')
    plt.xlim(min_date, max_date)
    plt.legend(loc='best')
    
    # 有効求人倍率データをプロット
    plt.subplot(3, 1, 3)
    plt.plot(s_jobs.index, s_jobs, label='有効求人倍率(季節調整値)')
    plt.xlim(min_date, max_date)
    plt.ylim(0.0, 2.0)
    plt.axhline(y=1, color='gray')
    plt.legend(loc='best')

    plt.savefig('img/histrorical_data.png', dpi=300)
    

def parse_japanese_data(s:str) -> datetime:
    """
    和歴をdatetimeオブジェクトに変換
    """
    base_years = {'S': 1925, 'H': 1988, 'R': 2018}
    era = s[0]
    year, month, day = s[1:].split('.')
    year = base_years[era] + int(year)
    return datetime(year, int(month), int(day))


def parse_year_and_month(year: str, month: str) -> datetime:
    """
    年月の組をdatatimeオブジェクトに変換
    """
    year = int(year[:-1])
    month = int(month[:-1])
    year += (1900 if year >= 63 else 2000)
    return datetime(year, month, 1)


if __name__ == '__main__':
    main()

f:id:yamakasa3:20190906232127p:plain

ドル円は、大体100円付近をウロチョロしていることが分かりますね。日本はデフレが続いているので国債金利も下がっていることが分かります。有効求人倍率は改善傾向にあることが分かります。まあ、人手不足ということですね。

感想

今回はクローリングではなく、matplotlib の使い方を学びました。