pandas-highcharts의 display_charts를 jupyter 이외의 환경에서 실행

배경



데이터 해석 등을 하는 사람은 자주 jupyter를 사용하는 것 같네요.
아마 데이터를 즉각적으로 그래프로 하여 그리는, 같은 것은 Python 단체로는 서투르기 때문에, 브라우저상에서 하고 있다고 생각합니다.
그러나, display 등의 표시(html 드로잉) 관계의 메소드는, jupyter 특유의 것이며, 다른 환경에서는 실행할 수 없습니다.
Qiita의 데이터 해석 기사등을 참고로 해도, jupyter의 환경의 기사라면, 묘화 주위가 자신의 환경이라고 잘 되지 않거나 합니다.
이번에는 pandas-highcharts로 표시하는 그래프를 pycharm 환경에서 볼 필요가 있었기 때문에 기사화했습니다.

*2020/06/19 실수로 움직이지 않는 것을 공개하고 있었습니다. 수정하겠습니다.

방법



pandas-highcharts의 소스 코드를 참고로 다음과 같은 함수를 만들었습니다.
pandas-highcharts의 display_charts는 return에서 display로 되어 있기 때문에 반환값은 None이 됩니다. 그 한 걸음 앞에서 html 템플릿에 묻혀 리턴하고있는 느낌입니다.
(참고)
htps : // 기주 b. 이 m/gtx/panda s-high rts/bぉb/마s r/panda s_high rts/ぢspぁy. py
def my_display_charts(df, chart_type="default", render_to=None, **kwargs):
    from pandas_highcharts.core import serialize
    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 "chart_idXXXXXXXX"
    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))

사용법은 이런 느낌입니다.
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)


잘하면 자신의 PC의 기본 브라우저에서 이런 식으로 그려집니다.
매번 브라우저가 열리는 것이 대단하지만, 우선 볼 수 있습니다.
적당하게 생성한 Dataframe이므로 그래프가 까다롭군요.



고찰



가로축이 디폴트로 타임 스탬프인 것은 왜일까.
webbrowser에 문자열 그대로 html 요소를 전달할 수 있으면 최고이지만, 아무래도 경로를 전달하는 방법밖에 없는 것 같기 때문에 이번에는 한 번 index.html로 내보내고 있다.
같은 요령으로, IPython.display나 python-higchart등도, html 요소마저 빼낼 수 있으면(듯이) 브라우저 표시할 수 있다.
이번에는 highstock.min.js만 읽어야 했지만, 경우에 따라서는 highchart.js라든지 필요할지도 모른다.
highstock.min.js에 관해서는 공식이 어디에 있는지 모르기 때문에 아래에서 가져왔다.
htps // cd js. 코 m / ぃ b 라리 s / 히 gh rts

공식 페이지는 이쪽
htps //w w. 히 gh rts. 코m/

좋은 웹페이지 즐겨찾기