何回もググるのが嫌になったので、メモしておく。
IPython Notebook を Markdown に変換する
JupyterLab のメニューから、File > Export Notebook As... > Markdown
matplotlib inline で図を出力している場合も、その図は自動的に png に変換され、markdown に埋め込まれている状態になっている。
この時は png も含めて全部 zip でダウンロードされる。
pandas の DataFrame を Markdown に変換するけど JupyterLab でも綺麗に出力する
pandas の to_markdown()
に tabulate が必要なので、先にインストールしておく。
import pandas as pd
from IPython.display import display, Markdown
df = pd.DataFrame(何かのデータ)
display(Markdown(df.to_markdown()))
JupyterLab では普通に DataFrame を出力したように見えるけど、
Markdown に変換してダウンロードしたファイルをみると、Markdown のテーブルになっている。
作られる Markdown のテーブルはデフォルトで PHP Markdown Extra って奴かな。to_markdown()
は tabulate にパラメータを渡せて、tabulate は物凄く高機能なんで、やろうとすればどんなことでも出来るだろう。(JupyterLab が対応しているかは別)
普通に使う分には、何も考えず to_markdown()
するだけで十分。
Markdown にいちいち値を手書きするのがメンドイので、値を参照して埋め込みたい
Jupyter Notebook には python markdown という便利プラグインがあったけど、JupyterLab には残念ながら対応してない。みんな怒っている。(みんなというのは語弊)
だから手書きしなきゃいけない。
import pandas as pd
from IPython.display import display, Markdown
df = pd.DataFrame(何かのデータ) # user_id というカラムがあるとする
display(Markdown(f'''
* データのサイズは {df.shape[0]} です
* ユーザーIDのユニーク数は {df.user_id.nunique()} です
'''))
Python の f-Strings は物凄い強力で、関数でも何でも評価してくれちゃうので、逆にこっちの方が便利かもしれない。
上の2つをまとめると
こんな関数を作っておけば更に便利かもしれない。(適当)
from typing import Union
import pandas as pd
from IPython.display import display, Markdown
def show_it(data: Union[str, pd.DataFrame]) -> None:
if isinstance(data, pd.DataFrame):
display(Markdown(data.to_markdown())
else:
display(Markdown(data.strip()))
return
Markdown から code block を取り除きたい
JupyterLab で変換した Markdown は code block がそのまま残されてるけど、レポート(PDF)にするには邪魔だったり、行の長さを考えなきゃいけなかったり、ページの切れ目を考えなきゃいけなかったりする。
いっそのこと、全部消しちゃえば良い。
JupyterLab の変換時に頑張ったり、pandoc の filter で頑張ったりも出来るだろうけど、sed で一発だ。
> sed -i.orig '/^```/,/^```/d' sample.md
一応 backup として元の Markdown を sample.md.orig
というファイル名で残す場合。未練が無い場合は -i
で良い。