[LINUX] Erstellen eines Python-Skripts, das die e-Stat-API unterstützt (Version 2)

Informationen zur e-Stat-API (Version 2)

Die [API-Spezifikationen] von e-Stat (http://www.e-stat.go.jp/api/api-spec/) wurden aktualisiert.

qiita150923.png

Python-Skripte erstellen

Ich habe ein Skript erstellt, das Version 2 entspricht, indem ich mich auf den Beitrag meines Vorgängers (Python 2.7) bezog.

Verwenden wir die API des allgemeinen Fensters für Regierungsstatistiken (e-Stat)

Das Skript vor dem Bearbeiten enthält die API-ID im Argument, aber es ist schwierig, sie jedes Mal einzugeben, daher habe ich sie in den Code geschrieben.

Außerdem wird Government Statistics Code in stats_code eingegeben.

Suchen Sie nach statistischen Tabelleninformationen

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 = '' #Geben Sie die erhaltene API-ID ein
 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))

Anwendungsbeispiel:

python getStatsListSample2015.py 1 00200521 > gSLS00200521.dat

Ergebnis:

gSLS00200521.dat


--------------
TABLE_INF 0000030001 
            
STAT_NAME 00200521 Volkszählung
GOV_ORG 00200 Ministerium für innere Angelegenheiten und Kommunikation
STATISTICS_NAME 1980 Volkszählung 1. Basic Total National Edition
TITEL 00101 Geschlecht (Geschlecht) (3), Alter 5 Jahre (23), Bevölkerung im ganzen Land / Stadt / Landkreis / Präfektur (47), Gesamtgebiet / Bevölkerungskonzentrationsgebiet
CYCLE -
SURVEY_DATE 198010
OPEN_DATE 2007-10-05
SMALL_AREA 0
MAIN_KATEGORIE 02 Bevölkerung / Haushalt
SUB_KATEGORIE 01 Bevölkerung
OVERALL_TOTAL_NUMBER 3651
UPDATED_DATE 2008-03-19
--------------
TABLE_INF 0000030002 
            
STAT_NAME 00200521 Volkszählung
GOV_ORG 00200 Ministerium für innere Angelegenheiten und Kommunikation
STATISTICS_NAME 1980 Volkszählung 1. Basic Total National Edition
TITEL 00102 Geschlecht (Geschlecht) (3), Altersgruppe (103), Bevölkerung im ganzen Land / Stadt / Landkreis / Präfektur (47), Gesamtgebiet / Bevölkerungskonzentrationsgebiet
CYCLE -
SURVEY_DATE 198010
OPEN_DATE 2007-10-05
SMALL_AREA 0
MAIN_KATEGORIE 02 Bevölkerung / Haushalt
SUB_KATEGORIE 01 Bevölkerung
OVERALL_TOTAL_NUMBER 16365
UPDATED_DATE 2008-03-19
--------------
・
・
・

Statistische Tabelle als csv ausgeben

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):
    """
Statistiken exportieren
    """
    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):
    """
Holen Sie sich Meta-Informationen
    """
    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):
    """
Exportieren Sie die angegebenen Statistiken in die 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 = '' #Geben Sie die erhaltene API-ID ein
    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))

Anwendungsbeispiel:

python export_csv2015.py 0000030001

Ergebnis:

e-stat0000030001.csv


"Fläche / Konzentration 030002","Alter 5 Jahre Klasse A030002","Männer und Frauen A030001","Zeitachse(Jährlich)","Nationale Präfektur 030001","VALUE"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Bundesweit","117060396"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Nationale Stadt","89187409"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","National County","27872987"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Hokkaido","5575989"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Aomori","1523907"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Iwate","1421927"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Miyagi","2082320"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Akita","1256745"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Yamagata","1251917"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Fukushima","2035272"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Ibaraki","2558007"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Tochigi","1792201"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Gunma","1848562"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Saitama","5420480"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Chiba","4735424"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Tokio","11618281"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Kanagawa","6924348"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Niigata","2451357"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Toyama","1103459"
・
・
・

Diejenigen, die nur Python 3 haben

Es wird nur funktionieren, wenn es Python 2.7 ist. Wenn Sie also nur Python 3 haben, erstellen wir eine Umgebung.

Erstellen einer Python 3.x-Umgebung mit Pyenv (CentOS, Ubuntu)

Recommended Posts

Erstellen eines Python-Skripts, das die e-Stat-API unterstützt (Version 2)
Python-Skript, das den Inhalt zweier Verzeichnisse vergleicht
Ich habe ein Python-Skript geschrieben, das alle meine Beiträge mit der Qiita API v2 exportiert
Ein Skript, das 0, 1 an die erste Python-Primzahl zurückgibt
Klasse, die die API von DMM trifft
Führen Sie den Python-Interpreter im Skript aus
[Python] Ein Programm, das die Partitur rundet
Erstellt einen Python-Wrapper für die Qiita-API
"Python Kit", das Python-Skripte von Swift aufruft
Python: Erstellen Sie eine Klasse, die entpackte Zuweisungen unterstützt
Python-Skript, das SQL-Dateien liest, BigQuery ausführt und CSV speichert
Konvertieren der cURL-API in ein Python-Skript (mithilfe des IBM Cloud-Objektspeichers)
Was ist in dieser Variablen (wenn das Python-Skript ausgeführt wird)?
PHP- und Python-Beispiele, die die ChatWork-API treffen
Ein Memo, dass ich den Datenspeicher mit Python berührt habe
[Piyopiyokai # 1] Spielen wir mit Lambda: Erstellen eines Python-Skripts
[Python] Ein Programm, das die Positionen von Kängurus vergleicht.
MALSS (Einführung), ein Tool, das maschinelles Lernen in Python unterstützt
Ein Python-Skript, das die Anzahl der Jobs für eine bestimmte Bedingung von Indeed.com abruft
Shell-Skript, das beim Erstellen von Dateien doppelte Namen nummeriert
Ich habe das Windows PowerShell-Kochbuch durch ein Python-Skript ersetzt.
Ein Hinweis zum Aufrufen der Facebook-API mit dem Python SDK
Ein Python-Skript, das ein GTK-Bild (Clipboard) in einer Datei speichert.
Erstellen wir ein Skript, das sich bei Ideone.com in Python registriert.
Ein Skript, mit dem Sie mit der LINE Messaging-API auf einfache Weise umfangreiche Menüs erstellen können
Ein Shell-Skript, das nur das Ergebnis der SQL-Ausführung per E-Mail sendet
Python-Skript, das von der Google-Suche zum sofortigen Speichern der Suchergebnisseite führt
[Python] Ein Programm, das die häufigsten Vogeltypen findet
Rufen Sie die API mit python3 auf.
So schreiben Sie eine Meta-Klasse, die sowohl Python2 als auch Python3 unterstützt
Eine Reihe von Skriptdateien, die Wordcloud mit Python3 ausführen
Python-Skript, das den Status des Servers über den Browser überprüfen kann
Ein Skript, das den laufenden CloudFormation-Stapel wie ein Mannequin anzeigt
Die Geschichte des Erstellens einer Datenbank mithilfe der Google Analytics-API
Ein Python-Skript, das Oracle-Datenbankdaten in CSV konvertiert
Verwenden Sie die e-Stat-API von Python
Beachten Sie, dass es Python 3 unterstützt
Ich habe ein Skript geschrieben, das das Bild in zwei Teile teilt
Die Geschichte des Erstellens eines Bots, der aktive Mitglieder in einem bestimmten Slack-Kanal mit Python anzeigt
Spielen Sie Sounds in Python ab, vorausgesetzt, die Tastatur ist eine Klaviertastatur
Ich habe eine Python-Bibliothek erstellt, um die API von LINE WORKS aufzurufen
Erstellen Sie ein Shell-Skript, um die Python-Datei mehrmals auszuführen
Aus einem Buch, das der Programmierer lernen kann ... (Python): Finden Sie den häufigsten Wert
Erstellen Sie mit Python3 + Falcon eine REST-API, die die aktuelle Uhrzeit zurückgibt
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
[Ev3dev] Erstellen Sie ein Programm, das das LCD (Bildschirm) mit Python erfasst
Die Geschichte der Erstellung einer Website, auf der die Veröffentlichungsdaten von Büchern aufgeführt sind
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
Eine Klasse, die häufig verwendete Methoden in Twitter API (Python) zusammenfasst.
Ein Python-Skript, das auf dem Mac erstellte ._DS_Store- und ._ * -Dateien löscht
So senden Sie eine Anfrage mit Python an die DMM (FANZA) -API
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
[Python] Ein Programm, das den Inhalt der Liste nach links dreht
Abrufen der arXiv-API in Python
Klicken Sie in Python auf die Sesami-API