[LINUX] Création d'un script Python prenant en charge l'API e-Stat (ver.2)

À propos de l'API e-Stat (version 2)

Les [spécifications API] d'e-Stat (http://www.e-stat.go.jp/api/api-spec/) ont été mises à jour.

qiita150923.png

Créer des scripts Python

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.

Rechercher des informations de table statistique

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
--------------
・
・
・

Tableau statistique de sortie au format csv

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"
・
・
・

Ceux qui n'ont que Python 3

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

Création d'un script Python prenant en charge l'API e-Stat (ver.2)
Script Python qui compare le contenu de deux répertoires
J'ai écrit un script Python qui exporte tous mes articles à l'aide de l'API Qiita v2
Un script qui renvoie 0, 1 attaché au premier Python prime
Classe qui atteint l'API de DMM
Exécuter l'interpréteur Python dans le script
[Python] Un programme qui arrondit le score
Création d'un wrapper Python pour l'API Qiita
"Kit Python" qui appelle des scripts Python depuis Swift
Python: créer une classe qui prend en charge l'affectation décompressée
Script Python qui lit les fichiers SQL, exécute BigQuery et enregistre le csv
Convertir l'API cURL en script Python (à l'aide du stockage d'objets IBM Cloud)
Que contient cette variable (lorsque le script Python est en cours d'exécution)
Exemples PHP et Python qui ont atteint l'API ChatWork
Un mémo que j'ai touché au magasin de données avec python
[Piyopiyokai # 1] Jouons avec Lambda: création d'un script Python
[Python] Un programme qui compare les positions des kangourous.
MALSS (introduction), un outil qui prend en charge l'apprentissage automatique en Python
Un script python qui obtient le nombre de travaux pour une condition spécifiée sur Indeed.com
Script shell qui numérote les noms en double lors de la création de fichiers
J'ai remplacé le livre de recettes Windows PowerShell par un script python.
Une note sur l'utilisation de l'API Facebook avec le SDK Python
Un script Python qui enregistre une image de presse-papiers (GTK) dans un fichier.
Créons un script qui s'enregistre avec Ideone.com en Python.
Un script qui facilite la création de menus riches avec l'API de messagerie LINE
Un script shell qui envoie simplement le résultat de l'exécution SQL
Script Python qui va de la recherche Google à l'enregistrement de la page de résultats de recherche à la fois
[Python] Un programme qui trouve les types d'oiseaux les plus courants
Appelez l'API avec python3.
Comment écrire une classe méta qui prend en charge à la fois python2 et python3
Un ensemble de fichiers de script qui font wordcloud avec Python3
Script Python qui peut vérifier l'état du serveur à partir du navigateur
Un script qui affiche la pile CloudFormation en cours d'exécution comme un mannequin
L'histoire de la création d'une base de données à l'aide de l'API Google Analytics
Un script python qui convertit les données Oracle Database en csv
Utilisez l'API e-Stat de Python
Notez qu'il prend en charge Python 3
J'ai écrit un script qui divise l'image en deux
L'histoire de la création d'un Bot qui affiche les membres actifs dans un canal spécifique de Slack avec Python
Jouez des sons en Python en supposant que le clavier est un clavier de piano
J'ai créé une bibliothèque Python pour appeler l'API de LINE WORKS
Créez un script shell pour exécuter le fichier python plusieurs fois
À partir d'un livre que le programmeur peut apprendre ... (Python): trouver la valeur la plus fréquente
Créer une API REST qui renvoie l'heure actuelle avec Python3 + Falcon
Une fonction qui mesure le temps de traitement d'une méthode en python
[Ev3dev] Créez un programme qui capture LCD (écran) en utilisant python
L'histoire de la création d'un site qui répertorie les dates de sortie des livres
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
Une classe qui résume les méthodes fréquemment utilisées dans l'api twitter (python)
Un script python qui supprime les fichiers ._DS_Store et ._ * créés sur Mac
Comment envoyer une requête à l'API DMM (FANZA) avec python
[python] Une note que j'ai commencé à comprendre le comportement de matplotlib.pyplot
L'histoire de la création d'un module qui ignore le courrier avec python
[Python] Un programme qui fait pivoter le contenu de la liste vers la gauche
Obtenir l'API arXiv en Python
Frappez l'API Sesami en Python