IPython Notebookのノートをバッチ処理化する

  • 19
    Like
  • 0
    Comment
More than 1 year has passed since last update.

IPython Notebook、インタラクティブなデータ分析、プログラミング環境として非常に便利。そしてヘビーに使っているとバッチ処理の様なコードも書いて実行したくなる。ノートを保存した時の.ipynbファイルを実行する方法をまとめていく。まずは2つ。

ipython nbconvertコマンドで.pyファイルを生成する

いつのまにかnbconvertがiPython本体に取り込まれていた。

ipython nbconvert mynote.ipynb --to=python

たとえば次の夜間バッチ処理的なノートをnbconvertにかけてみる。

スクリーンショット 2014-09-15 15.28.15.png

生成後のソースは次の通り、プロファイルを指定したとしても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については開発が停滞しているように見えるので、使いたい人は全力でコミットするのが良さそう。