Les [spécifications API] d'e-Stat (http://www.e-stat.go.jp/api/api-spec/) ont été mises à jour.
J'ai fait un script correspondant à la ver.2 en me référant au post de mon prédécesseur (Python 2.7).
Utilisons l'API de la fenêtre générale pour les statistiques gouvernementales (e-Stat)
Le script avant l'édition inclut l'ID d'API dans l'argument, mais il est difficile de le saisir à chaque fois, je l'ai donc écrit dans le code.
De plus, Code des statistiques gouvernementales est entré dans stats_code.
getStatsListSample2015.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib
import urllib2
from lxml import etree
import sys
import codecs
def main(argvs, argc):
if argc != 3:
print ("Usage #python %s api_key search_kind stats_code" % argvs[0])
return 1
api_key = '' #Entrez l'ID API obtenu
search_kind = argvs[1]
stats_code = argvs[2]
stats_code = urllib.quote(stats_code.encode('utf-8'))
url = ('http://api.e-stat.go.jp/rest/2.0/app/getStatsList?appId=%s&lang=J&statsCode=%s&searchKind=%s' % (api_key, stats_code, search_kind))
req = urllib2.Request(url)
opener = urllib2.build_opener()
conn = opener.open(req)
cont = conn.read()
parser = etree.XMLParser(recover=True)
root = etree.fromstring(cont, parser)
result = root.find('RESULT')
data_list = root.find('DATALIST_INF')
table_infs = data_list.xpath('./TABLE_INF')
for table_inf in table_infs:
print ((u'--------------').encode('utf-8'))
for iterator in table_inf.getiterator():
if iterator.text is not None:
itag = iterator.tag.encode('utf-8')
itext = iterator.text.encode('utf-8')
if iterator.items() is not None:
if iterator.get('id') is not None:
print itag,iterator.get('id').encode('utf-8'),itext
elif iterator.get('code') is not None:
print itag,iterator.get('code').encode('utf-8'),itext
elif iterator.get('no') is not None:
print itag,iterator.get('no').encode('utf-8'),itext
else:
print itag,itext
if __name__ == '__main__':
argvs = sys.argv
argc = len(argvs)
sys.exit(main(argvs, argc))
Exemple d'utilisation:
python getStatsListSample2015.py 1 00200521 > gSLS00200521.dat
résultat:
gSLS00200521.dat
--------------
TABLE_INF 0000030001
STAT_NOM 00200521 Recensement
GOV_ORG 00200 Ministère des affaires intérieures et des communications
STATISTICS_NOM Recensement national de 1980 1ère édition nationale totale de base
TITRE 00101 Sexe (sexe) (3), âge de 5 ans (23), population dans tout le pays / ville / comté / préfecture (47), superficie totale / zone de concentration de la population
CYCLE -
SURVEY_DATE 198010
OPEN_DATE 2007-10-05
SMALL_AREA 0
MAIN_CATÉGORIE 02 Population / ménage
SUB_CATÉGORIE 01 Population
OVERALL_TOTAL_NUMBER 3651
UPDATED_DATE 2008-03-19
--------------
TABLE_INF 0000030002
STAT_NOM 00200521 Recensement
GOV_ORG 00200 Ministère des affaires intérieures et des communications
STATISTICS_NOM Recensement national de 1980 1ère édition nationale totale de base
TITRE 00102 Sexe (genre) (3), groupe d'âge (103), population dans tout le pays / ville / comté / préfecture (47), superficie entière / zone de concentration de la population
CYCLE -
SURVEY_DATE 198010
OPEN_DATE 2007-10-05
SMALL_AREA 0
MAIN_CATÉGORIE 02 Population / ménage
SUB_CATÉGORIE 01 Population
OVERALL_TOTAL_NUMBER 16365
UPDATED_DATE 2008-03-19
--------------
・
・
・
export_csv2015.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import urllib2
from lxml import etree
import csv
def export_statical_data(writer, api_key, stats_data_id, class_object, start_position):
"""
Statistiques d'exportation
"""
url = ('http://api.e-stat.go.jp/rest/2.0/app/getStatsData?limit=10000&appId=%s&lang=J&statsDataId=%s&metaGetFlg=N&cntGetFlg=N' % (api_key, stats_data_id))
if start_position > 0:
url = url + ('&startPosition=%d' % start_position)
req = urllib2.Request(url)
opener = urllib2.build_opener()
conn = opener.open(req)
cont = conn.read()
parser = etree.XMLParser(recover=True)
root = etree.fromstring(cont, parser)
row = []
datas = {}
value_tags = root.xpath('//STATISTICAL_DATA/DATA_INF/VALUE')
for value_tag in value_tags:
row = []
for key in class_object:
val = value_tag.get(key)
if val in class_object[key]['objects']:
level = '';
if 'level' in class_object[key]['objects'][val]:
if class_object[key]['objects'][val]['level'].isdigit():
level = ' ' * (int(class_object[key]['objects'][val]['level']) - 1)
text = ("%s%s" % (level , class_object[key]['objects'][val]['name']))
row.append(text.encode('utf-8'))
else:
row.append(val.encode('utf-8'))
row.append(value_tag.text)
writer.writerow(row)
next_tags = root.xpath('//STATISTICAL_DATA/TABLE_INF/NEXT_KEY')
if next_tags:
if next_tags[0].text:
export_statical_data(writer, api_key, stats_data_id, class_object, int(next_tags[0].text))
def get_meta_data(api_key, stats_data_id):
"""
Obtenir des méta-informations
"""
url = ('http://api.e-stat.go.jp/rest/2.0/app/getMetaInfo?appId=%s&lang=J&statsDataId=%s' % (api_key, stats_data_id))
req = urllib2.Request(url)
opener = urllib2.build_opener()
conn = opener.open(req)
cont = conn.read()
parser = etree.XMLParser(recover=True)
root = etree.fromstring(cont, parser)
class_object_tags = root.xpath('//METADATA_INF/CLASS_INF/CLASS_OBJ')
class_object = {}
for class_object_tag in class_object_tags:
class_object_id = class_object_tag.get('id')
class_object_name = class_object_tag.get('name')
class_object_item = {
'id' : class_object_id,
'name' : class_object_name,
'objects' : {}
}
class_tags = class_object_tag.xpath('.//CLASS')
for class_tag in class_tags:
class_item = {
'code' : class_tag.get('code'),
'name' : class_tag.get('name'),
'level' : class_tag.get('level'),
'unit' : class_tag.get('unit')
}
class_object_item['objects'][class_item['code']] = class_item
class_object[class_object_id] = class_object_item
return class_object
def export_csv(api_key, stats_data_id, output_path):
"""
Exporter les statistiques spécifiées au format CSV.
"""
writer = csv.writer(open(output_path, 'wb'),quoting=csv.QUOTE_ALL)
class_object = get_meta_data(api_key, stats_data_id)
row = []
for key in class_object:
title = class_object[key]['name']
row.append(title.encode('utf-8'))
row.append('VALUE')
writer.writerow(row)
export_statical_data(writer, api_key, stats_data_id, class_object, 1)
def main(argvs, argc):
if argc != 2:
print ("Usage #python %s api_key stats_data_id output_path" % argvs[0])
return 1
api_key = '' #Entrez l'ID API obtenu
stats_data_id = argvs[1]
output_path = 'e-stat' + argvs[1] + '.csv'
export_csv(api_key, stats_data_id, output_path)
if __name__ == '__main__':
argvs = sys.argv
argc = len(argvs)
sys.exit(main(argvs, argc))
Exemple d'utilisation:
python export_csv2015.py 0000030001
résultat:
e-stat0000030001.csv
"Zone / concentration 030002","Âge 5 ans classe A030002","Hommes et femmes A030001","Axe du temps(Annuel)","Préfecture nationale 030001","VALUE"
"Toute la zone","Nombre total","男女Nombre total","1980","À l'échelle nationale","117060396"
"Toute la zone","Nombre total","男女Nombre total","1980","Ville nationale","89187409"
"Toute la zone","Nombre total","男女Nombre total","1980","Comté national","27872987"
"Toute la zone","Nombre total","男女Nombre total","1980","Hokkaido","5575989"
"Toute la zone","Nombre total","男女Nombre total","1980","Préfecture d'Aomori","1523907"
"Toute la zone","Nombre total","男女Nombre total","1980","Préfecture d'Iwate","1421927"
"Toute la zone","Nombre total","男女Nombre total","1980","Préfecture de Miyagi","2082320"
"Toute la zone","Nombre total","男女Nombre total","1980","Akita","1256745"
"Toute la zone","Nombre total","男女Nombre total","1980","Préfecture de Yamagata","1251917"
"Toute la zone","Nombre total","男女Nombre total","1980","Préfecture de Fukushima","2035272"
"Toute la zone","Nombre total","男女Nombre total","1980","Préfecture d'Ibaraki","2558007"
"Toute la zone","Nombre total","男女Nombre total","1980","Préfecture de Tochigi","1792201"
"Toute la zone","Nombre total","男女Nombre total","1980","Préfecture de Gunma","1848562"
"Toute la zone","Nombre total","男女Nombre total","1980","Saitama","5420480"
"Toute la zone","Nombre total","男女Nombre total","1980","Préfecture de Chiba","4735424"
"Toute la zone","Nombre total","男女Nombre total","1980","Tokyo","11618281"
"Toute la zone","Nombre total","男女Nombre total","1980","Préfecture de Kanagawa","6924348"
"Toute la zone","Nombre total","男女Nombre total","1980","Préfecture de Niigata","2451357"
"Toute la zone","Nombre total","男女Nombre total","1980","Préfecture de Toyama","1103459"
・
・
・
Cela ne fonctionnera que s'il s'agit de Python 2.7, donc si vous n'avez que Python 3, construisons un environnement.
Création d'un environnement Python 3.x avec Pyenv (CentOS, Ubuntu)
Recommended Posts