[PYTHON] Représenter des conteneurs dans un cadre imbriqué (schéma) dans Jupyter, et ce que j'ai étudié en cours de création

Comment schématiser facilement un conteneur en Python? C'était le début, et à partir de là, j'ai pris note de ce que j'avais réalisé en utilisant le notebook Jupyter et de ce que je pensais être indirectement utile dans le processus de réalisation.

introduction

Ce n'est pas limité à Python, mais je me suis demandé s'il serait facile de préparer un diagramme visuellement facile à comprendre ou quelque chose lors de l'explication de données avec plusieurs conteneurs imbriqués (en particulier pour les débutants en programmation). C'était la raison pour laquelle j'ai fait ça.

Je ne suis pas satisfait de simplement préparer quelques échantillons sous forme d'images, alors je me suis demandé si le code pouvait être schématisé tel quel.

Dans un premier temps, traverser le conteneur pour faire une image? J'ai pensé, mais il semble difficile de calculer la partie qui exprime l'emboîtement ...

Mais quand j'y pense, cela m'est familier quand il s'agit d'exprimer la nidification. Oui, il est facile d'écrire en HTML et de l'afficher dans un navigateur Web.

Je commençais à peine à toucher Jupyter, donc ce serait mieux s'il pouvait être affiché sur Jupyter. Ensuite, pour faire des essais et des erreurs, le processus de conversion est transformé en module ...

À la suite de diverses réflexions comme celle-ci, il est devenu "affichage sous forme de cadre imbriqué en HTML".

Les liens des sites référencés sont affichés directement dans le texte.

Environnement de développement

Je développe avec Windows7 + Anaconda (Python3), Tout fonctionnera tant que vous pourrez utiliser Python 3.5.1 et le notebook Jupyter.

Méthode de réalisation

En gros, tout ce que vous avez à faire est de parcourir le conteneur et de créer le HTML. Il y avait encore beaucoup de choses que je ne comprenais pas en Python, alors j'ai décidé de le faire par essais et erreurs. Notez certaines des choses que vous avez apprises au cours du processus.

Sortie HTML telle qu'elle est avec Jupyter

Vous pouvez utiliser le module IPython display pour générer du HTML directement dans les résultats Jupyter.

Module: display — IPython 4.2.0 documentation http://ipython.readthedocs.io/en/stable/api/generated/IPython.display.html

--Exemple

from IPython.display import display, HTML

display(HTML('<p>Hello.</p>'))

Convertir des objets tels que des conteneurs en HTML

Parcourez le conteneur et convertissez-le en HTML. Il se transforme de manière récursive, ce qui entraîne une imbrication.

Comme il est difficile de comprendre l'apparence simplement en sortie en HTML, nous avons permis de distinguer plusieurs types par type de ligne et couleur. Ajoutez donc un style (classe) à la balise.

Créez un module nommé container2html pour convertir ces conteneurs en HTML.

Pour appliquer la définition de style, sortez la balise <style> au format HTML à l'avance.

Utiliser temporairement un module dans l'environnement local

Pour utiliser temporairement un module écrit localement, ajoutez un répertoire au chemin du module. Si vous ajoutez le répertoire du projet au chemin du module, vous pouvez l'importer comme un module normal.

Par exemple, j'écris un module dans PyCharm sous Windows en ce moment Il existe un répertoire de projet C: \ Users \ argius \ PyCharm \ MyModule1 Et supposons que vous vouliez créer un fichier appelé container2html.py en dessous et en faire un module.

Dans ce cas, vous pouvez utiliser le module avec le nom c2h en procédant comme suit.

import sys
sys.path.append(r'C:\Users\argius\PyCharm\MyModule1')

import container2html as c2h

Module de rechargement

Une fois le module chargé, les mises à jour du code ne prendront effet qu'après son rechargement. Dans ce cas, c'est un processus d'essai et d'erreur, donc j'aimerais refléter la mise à jour chaque fois que je modifie le module ...

Dans ce cas, c'est-à-dire pour réévaluer le module modifié, utilisez la fonction reload du module ʻimport lib`.

import importlib
importlib.reload(c2h)

21/07/2016: J'utilisais l'ancien module ʻimp, donc je l'ai modifié en ʻimport lib.

Examiner la relation parent-enfant des types

Je voulais étudier la relation parent-enfant telle que le type de base afin qu'il puisse gérer des types inconnus dans une certaine mesure, mais au début je ne savais pas comment le faire.

Le site ci-dessous montre que vous pouvez le rechercher en utilisant la méthode mro. Vous pouvez tracer les ancêtres de l'objet ʻo avec type (o) .mro () . Vous pouvez également spécifier directement le nom du type, tel que list.mro ()`.

Conseils Python: Je veux vérifier la relation d'héritage des classes - Life with Python http://www.lifewithpython.com/2014/08/python-check-class-inheritance-relationship.html

Par exemple, le Counter dans le module collections est similaire à un dictionnaire, mais pour voir s'il peut être interprété comme un dictionnaire, j'ai vérifié:

>>> from collections import Counter
>>> Counter.mro()
[<class 'collections.Counter'>, <class 'dict'>, <class 'object'>]

la mise en oeuvre

Module container2html.py

"""Container to HTML"""


def convert(o, **kwargs):
    label = kwargs.get('label', None)
    labelhtml = '' if label is None else '<p class="label">%s</p>' % label
    return '<div class="c2h">%s %s</div>' % (labelhtml, HtmlConverter(kwargs).object_to_html(o))


def escape(o):
    return str(o).replace('&', '&amp;').replace('"', '&quot;').replace('<', '&lt;').replace('>', '&gt;')


class HtmlConverter:
    def __init__(self, kwargs):
        self.options = kwargs
        self.showtypeinfo = self.options.get('showtypeinfo', False)

    def object_to_html(self, o):
        def f():
            if isinstance(o, dict):
                return self.dict_to_html(o, 'dict')
            t = type(o)
            if t is tuple:
                return self.seq_to_html(o, 'tuple')
            if t is str:
                return '<span class="value">%s</span>' % repr(o)
            if t is list or hasattr(o, '__iter__'):
                return self.seq_to_html(o, 'list')
            return '<span class="value">%s</span>' % str(o)

        if self.showtypeinfo:
            return '<div class="typeinfo"><div>[%s]</div>%s</div>' % (escape(type(o).__name__), f())
        return f()

    o2html = object_to_html

    def seq_to_html(self, seq, style_name=None):
        a = list(seq)
        if len(a) == 0:
            return '<div style="nil">%s(empty)</div>' % ''
        items = ['<li>%s</li>' % self.o2html(x) for x in a]
        return '<ul class="%s">%s</ul>' % (style_name, ''.join(items))

    def dict_to_html(self, d, style_name=None):
        if len(d) == 0:
            return '<ul class="%s"><li>(empty)</li></ul>' % style_name
        items = ['<ul><li>%s</li><li>%s</li></ul>' % (self.o2html(k), self.o2html(v)) for k, v in d.items()]
        return '<ul class="%s"><li>%s</li></ul>' % (style_name, ''.join(items))

style

div.c2h {
  font-family: consolas, monospace;
  border: 1px solid black;
  margin: 0px 1px 3px 0px;
  padding: 3px 1em;
}
div.c2h .label {
  font-size: 100%;
  color: blue;
  text-decoration: underline;
  padding-bottom: 1ex;
}
div.c2h span.value {
  background-color: #fff;
  padding: 1px 4px;
}
div.c2h div.typeinfo {
  border: 1px dashed grey;
}
div.c2h ul {
  border: 4px solid black;
  display: table;
  margin: 1ex;
  padding-left: 0;
  list-style: none;
  text-align: center;
}
div.c2h ul li {
  display:table-cell;
  vertical-align: middle;
  text-align:center;
  padding: 1ex;
  border-style: solid;
  border-right-width: 4px;
  border-top-width: 0px;
  border-bottom-width: 0px;
}
div.c2h ul.list {
  border-color: #cc3311;
}
div.c2h ul.list li {
  border-color: #cc3311;
}
div.c2h ul.tuple {
  border-color: #33bb33;
  border-radius:10px;
}
div.c2h ul.tuple > li {
  border-color: #33bb33;
}
div.c2h ul.dict {
  border-color: #3333cc;
}
div.c2h ul.dict > li {
  border-color: #3333cc;
}
div.c2h ul.dict > li ul {
  border-color: #3333cc;
  border-style: inset;
  border-radius:10px;
}
div.c2h ul.dict > li ul li {
  border-color: #3333ff;
  border-width: 1px;
}

Résultat d'exécution

Préparez-vous à l'avance.

from IPython.display import display, HTML

import sys
sys.path.append(r'C:\Users\argius\PyCharm\MyModule1')

import container2html as c2h

display(HTML('''
<style>
(réduction)
</style>
'''))

Vous pouvez maintenant afficher le résultat de la fonction c2h.convert par display (HTML (...)). C'est un problème d'écrire ceci à chaque fois, alors Définissez une fonction v comme un raccourci qui génère la version convertie en HTML de la chaîne de caractères de code (expression) avec affichage.

def v(code, **kwargs):
    display(HTML(c2h.convert(eval(code), label=code, **kwargs)))

Tout ce que vous avez à faire est de l'exécuter.

Code d'exécution

Si vous ajoutez showtypeinfo = True comme option, le nom du type sera également affiché.

v('[1, 2, (3, 4, 5)]')
v('[1, 2, (3, 4, 5)]', showtypeinfo=True)
v('zip([1, 2, 3, 4], [1, 2, 3, 4], [5, 6, 7, 8])', showtypeinfo=True)
v('dict(one=1, two=2)')
v('range(5)')

from collections import Counter
v("Counter(['a', 'a', 'b', 'c'])", showtypeinfo=True)

import numpy as np
v('np.arange(9).reshape(3, 3)', showtypeinfo=True)

résultat

«dict» est affiché dans un cadre bleu, «tuple» est affiché dans un cadre vert, et les autres «list» et autres «éditables» sont affichés dans un cadre rouge.

_qiita.png

en conclusion

Je ne sais pas si cela sera réellement utilisé, mais je pense qu'il était plus significatif d'enquêter pour le faire. En fait, cette fois, j'ai eu plus de mal avec CSS qu'avec Python.

Surtout, c'est amusant de faire quelque chose par essais et erreurs comme ça!

Recommended Posts

Représenter des conteneurs dans un cadre imbriqué (schéma) dans Jupyter, et ce que j'ai étudié en cours de création
Le résultat de la création d'un album de cartes de jeunes mariés italiens en Python et de son partage
Le processus de création et d'amélioration du code Python orienté objet
Traitez le contenu du fichier dans l'ordre avec un script shell
[Python / Jupyter] Traduisez le commentaire du programme copié dans le presse-papiers et insérez-le dans une nouvelle cellule.
J'ai défini des variables d'environnement dans Docker et je les ai affichées en Python.
J'ai vectorisé l'accord de la chanson avec word2vec et je l'ai visualisé avec t-SNE
L'histoire de la création d'une caméra sonore avec Touch Designer et ReSpeaker
Ce que j'ai fait quand je ne pouvais pas trouver le point caractéristique avec le flux optique d'opencv et quand je l'ai perdu
J'ai fait GAN avec Keras, donc j'ai fait une vidéo du processus d'apprentissage.
J'ai fait une erreur en récupérant la hiérarchie avec MultiIndex of pandas
Je voulais connaître le nombre de lignes dans plusieurs fichiers et j'ai essayé de l'obtenir avec une commande
Pour générer une valeur au milieu d'une cellule avec Jupyter Notebook
Si vous définissez une méthode dans une classe Ruby, puis définissez une méthode dans celle-ci, elle devient une méthode de la classe d'origine.
Ce que j'ai fait quand j'étais en colère de le mettre avec l'option enable-shared
J'ai étudié le temps de calcul de "X dans la liste" (recherche linéaire / recherche dichotomique) et "X dans l'ensemble"
Traitement d'image avec Python (j'ai essayé de le binariser en art mosaïque 0 et 1)
Lisez le fichier csv avec le notebook jupyter et écrivez le graphique l'un sur l'autre
Je n'aime pas être frustré par la sortie de Pokemon Go, j'ai donc créé un script pour détecter la sortie et le tweeter
J'ai écrit python3.4 dans .envrc avec direnv et je l'ai autorisé, mais j'ai eu une erreur de syntaxe
Notez ce que vous voulez faire à l'avenir avec Razpai
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
Comment insérer un processus spécifique au début et à la fin de l'araignée avec la tremblante
[Python] J'ai visualisé les paroles d'Arashi avec WordCloud et j'ai essayé de démêler ce que je voulais transmettre aux fans en 20e année de formation.
J'ai écrit la grammaire de base de Python dans Jupyter Lab
J'ai écrit le fonctionnement de base de Seaborn dans Jupyter Lab
Ce que je suis content d'avoir étudié en 2015 et ce que je pense apprendre en 2016
Traitez les fichiers du dossier dans l'ordre avec le script shell
J'ai écrit le fonctionnement de base de Numpy dans Jupyter Lab.
J'ai écrit le fonctionnement de base de matplotlib dans Jupyter Lab
L'histoire de la création d'un bot de boîte à questions avec discord.py
J'ai essayé d'utiliser l'API Google avec Ruby et Python - Faites de la base de données une feuille de calcul et gérez-la avec Google Drive
Traitez le fichier gzip UNLOADed avec Redshift avec Python de Lambda, gzipez-le à nouveau et téléchargez-le sur S3
[Python] Le rôle de l'astérisque devant la variable. Divisez la valeur d'entrée et affectez-la à une variable
Quand j'ai coupé le répertoire pour UNIX Socket sous / var / run avec systemd, je suis resté coincé dans un piège et que faire
Connaissances minimales requises pour traiter les «angles» et les «coordonnées» dans Ruby + Dans quelle direction est M. B du point de vue de M. A? Algorithme
J'ai créé un bot LINE qui me dit le type et la force de Pokémon dans la région de Garal avec Heroku + Flask + PostgreSQL (Heroku Postgres)
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
Racler le calendrier de Hinatazaka 46 et le refléter dans Google Agenda
[Introduction à StyleGAN] J'ai joué avec "The Life of a Man" ♬
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
L'histoire de la création d'un pilote standard pour db avec python.
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai écrit le fonctionnement de base de Pandas dans Jupyter Lab (partie 1)
Je veux créer un fichier pip et le refléter dans le menu fixe
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV
J'ai étudié le comportement de la différence entre lien dur et lien symbolique
J'ai écrit le fonctionnement de base de Pandas dans Jupyter Lab (partie 2)
L'histoire de la création d'un module qui ignore le courrier avec python
J'ai créé un chat chat bot avec Tensor2Tensor et cette fois cela a fonctionné
Notez que je comprends l'algorithme du classificateur Naive Bayes. Et je l'ai écrit en Python.
J'ai créé un script POST pour créer un problème sur Github et l'enregistrer dans le projet
J'ai exécuté GhostScript avec python, divisé le PDF en pages et l'ai converti en image JPEG.
L'histoire de la création d'un outil pour charger une image avec Python ⇒ l'enregistrer sous un autre nom
Mettez à jour les données en les téléchargeant sur s3 d'aws avec une commande, et supprimez les données utilisées (en chemin)
[CleanArchitecture avec Python] Appliquez CleanArchitecture à une API simple étape par étape, et essayez de comprendre "quel type de changement est fort" dans la base de code.