Help us understand the problem. What is going on with this article?

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

More than 5 years have 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については開発が停滞しているように見えるので、使いたい人は全力でコミットするのが良さそう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away