[python] 1つのjupyter notebookを複数の設定でhtml出力する

jupyter notebookをhtml出力することは,データ解析結果を他の人と共有する上でとても有用だ.そこで,同じノートブックの出力結果を複数のデータや設定で出力して共有することもままあるだろう.これを一回行うだけならば,あまり問題はないが,定期的に出力する必要に迫られると大変な手間とミスに繋がってしまう.

そこで,jupyter notebookを複数の設定でhtml出力することが出来るパッケージ,many_pynb を書いた.
使いやすさのために,notebook を二つ併用する形での使用方法となる.

インストールは,pip install many_pynb で可能.
repositoryは https://github.com/toshiakiasakura/many_pynb からアクセス可能.

仕様

output用のノートブックとcontroller用のノートブックの二つを用意する.
controller用のノートブックで設定ファイルを予め用意しておく.
output用のノートブックでは,temporally な特定の名前のファイルを読み込み設定を反映させる.
そして,outputノートブックを実行・出力を繰り返すというただそれだけ.

使い方,controller notebook

レポジトリーにあるexampleにあるノートブック2つでの説明を行う.

まず以下のモジュールをimportする.

import os
import glob
import json
import many_pynb

そして,configファイルを用意する.今回は,”(」・ω・)」うー!(/・ω・)/にゃー!” を回すごとに多くしていくことと,5個の出力の内,2つまでしか図を出力しないようにする.configファイルは, json形式で保存・読み取りする.

unya = "(」・ω・)」うー!(/・ω・)/にゃー!"
configs = []
for i in range(5):
    config = {}
    config["title"] = f"<h1>Settings {i}</h1>"
    config["text"] = unya + unya*(i*i*i)
    if i < 2:
        config["plot"] = True
    else:
        config["plot"] = False
    configs.append(config)

if not os.path.exists("./configs"):
    os.mkdir("./configs")
for i in range(5):
    with open(f"./configs/config{i}.json", "w" ) as f:
        json.dump(configs[i], f)

あとは,configsのパスと,ターゲットのjupyter notebookのファイルを指定すればok.

config_paths = sorted(glob.glob("./configs/*"))
target_file = "./nb_output.ipynb"
settings = many_pynb.setup(target_file, config_paths, )

このコードを回すと設定の確認として,ターゲットファイル,読み取りファイル,アウトプットファイルの一覧が出力される.

# many_pynb settings
- target file : nb_output.ipynb
- config files :
    ./configs/config0.json
    ./configs/config1.json
    ./configs/config2.json
    ./configs/config3.json
    ./configs/config4.json
- output files:
    ./many_pynb_output/nb_output_0.html
    ./many_pynb_output/nb_output_1.html
    ./many_pynb_output/nb_output_2.html
    ./many_pynb_output/nb_output_3.html
    ./many_pynb_output/nb_output_4.html

これで後は,many_pynb.run(settings) を回せば出力されていく.

使い方,output notebook

次は,outputに用いるnotebookの設定.

といっても,設定ファイルを読み取る以下のコードを入れて,その内容に従って出力したい内容を組み立てればok.

config = many_pynb.read_config()

今回は以下のようなコードにしてみる.

import many_pynb
from IPython.display import HTML
config = many_pynb.read_config()
HTML(config["title"])
print("Fever Time!!! ")
print(config["text"])
if config["plot"]:
    import matplotlib.pyplot as plt
    plt.plot([1,2,3,4,5], [1,4,9,16,25])

これで,controllerのnotebook側で,many_pynb.run(settings) を回せば順々にアウトプットを行ってくれる.

サンプルのアウトプットはこんな感じ.



次に,many_pynb.run(settings, exclude_code_block=True) で回した結果が以下のようになる.



終わり.
比較的簡単に使えることを願います.

----------雑感(`・ω・´)----------
これで大量のパターンで同様な解析結果を見せることが出来る!

コメント

タイトルとURLをコピーしました