IPython Notebook、インタラクティブなデータ分析、プログラミング環境として非常に便利。そしてヘビーに使っているとバッチ処理の様なコードも書いて実行したくなる。ノートを保存した時の.ipynbファイルを実行する方法をまとめていく。まずは2つ。
ipython nbconvertコマンドで.pyファイルを生成する
いつのまにかnbconvertがiPython本体に取り込まれていた。
ipython nbconvert mynote.ipynb --to=python
たとえば次の夜間バッチ処理的なノートをnbconvert
にかけてみる。
生成後のソースは次の通り、プロファイルを指定したとしてもstartupスクリプトが含まれないのに注意。またpylabモード前提のコードは実質動かせないだろう。
# coding: utf-8
# In[19]:
from pymongo import MongoClient
from datetime import timedelta, datetime
# In[26]:
# ローカルのMongoDBを処理する
con = MongoClient('localhost')
db = con['test']
# In[27]:
# 処理対象の日付 (0時以降に前日の集計を行なう)
process_date = datetime.now().date() - timedelta(days=1)
process_date
# In[28]:
xxx_count = 0
yyy_count = 0
with db.events.find({'time': {}}) as cur: # from-to指定は省略
for doc in cur:
pass
# なんらかの集計
# In[ ]:
# 集計結果の更新
db.daily_state.update({'date': process_date}, {'$set': 'values': {
'xxx_count': xxx_count,
'yyy_count': yyy_count
}})
runipyを使って、.ipynbファイルのまま実行する
paulgb/runipy
https://github.com/paulgb/runipy
.ipynbファイルをパースして中のPythonコードをipythonで順に実行していくというコマンド。
runipy mynote.ipynb
nbconvertと似ているが、実行後の結果をHTMLファイルとして出力できたりする。cronに仕込んで日次レポートを生成するといった用途に使える。コマンドラインからpythonスクリプト内で使う任意のパラメータも渡せる。しかし、IPythonのプロファイルを指定できないため、ipython_notebook_config.py
の設定を駆使している場合は使いづらい。
Profileが指定できないのは不便という事で、forkして--profile-dirを指定できるようにしたバージョンはプルリク済み。
hagino3000/runipy
https://github.com/hagino3000/runipy
runipyについては開発が停滞しているように見えるので、使いたい人は全力でコミットするのが良さそう。