Pythonでdata.go.jpからデータを取得する
データカタログサイト 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()
こんな感じで順番にプロットされる。