市町村の企業数の産業大分類付きのデータをとってくるスクリプトのサンプルです。
なんちゃって状態での公開
自分にとって便利なようにつくってあるので、他のかたにはわかりにくいところがあるとは思いますので、適宜変更してつかってください。
コードはつなぎ合わせれば動くはずです。jupyter お使いの方ならセルにコピペしてください。最後に、csv で出力されるようになっています。
まず、産業大分類コード 各種コードも、API で取得できます。
産業大分類コード別にしか、データを取得できないので、このリストをつかって、一括して、データを取得します。
# 産業大分類
sicCode_list = {'A': '農業,林業',
'B': '漁業',
'C': '鉱業,採石業,砂利採取業',
'D': '建設業',
'E': '製造業',
'F': '電気・ガス・熱供給・水道業',
'G': '情報通信業',
'H': '運輸業,郵便業',
'I': '卸売業,小売業',
'J': '金融業,保険業',
'K': '不動産業,物品賃貸業',
'L': '学術研究,専門・技術サービス業',
'M': '宿泊業,飲食サービス業',
'N': '生活関連サービス業,娯楽業',
'O': '教育,学習支援業',
'P': '医療,福祉',
'Q': '複合サービス事業',
'R': 'サービス業(他に分類されないもの)',
'S': '公務(他に分類されるものを除く)',
'T': '分類不能の産業'}
なんちゃってクラスです。
コンストラクタで、API-KEY を読み込みます。
連想配列を引数に送り込んで、execute します。
get_cat で、カテゴリデータ(産業大分類)を一括でとってきて、year_df で、データフレームに変換します。
大きなCSVファイルで公開していれば、このような作業は不要なのにと思いつつ、クラスつくりました。
# !/usr/bin/env python
# -*- encoding:utf-8 -*-
# anaconda default package のみ使う予定
import sys,os,re,json,inspect,requests
import datetime as dt
from pprint import pprint as pp
import numpy as np
import pandas as pd
from bs4 import BeautifulSoup
from IPython.display import display, HTML
# class 名の先頭は大文字のはずなんですが、面倒なんで、小文字にしています。
# my_args という連想配列を送り込んで処理します。
# rs という変数でつかいます。
class resas:
# コンストラクタ
def __init__(self):
# ★★★ api-key の読み込み 同じフォルダ内にある前提です。必要に応じて書き換えてください。
self.api_key =open('api-key.txt','r').read().rstrip()
# action で、method を指定しています
self.action_list = ['x',
'get',
'get_cat',
'year_df',
'dummy']
pass
# エラーのときは、None を返します。
def execute(self,my_args={'action':'dummy'}):
self.args = my_args
action = self.args['action']
# test 実行のとき dry = True
self.dry =False
if 'dry' in self.args:
self.dry = self.args['dry']
if action not in self.action_list:
print(action + ' not in list' )
return(None)
# 実行結果をそのまま返します。
return(eval('self.' + action + '()'))
pass
def get(self):
x = json.loads(requests.get('https://opendata.resas-portal.go.jp/' + self.args['url'],
headers={'X-API-KEY':self.api_key}).text)
return(x['message'],x['result'])
def dummy(self):
# under construction
try:
pass
except:
pass
print('dummy......')
return(None)
# 産業分類などのデータをカテゴリーごともってくる
def get_cat(self):
cat_list = eval(self.args['cat'] + '_list')
plist = "&".join([x + '=' + str(self.args['params'][x]) for x in self.args['params']])
base_url = 'https://opendata.resas-portal.go.jp/' + self.args['url'] + '?' + plist
xlist = {}
for one in cat_list:
url = base_url + "&sicCode=" + one
if self.dry :
print(url)
else:
xlist[one] = json.loads(requests.get(url,headers={'X-API-KEY':self.api_key}).text)['result']
return(xlist)
def year_df(self):
cat_list = eval(self.args['cat'] + '_list')
# year 一覧
xlist = []
for cat_id in cat_list:
try:
self.args['data'][cat_id]['data']
for one in self.args['data'][cat_id]['data']:
tmp_xlist = [one['year']]
for item in self.args['items']:
tmp_xlist.append(self.args['data'][cat_id][item])
tmp_xlist.append(one['value'])
xlist.append(tmp_xlist)
except:
pass
xdf = pd.DataFrame(xlist,columns = ['year'] + self.args['items'] + ['value'])
return(xdf)
# 年ベースの csv にする
# 対象 + カテゴリ
# 初期化までこのセル内で行います。
rs = resas()
神奈川県、平塚のデータを年をキーにした辞書形式で、取得します。都道府県コード prefCode を指定しないとデータをひっぱってこないようです。下位コードが指定してあるならば、上位のコードの指定は不要だと思うのですが、どうなんでしょうか?
次のコードは、産業大分類のデータを一括でとってきて、xlist に格納します。
year の指定はできないので、年は、リストで戻ってきます。
年指定が必要だったり、そうでなかったりするようです。
dry を True に指定すると、アクセスはせずに、URLを表示します。
神奈川県、平塚のパラメータは、params で指定します。
# 全産業花火図 企業数、GET api/v1-rc.1/municipality/company/perYear
my_args = {'action':'get_cat',
'cat':'sicCode',
'params':{'prefCode':14,'cityCode':14203},
'dry':False,
'url':'api/v1-rc.1/municipality/company/perYear'}
xlist = rs.execute(my_args)
辞書では、使いづらいので、dataframe に変換し、csv 形式で、temp.csv に保存します。
my_args = {'action':'year_df',
'data':xlist,
'cat':'sicCode',
'items':['prefName','cityName','sicCode','sicName']}
xdf = rs.execute(my_args)
xdf.to_csv('test.csv',index=False)