[PYTHON] Remarque pour charger des données ouvertes au format CSV dans Cloudant de Bluemix

Ceci est un mémo qui a résolu divers problèmes tout en essayant de charger une grande quantité de données dans Cloudant. Lors du développement d'un système qui utilise pleinement la technologie de l'IA telle que Watson, plus les données sont stockées avec précision, plus l'IA devient intéressante ou précieuse. Par conséquent, je me suis concentré sur les données ouvertes et j'ai envisagé de les importer dans une base de données capable de gérer des données non structurées.

Que veux-tu faire

Je souhaite effectuer facilement des opérations telles que l'importation de données ouvertes au format CSV sur mon PC, la vérification et l'édition dans Excel, l'enregistrement au format CSV et leur chargement dans Cloudant. Étant donné que le serveur d'application est Linux, je souhaite convertir le code Kanji de SJIS en UTF-8 et modifier le code de saut de ligne à la fois. Tel est le but.

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

Qu'est-ce que les données ouvertes?

Il existe différents types de données ouvertes, mais dans cet exemple de code, nous chargerons les données du code postal du bureau de poste dans le document de référence (1) dans Cloudant.

Je vais citer l'explication sur les données ouvertes du site Web qui gère les données ouvertes.

Les données ouvertes doivent être disponibles sous une forme permettant l'utilisation et la republication de données spécifiques à la demande de tous, sans aucune restriction sur les mécanismes de contrôle tels que les droits d'auteur ou les brevets. L'idée est qu'il y en a.

Matériel de référence (2)

Dans l'optique de contribuer au développement de la socio-économie japonaise en améliorant la vie publique et en revitalisant les activités des entreprises en diffusant largement des données publiques, le gouvernement japonais a créé un format de données adapté à l'interprétation par machine à des fins commerciales. Nous encourageons les efforts de «données ouvertes» qui seront divulguées selon des règles d'utilisation pouvant être utilisées à des fins secondaires.

Matériel de référence (3)

Les données ouvertes sont "un format de données adapté à l'interprétation par machine et publié selon des règles d'utilisation pouvant être utilisées à des fins secondaires" et "des données permettant une utilisation secondaire des données sans beaucoup de main-d'œuvre". est. En d'autres termes, il fait référence à des données que n'importe qui peut librement copier, traiter et distribuer dans les règles autorisées. Bien entendu, il peut également être utilisé à des fins commerciales. L'objectif est de contribuer au développement de l'ensemble de la socio-économie en permettant aux utilisateurs (citoyens, entreprises privées, etc.) d'utiliser efficacement diverses données publiques telles que les «statistiques démographiques» et les «localisations des équipements publics». , Entreprennent des tentatives similaires à travers le monde.

Matériel de référence (4)

Les efforts du gouvernement japonais concernant les données ouvertes peuvent être trouvés dans Reference Material (5), donc je pense que vous pouvez approfondir votre compréhension en vous y référant également.

Qu'est-ce que Cloudant

Les raisons du choix et de l'utilisation de Cloudant sont décrites ci-dessous.

IBM Cloudant est un service de base de données NoSQL JSON non géré qui fournit un flux de données rapide et ininterrompu entre votre application et votre base de données. Avec Cloudant, vous serez en mesure de développer des applications à plus forte valeur ajoutée, de développer votre entreprise et de réduire les efforts de gestion.

Matériel de référence (6)

Selon ce matériau de référence, il présente les caractéristiques suivantes.

De plus, le plan Cloudant Lite utilisé à partir de Bluemix a le gros point qu'il peut être utilisé gratuitement avec une quantité de données inférieure à 1G. Matériel de référence (7)

Cloudant possède également Twitter et vous pouvez également collecter des informations sur @IBMCludant https://twitter.com/ibmcloudant.

Les préparatifs

Vous avez besoin d'un compte Bluemix pour exécuter cette note. De plus, après vous être connecté à Bluemix, créez un service Cloudant, parcourez les informations d'identification du service, copiez vcap-local.json.sample pour créer vcap-local.json et définissez les informations d'identification. Ce faisant, vous pourrez accéder à Cloudant sur Bluemix à partir de votre propre environnement de développement tel qu'un ordinateur portable.

Chargement du programme dans Cloudant

J'ai édité les éléments suivants et mis les programmes Python disponibles sur GitHUB https://github.com/takara9/cloudant_loader. Veuillez consulter README.md pour la méthode d'édition spécifique.

Explication du programme de chargement

J'écrirai une description du programme afin que les personnes qui liront cet article puissent le modifier en se référant au programme enregistré sur mon GitHub.

Spécifier les entrées et les sorties

Spécifiez output_db et input_file avant d'exécuter. input_file peut être au format DOS ou SJIS tel quel. output_db est le nom de la base de données cloudant.

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

==================================
# Charger le nom de la base de données de destination
 output_db = 'fukuoka' <-avec ici

# Entrez le nom du fichier CSV
 input_file = '40fukuoka.csv' <-ici
output_file = input_file + ".utf-8"
==================================

Une fois chargé dans la base de données Cloudant, vous pouvez le voir sur l'écran suivant. La partie affichée comme fukuoka est le résultat du chargement avec les paramètres ci-dessus.

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

Pour afficher cet écran, parcourez le menu sous Bluemix Menu-> Services-> Dashboard-> Cloudant-> LAUNCH.

Connectez-vous à Cloudant

Chargez les informations d'identification du service au format JSON et connectez-vous à la base de données Cloudant. Le format du fichier JSON est situé sur GitHub avec le nom de fichier vcap-local.json.sample, veuillez donc vous y référer lors de sa création.

# Obtenez les identifiants Cloudant
f = open('./vcap-local.json', 'r')
cred = json.load(f)
f.close()

 imprimer "Se connecter à Cloudant"
client = Cloudant(cred['services']['cloudantNoSQLDB'][0]['credentials']['username'], 
                  cred['services']['cloudantNoSQLDB'][0]['credentials']['password'], 
                  url=cred['services']['cloudantNoSQLDB'][0]['credentials']['url'])
client.connect()

Vous pouvez vous référer aux informations d'identification du service comme suit. Sur l'écran du service Bluemix Cloudant, cliquez sur Afficher les informations d'identification Credentaial-1 pour voir les données au format JSON, puis copiez-les et utilisez-les.

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

Supprimer et créer une base de données

Dans le cas d'un chargement par différence, cela fonctionne comme un ajout en ne supprimant pas la base de données existante. En revanche, dans le cas où il est nécessaire de recharger plusieurs fois jusqu'à ce que les données deviennent utilisables, elles seront supprimées et créées à plusieurs reprises, donc elles s'écrit comme suit.

# Supprimer si DB existe
 print "Créer une base de données existante", output_db, ""
try:
    db = client[output_db]
    if db.exists():
        client.delete_database(output_db)
except:
    pass


# Créer un nouveau DB
 print "Créer une nouvelle base de données", output_db, ""
try: 
    db = client.create_database(output_db)
 print "Création de la base de données réussie"
except:
 print "Impossible de créer la base de données"
sys.exit()

Conversion du format DOS au format UNIX

Dans cette partie, la conversion de code Kanji de SJIS à UTF-8 et la conversion de code de saut de ligne sont effectuées pour générer un fichier intermédiaire. Ici, la raison de ne pas utiliser iconv est que si les données ouvertes contiennent du code en dehors de la plage de SJIS, iconv peut interrompre le processus sans erreur, de sorte que le chargement des données échoue. Mais vous ne le remarquerez peut-être pas.

Dans ce code, try --except est utilisé pour compléter l'erreur de conversion et l'afficher comme numéro de ligne des données CSV, afin que vous puissiez noter la partie où la conversion a échoué et continuer.

# Sortie des résultats de prétraitement tels que la conversion de code de caractère en un fichier intermédiaire
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

Créez des données de document au format JSON et chargez-les dans Cloudant

Dans le processus de conversion de code kanji mentionné ci-dessus, nous avons pu éliminer le code kanji qui serait interrompu en raison d'une erreur, donc cette fois nous allons nous concentrer sur la vitesse et utiliser "reader.readlines ()" pour récupérer toutes les lignes en mémoire à la fois. .. Ensuite, créez un document JSON ligne par ligne et enregistrez-le auprès de Cloudant.

# Lisez les données CSV de la feuille Excel et enregistrez-les dans DB
reader = codecs.open(output_file, 'r', 'utf-8')
lines = reader.readlines()
print lines[0]

wait_cnt = 0
line_no = 0
for line in lines:

S'il y a une ligne de nom d'élément sur la première ligne du fichier CSV, elle est ignorée. Si vous n'avez pas de ligne d'entrée, c'est une bonne idée de commenter les trois lignes commençant par if line_no. Ensuite, vous pouvez saisir la progression en affichant l'affichage de débogage. Ensuite, il y a quatre lignes commençant par wait_cnt, dont le plan gratuit Cloudant Lite a une vitesse d'écriture limitée et renverra une erreur si plus de 10 écritures se produisent par seconde. Afin de conserver la limite de vitesse et d'éviter l'apparition d'une erreur, nous mettons ATTENDEZ 1 seconde après avoir écrit 9 items.

 # Ignorer la ligne d'en-tête
    if line_no == 0:
        line_no = line_no + 1
        continue

 # Affichage de débogage
    print line_no,line.rstrip('\n')

 # Développer en tableau
    al = line.split(',')
    line_no = line_no + 1

 Prend en charge la limite de vitesse d'écriture pour le plan #Cloudant Lite
    wait_cnt = wait_cnt + 1
    if wait_cnt > 9:
        wait_cnt = 0
        time.sleep(1)

Générez json_doc en tant que données de document au format json et écrivez-le avec db.create_document. Ici, le nom de l'élément JSON doit être nommé en fonction de l'élément de données CSV à importer. La manière d'écrire json_doc doit être personnalisée en fonction du CSV cible. Les deux dernières lignes de ce code sont des commentaires, mais il s'agit d'un processus de confirmation d'écriture. Je commente parce que ce sera lent si ce processus est inclus.

 # Création et rédaction de DOC
    id = str(uuid.uuid4())
    json_doc = {
        #"_id": id,
        "_id": al[0],
        "jusho_CD": al[0],
        "todofuken_CD": al[1],
 <Omis>
        "jigyosyo_mei_kana": al[19],
        "jigyosyo_jyusyo": al[20]
        #"sin_jyusyo_kana": al[21]
     }

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

Dans le cas de Cloudant, s'il n'y a pas d'élément _id, uuid est généré en interne et enregistré. Cependant, si vous le récupérez avec une clé unique, vous pouvez le récupérer à grande vitesse en définissant la clé dans _id. Ici, le code d'adresse est un code unique, il est donc défini sur _id.

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

Résumé

Lors du développement de systèmes avec RDB, le chargement des données était la première pierre d'achoppement. Même si vous utilisez Cloudant, il semble que le chargement des données soit une tâche difficile.

Matériel de référence

(1) Téléchargement des données du code postal du bureau de poste http://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html (2) Données ouvertes Wikipédia 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) Site du catalogue de données OPEN DATA JAPAN http://www.data.go.jp/ (4) Données ouvertes du gouvernement local https://www.open-governmentdata.org/ (5) Ministère de l'Intérieur et des Communications Promotion de la stratégie de données ouvertes Qu'est-ce que les données ouvertes? Http://www.soumu.go.jp/menu_seisaku/ictseisaku/ictriyou/opendata/opendata01.html (6) IBM Cloudant (site japonais) https://www.ibm.com/analytics/jp/ja/technology/cloud-data-services/cloudant/ (7) Catalogue IBM Bluemix Cloudant https://console.bluemix.net/catalog/services/cloudant-nosql-db?env_id=ibm:yp:us-south

Recommended Posts

Remarque pour charger des données ouvertes au format CSV dans Cloudant de Bluemix
Remarques sur la façon de charger un environnement virtuel avec PyCharm
Comment combiner tous les CSV d'un dossier en un seul CSV
Remarque: [Python3] Convertissez datetime en chaîne dans le format de votre choix
Livres sur la science des données à lire en 2020
Une petite histoire qui produit des données de table au format CSV à grande vitesse
Analyse de données en Python: une note sur line_profiler
Un mémorandum sur l'utilisation de keras.preprocessing.image de Keras
Choses à noter lors de l'initialisation d'une liste en Python
Jusqu'à ce que vous insériez des données dans une feuille de calcul en Python
2 façons de lire tous les fichiers csv dans un dossier
Remarque sur le comportement par défaut de collate_fn dans PyTorch
Comment sortir un document au format pdf avec Sphinx
Ingéniosité pour gérer les données avec Pandas de manière à économiser la mémoire
Une note quand j'ai touché l'API de reconnaissance faciale de Microsoft avec Python
Entrer simultanément des données spécifiques sur une feuille spécifique dans de nombreux Excel
Une note lorsque je ne peux pas ouvrir le bloc-notes Jupyter sous Windows
Un script python qui convertit les données Oracle Database en csv
Comment retourner les données contenues dans le modèle django au format json et les mapper sur le dépliant