読者です 読者をやめる 読者になる 読者になる

StatsFragments

Python, R, Rust, 統計, 機械学習とか

Pythonでdata.go.jpからデータを取得する

Python pandas 前処理

データカタログサイト data.go.jp が本稼働したので、そこからデータを pandasのデータフレームとして取得するモジュールを書いた。

data.go.jp に限らず data.go...系は CKAN で構築されていることが多いのだが、PyPI 上には使いやすそうなクライアントが現状見当たらない。

インストール

pip install pyopendata

ドキュメント

http://pyopendata.readthedocs.org/en/latest/

データの取得

サンプルとして 鉱工業指数の原指数を業種別/月次 で取ってくる。data.go.jp上のURLのうち、"meti_20140901_0895"がパッケージのID, "aad25837-7e83-4881-9372-1839ecb9b5eb"がリソースのIDになる。リソースのIDがわかればファイルが一意に特定される (ハズ)。

上記リンク先でデータがプレビュー/ダウンロードできるが、"生産", "出荷", "在庫", "在庫率" 4シートからなるExcelになっている。また、ヘッダは3行目から始まっているので冒頭2行は読み飛ばす必要がある。

※対象のファイルは pandasの read_excel, read_csvでパースできるものでないとだめ。

# おまじない
from __future__ import unicode_literals
import pyopendata as pyod
import pandas as pd
pd.options.display.mpl_style = 'default'
import matplotlib.pyplot as plt
plt.ioff()

# DataStoreの初期化
store = pyod.CKANStore('http://www.data.go.jp/data')
# 取得するリソースIDを指定
resource = store.get('aad25837-7e83-4881-9372-1839ecb9b5eb')

# シート名: 不要カラムの辞書
sheets = {'生産': '付加生産ウエイト',
          '出荷': '出荷ウエイト',
          '在庫': '在庫ウエイト'}
for sheet in sheets:
    # sheet名を指定して開く。最初の二行は読み飛ばす
    df = resource.read(sheetname=sheet, skiprows=[0, 1])
    # 不要なカラムを削除
    df = df.drop(['品目番号', sheets[sheet]], axis=1)
    # index設定
    df = df.set_index('品目名称')
    # 転置して、時間が行として並ぶようにする
    df = df.T
    # 数値に変換できるものを変換
    df = df.convert_objects(convert_numeric=True)

    # 適当な列をフィルタ
    df = df[['製造工業', '電気機械工業', '機械工具', '乗用車']]

    # プロット
    ax = df.plot()
    ax.set_title(sheet)
    plt.show()

こんな感じで順番にプロットされる。

f:id:sinhrks:20141006221706p:plain