[PYTHON] Hinweis zum Laden offener Daten im CSV-Format in Cloudant of Bluemix

Dies ist ein Memo, das verschiedene Probleme löste, während versucht wurde, eine große Datenmenge in Cloudant zu laden. Bei der Entwicklung eines Systems, das die KI-Technologie wie Watson voll ausnutzt, wird die KI umso interessanter oder wertvoller, je genauer die Daten gespeichert werden. Daher habe ich mich auf offene Daten konzentriert und überlegt, sie in eine Datenbank zu importieren, die unstrukturierte Daten verarbeiten kann.

Was willst du tun

Ich möchte auf einfache Weise Vorgänge ausführen, z. B. offene Daten im CSV-Format auf meinen PC importieren, in Excel prüfen und bearbeiten, im CSV-Format speichern und in Cloudant laden. Da der App-Server Linux ist, möchte ich den Kanji-Code von SJIS in UTF-8 konvertieren und den Zeilenvorschubcode sofort ändern. Das ist der Zweck.

スクリーンショット 2017-07-06 8.54.48.png

Was sind offene Daten?

Es gibt verschiedene Arten offener Daten, aber in diesem Beispielcode laden wir die Postleitzahldaten der Post in Referenzmaterial (1) in Cloudant.

Ich werde die Erklärung zu offenen Daten von der Website zitieren, die offene Daten verarbeitet.

Open Data sollte in einer Form verfügbar sein, die es jedem ermöglicht, bestimmte Daten wie gewünscht zu verwenden und erneut zu veröffentlichen, ohne Einschränkungen bei Kontrollmechanismen wie Urheberrechten oder Patenten. Die Idee ist, dass es gibt.

Referenzmaterial (2)

Unter dem Gesichtspunkt, durch die Verbesserung des öffentlichen Lebens und die Wiederbelebung der Unternehmensaktivitäten durch die weitgehende Offenlegung öffentlicher Daten zur Entwicklung der japanischen Sozioökonomie beizutragen, hat die japanische Regierung ein Datenformat geschaffen, das für die maschinelle Interpretation für kommerzielle Zwecke geeignet ist. Wir fördern Bemühungen um "offene Daten", die unter Nutzungsregeln veröffentlicht werden, die für sekundäre Zwecke verwendet werden können.

Referenzmaterial (3)

Offene Daten sind "Datenformat, das für die maschinelle Interpretation geeignet ist und unter Nutzungsregeln veröffentlicht wird, die für sekundäre Zwecke verwendet werden können" und "Daten, die die sekundäre Verwendung von Daten ohne viel Personal ermöglichen". ist. Mit anderen Worten, es bezieht sich auf Daten, die jeder innerhalb der zulässigen Regeln frei kopieren, verarbeiten und verteilen kann. Natürlich kann es auch für kommerzielle Zwecke verwendet werden. Ziel ist es, zur Entwicklung der gesamten Sozioökonomie beizutragen, indem Nutzer (Bürger, Privatunternehmen usw.) verschiedene öffentliche Daten wie "Bevölkerungsstatistik" und "Standorte öffentlicher Einrichtungen" effektiv nutzen. Führen ähnliche Versuche auf der ganzen Welt durch.

Referenzmaterial (4)

Die Bemühungen der japanischen Regierung in Bezug auf offene Daten finden Sie in Referenzmaterial (5). Ich denke, Sie können Ihr Verständnis vertiefen, indem Sie auch darauf verweisen.

Was ist Cloudant?

Die Gründe für die Auswahl und Verwendung von Cloudant werden nachfolgend beschrieben.

IBM Cloudant ist ein nicht verwalteter NoSQL JSON-Datenbankdienst, der einen schnellen, unterbrechungsfreien Datenfluss zwischen Ihrer Anwendung und Ihrer Datenbank ermöglicht. Mit Cloudant können Sie Apps mit höherem Mehrwert entwickeln, Ihr Geschäft ausbauen und den Verwaltungsaufwand reduzieren.

Referenzmaterial (6)

Gemäß diesem Referenzmaterial weist es die folgenden Merkmale auf.

Darüber hinaus hat der von Bluemix verwendete Cloudant Lite-Plan den großen Vorteil, dass er mit einer Datenmenge von weniger als 1 GB kostenlos verwendet werden kann. Referenzmaterial (7)

Cloudant hat auch Twitter und Sie können Informationen auch unter @IBMCludant https://twitter.com/ibmcloudant sammeln.

Vorbereitungen

Sie benötigen ein Bluemix-Konto, um diese Notiz tatsächlich ausführen zu können. Erstellen Sie nach der Anmeldung bei Bluemix einen Cloudant-Dienst, suchen Sie nach Dienstanmeldeinformationen, kopieren Sie vcap-local.json.sample, um vcap-local.json zu erstellen, und legen Sie die Anmeldeinformationen fest. Auf diese Weise können Sie von Ihrer eigenen Entwicklungsumgebung wie einem Notebook-PC aus auf Cloudant on Bluemix zugreifen.

Programm wird in Cloudant geladen

Ich habe die folgenden Elemente bearbeitet und die verfügbaren Python-Programme unter GitHUB https://github.com/takara9/cloudant_loader abgelegt. Die spezifische Bearbeitungsmethode finden Sie in README.md.

Erklärung des Ladeprogramms

Ich werde eine Beschreibung des Programms schreiben, damit Personen, die diesen Artikel lesen, ihn unter Bezugnahme auf das auf meinem GitHub registrierte Programm ändern können.

Ein- und Ausgänge festlegen

Geben Sie output_db und input_file an, bevor Sie ausgeführt werden. input_file kann im DOS-Format oder SJIS sein. output_db ist der Name der Cloudant-Datenbank.

import sys
import json
import codecs
import uuid
import time
from cloudant.client import Cloudant
from cloudant.query import Query

==================================
# Laden Sie den Namen der Zieldatenbank
 output_db = 'fukuoka' <-mit hier

# Geben Sie den Namen der CSV-Datei ein
 input_file = '40fukuoka.csv' <-hier
output_file = input_file + ".utf-8"
==================================

Sobald es in die Cloudant-Datenbank geladen wurde, können Sie es auf dem nächsten Bildschirm sehen. Der als Fukuoka angezeigte Teil ist das Ergebnis des Ladens mit den obigen Einstellungen.

スクリーンショット 2017-07-06 10.06.33.png

Um diesen Bildschirm anzuzeigen, gehen Sie durch das Menü als Bluemix-Menü-> Dienste-> Dashboard-> Cloudant-> LAUNCH.

Stellen Sie eine Verbindung zu Cloudant her

Laden Sie die Dienstanmeldeinformationen im JSON-Format und stellen Sie eine Verbindung zur Cloudant-Datenbank her. Das Format der JSON-Datei befindet sich auf GitHub mit dem Dateinamen vcap-local.json.sample. Bitte beziehen Sie sich beim Erstellen darauf.

# Erhalten Sie Cloudant-Anmeldeinformationen
f = open('./vcap-local.json', 'r')
cred = json.load(f)
f.close()

 print "Mit Cloudant verbinden"
client = Cloudant(cred['services']['cloudantNoSQLDB'][0]['credentials']['username'], 
                  cred['services']['cloudantNoSQLDB'][0]['credentials']['password'], 
                  url=cred['services']['cloudantNoSQLDB'][0]['credentials']['url'])
client.connect()

Sie können auf die Dienstanmeldeinformationen wie folgt verweisen. Klicken Sie im Bluemix Cloudant-Dienstbildschirm auf Credentaial-1-Anmeldeinformationen anzeigen, um die Daten im JSON-Format anzuzeigen, zu kopieren und zu verwenden.

スクリーンショット 2017-07-06 10.17.42.png

Datenbank löschen und erstellen

Beim Laden nach Unterschied funktioniert dies als Ergänzung, indem die vorhandene Datenbank nicht gelöscht wird. Wenn es jedoch erforderlich ist, mehrmals neu zu laden, bis die Daten verwendbar werden, werden sie wiederholt gelöscht und erstellt, sodass sie wie folgt geschrieben werden.

# Löschen, wenn DB vorhanden ist
 print "Vorhandene Datenbank erstellen", output_db, ""
try:
    db = client[output_db]
    if db.exists():
        client.delete_database(output_db)
except:
    pass


# Erstellen Sie eine neue Datenbank
 print "Neue Datenbank erstellen", output_db, ""
try: 
    db = client.create_database(output_db)
 print "Erfolgreiche Datenbankerstellung"
except:
 print "Datenbank konnte nicht erstellt werden"
sys.exit()

Konvertierung vom DOS-Format in das UNIX-Format

In diesem Teil werden die Kanji-Code-Konvertierung von SJIS nach UTF-8 und die Zeilenvorschub-Code-Konvertierung durchgeführt, um eine Zwischendatei zu generieren. Der Grund dafür, dass iconv nicht verwendet wird, besteht darin, dass iconv den Prozess ohne Fehler unterbrechen kann, wenn die geöffneten Daten Code außerhalb des Bereichs von SJIS enthalten, sodass das Laden der Daten fehlschlägt. Aber Sie können es nicht bemerken.

In diesem Code wird try --except verwendet, um den Konvertierungsfehler zu ergänzen und als Zeilennummer der CSV-Daten anzuzeigen, sodass Sie den Teil notieren können, in dem die Konvertierung fehlgeschlagen ist, und fortfahren können.

# Ausgabevorverarbeitungsergebnisse wie die Konvertierung von Zeichencode in eine Zwischendatei
fin = codecs.open(input_file, "r", "shift_jis")
fout = codecs.open(output_file, "w", "utf-8")
line_no = 0
while True:
    try:
        line = fin.readline()
        if line == "":
            break
        line = line.rstrip('\r\n') + "\n"
        line = line.replace('"','')
        fout.write(line)
        line_no = line_no + 1
    except Exception as e:
        print "Line = ", line_no, " Error message: ", e
        pass

Erstellen Sie Dokumentdaten im JSON-Format und laden Sie sie in Cloudant

Bei der oben erwähnten Kanji-Code-Konvertierung konnten wir den Kanji-Code entfernen, der aufgrund eines Fehlers unterbrochen würde. Dieses Mal konzentrieren wir uns auf die Geschwindigkeit und verwenden "reader.readlines ()", um alle Zeilen gleichzeitig in den Speicher zu holen. .. Erstellen Sie dann ein zeilenweises JSON-Dokument und registrieren Sie es bei Cloudant.

# Lesen Sie CSV-Daten aus der Excel-Tabelle und registrieren Sie sie in der Datenbank
reader = codecs.open(output_file, 'r', 'utf-8')
lines = reader.readlines()
print lines[0]

wait_cnt = 0
line_no = 0
for line in lines:

Wenn sich in der ersten Zeile der CSV-Datei eine Elementnamenzeile befindet, wird diese übersprungen. Wenn Sie keine Eingabezeile haben, ist es eine gute Idee, die drei Zeilen zu kommentieren, beginnend mit if line_no. Anschließend können Sie den Fortschritt erfassen, indem Sie die Debug-Anzeige anzeigen. Als nächstes gibt es vier Zeilen, die mit wait_cnt beginnen. Der kostenlose Cloudant Lite-Plan hat eine begrenzte Schreibgeschwindigkeit und gibt einen Fehler zurück, wenn mehr als 10 Schreibvorgänge pro Sekunde auftreten. Um das Tempolimit einzuhalten und das Auftreten eines Fehlers zu vermeiden, setzen wir WAIT für 1 Sekunde, nachdem wir 9 Elemente geschrieben haben.

 # Kopfzeile überspringen
    if line_no == 0:
        line_no = line_no + 1
        continue

 # Debug-Anzeige
    print line_no,line.rstrip('\n')

 # Zum Array erweitern
    al = line.split(',')
    line_no = line_no + 1

 Unterstützt das Schreibgeschwindigkeitslimit für den # Cloudant Lite-Plan
    wait_cnt = wait_cnt + 1
    if wait_cnt > 9:
        wait_cnt = 0
        time.sleep(1)

Generieren Sie json_doc als Dokumentdaten im json-Format und schreiben Sie sie mit db.create_document. Hier muss der Name des JSON-Elements entsprechend dem zu importierenden CSV-Datenelement benannt werden. Das Schreiben von json_doc muss entsprechend der Ziel-CSV angepasst werden. Die letzten beiden Zeilen dieses Codes sind Kommentare, dies ist jedoch ein Schreibbestätigungsprozess. Ich kommentiere, weil es langsam sein wird, wenn dieser Prozess enthalten ist.

 # DOC erstellen und schreiben
    id = str(uuid.uuid4())
    json_doc = {
        #"_id": id,
        "_id": al[0],
        "jusho_CD": al[0],
        "todofuken_CD": al[1],
 <Ausgelassen>
        "jigyosyo_mei_kana": al[19],
        "jigyosyo_jyusyo": al[20]
        #"sin_jyusyo_kana": al[21]
     }

 # Schreiben
    cdoc = db.create_document(json_doc)
    #if cdoc.exists():
    #    print "SUCCESS!!"

Im Fall von Cloudant wird uuid intern generiert und registriert, wenn kein _id-Element vorhanden ist. Wenn Sie es jedoch mit einem eindeutigen Schlüssel abrufen, können Sie es mit hoher Geschwindigkeit abrufen, indem Sie den Schlüssel in _id festlegen. Hier ist der Adresscode ein eindeutiger Code, daher wird er auf _id gesetzt.

    json_doc = {
        #"_id": id,
        "_id": al[0],

Zusammenfassung

Bei der Entwicklung von Systemen mit RDB war das Laden von Daten der erste Stolperstein. Selbst wenn Sie Cloudant verwenden, scheint das Laden der Daten eine schwierige Aufgabe zu sein.

Referenzmaterial

(1) Postleitzahlendaten der Post herunterladen http://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html (2) Wikipedia Open Data https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%83%87%E3 % 83% BC% E3% 82% BF (3) OPEN DATA JAPAN-Datenkatalog-Website http://www.data.go.jp/ (4) Open Data der lokalen Regierung https://www.open-governmentdata.org/ (5) Ministerium für innere Angelegenheiten und Kommunikation Förderung der Open-Data-Strategie Was ist Open Data? Http://www.soumu.go.jp/menu_seisaku/ictseisaku/ictriyou/opendata/opendata01.html (6) IBM Cloudant (japanische Website) https://www.ibm.com/analytics/jp/ja/technology/cloud-data-services/cloudant/ (7) IBM Bluemix Catalog Cloudant https://console.bluemix.net/catalog/services/cloudant-nosql-db?env_id=ibm:yp:us-south

Recommended Posts

Hinweis zum Laden offener Daten im CSV-Format in Cloudant of Bluemix
Hinweise zum Laden einer virtuellen Umgebung mit PyCharm
So kombinieren Sie alle CSVs in einem Ordner zu einer CSV
Hinweis: [Python3] Konvertiert datetime in eine Zeichenfolge in einem beliebigen Format
Bücher über Datenwissenschaft, die 2020 gelesen werden sollen
Eine kleine Geschichte, die Tabellendaten im CSV-Format mit hoher Geschwindigkeit ausgibt
Datenanalyse in Python: Ein Hinweis zu line_profiler
Ein Memorandum zur Verwendung von Keras 'keras.preprocessing.image
Beachten Sie beim Initialisieren einer Liste in Python
Bis Sie Daten in eine Tabelle in Python einfügen
2 Möglichkeiten, alle CSV-Dateien in einem Ordner zu lesen
Hinweis zum Standardverhalten von collate_fn in PyTorch
So geben Sie ein Dokument im PDF-Format mit Sphinx aus
Einfallsreichtum beim speichersparenden Umgang mit Daten mit Pandas
Ein Hinweis beim Berühren der Gesichtserkennungs-API von Microsoft mit Python
Geben Sie in vielen Excel gleichzeitig bestimmte Daten in ein bestimmtes Blatt ein
Ein Hinweis, wenn ich das Jupyter-Notizbuch unter Windows nicht öffnen kann
Ein Python-Skript, das Oracle-Datenbankdaten in CSV konvertiert
So geben Sie die im Django-Modell enthaltenen Daten im JSON-Format zurück und ordnen sie der Broschüre zu