[PYTHON] Exécutez pandas-highcharts display_charts dans un environnement autre que jupyter

Contexte

Il semble que les personnes qui analysent des données utilisent souvent jupyter. Peut-être que Python seul n'est pas bon pour dessiner immédiatement des données sous forme de graphique, donc je pense que cela se fait sur le navigateur. Cependant, les méthodes liées à l'affichage (dessin html) telles que l'affichage sont propres à jupyter et ne peuvent pas être exécutées dans d'autres environnements. Même si vous vous référez à l'article d'analyse de données de Qiita, s'il s'agit d'un article de l'environnement Jupyter, cela peut ne pas fonctionner correctement si l'environnement de dessin est votre propre environnement. Cette fois, j'ai fait un article car il fallait voir le graphe affiché par pandas-highcharts depuis l'environnement pycharm.

Méthode

J'ai fait la fonction suivante en me référant au code source de pandas-highcharts. Puisque display_charts de pandas-highcharts a été défini pour afficher par retour, la valeur de retour sera None. Juste avant cela, j'ai l'impression de l'intégrer dans un modèle html et de revenir. (référence) https://github.com/gtnx/pandas-highcharts/blob/master/pandas_highcharts/display.py

def my_display_charts(df, chart_type="default", render_to=None, **kwargs):
    from pandas_highcharts.core import serialize
    from pandas_highcharts.display import _generate_div_id_chart
    if chart_type not in ("default", "stock"):
        raise ValueError("Wrong chart_type: accept 'default' or 'stock'.")
    chart_id = render_to if render_to is not None else _generate_div_id_chart()
    json_data = serialize(df, render_to=chart_id, chart_type=chart_type, **kwargs)

    content = """
    <div id="{chart_id}"</div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/highcharts/8.1.1/highstock.min.js"></script>
    <script type="text/javascript">{data}</script>
    """

    html = """
    <!DOCTYPE html>
    <html lang="ja">
    <head>
        <title>My Result</title>
    </head>
    <body>
        {content}
    </body>
    </html>
    """
    return html.format(content=content.format(chart_id=chart_id, data=json_data))

L'utilisation est comme ça.

import pandas as pd
import webbrowser
import os

def my_display_charts(df, chart_type="default", render_to=None, **kwargs):
    from pandas_highcharts.core import serialize
    from pandas_highcharts.display import _generate_div_id_chart
    if chart_type not in ("default", "stock"):
        raise ValueError("Wrong chart_type: accept 'default' or 'stock'.")
    chart_id = render_to if render_to is not None else _generate_div_id_chart()
    json_data = serialize(df, render_to=chart_id, chart_type=chart_type, **kwargs)

    content = """
    <div id="{chart_id}"</div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/highcharts/8.1.1/highstock.min.js"></script>
    <script type="text/javascript">{data}</script>
    """

    html = """
    <!DOCTYPE html>
    <html lang="ja">
    <head>
        <title>My Result</title>
    </head>
    <body>
        {content}
    </body>
    </html>
    """
    return html.format(content=content.format(chart_id=chart_id, data=json_data))

df = pd.DataFrame([1, 2, 3, 5, 4], index=[list('abcde')])
html_data = my_display_charts(df, chart_type="stock", title="Mt Result", figsize=(640, 480), grid=True)
path = 'index.html'

with open(path, mode='w') as f:
    f.write(html_data)

webbrowser.open_new_tab('file:///' + os.getcwd() + '/' + path_w)

J'espère qu'il sera dessiné comme ceci dans le navigateur par défaut de votre PC. C'est ennuyeux que le navigateur s'ouvre à chaque fois, mais je peux le voir pour le moment. Le graphique est gênant car il s'agit d'un Dataframe correctement généré.

コメント 2020-06-10 204410.png

Considération

Pourquoi l'axe horizontal est-il l'horodatage par défaut? Ce serait génial si l'élément html pouvait être passé au navigateur Web sous forme de chaîne de caractères, mais apparemment, il n'y a qu'un moyen de passer le chemin, donc cette fois je l'ai écrit sous la forme index.html. De la même manière, IPython.display et python-higchart peuvent être affichés de la même manière tant que l'élément html peut être extrait. Cette fois, je n'ai eu qu'à charger highstock.min.js, mais dans certains cas, highchart.js peut également être nécessaire. Quant à highstock.min.js, je ne savais pas où se trouvait la formule, alors je l'ai apportée de ce qui suit. https://cdnjs.com/libraries/highcharts

Cliquez ici pour la page officielle https://www.highcharts.com/

Recommended Posts

Exécutez pandas-highcharts display_charts dans un environnement autre que jupyter
Exécuter eclipse dans un environnement Docker (noVNC)
Création d'un environnement pour Anaconda et Jupyter
Apprenez le machine learning à tout moment et en tout lieu dans l'environnement Jupyter Notebook à la demande
Utilisez tensorflow dans un environnement sans racine
Créer et exécuter la configuration d'embulk dans Jupyter
Créer un environnement virtuel dans un environnement Anaconda
Installez le package dans un environnement hors ligne
Envoyer un e-mail avec un utilisateur autre que EMAIL_HOST_USER écrit dans les paramètres de django
Exécutez PIFuHD dans l'environnement Windows + Anaconda + Git Bash
Créer un environnement qui utilise Python avec Eclipse
Spécification du navigateur Jupyter Notebook dans un environnement Windows
Installez le package python dans un environnement hors ligne
Installez LightGBM dans l'environnement virtualenv OSX