はじめに
先日、pythonでデータの整形をする際、for分を回す場面があったのですが、予想以上に処理が重く6分程度かかるforを回していました。長い処理をさせると、フリーズしているのでないか不安になりますので、プログレスバーを表示させたいと思いました。
参考
手順
tqdm
モジュールを使用します。
from tqdm import tqdm
import time
for i in tqdm(range(365)):
# ここに処理を書く
# 下記のようなプログレスバーが表示される
# 55%|█████▌ | 202/365 [04:57<04:03, 1.50s/it]
下記でも同じことが実現できます。
for i in trange(365):
# ここに処理を書く
tarange
はtqdm(range(i))
の最適化されたインスタンスです。
forループでは要素と同時にインデックスを取得したい場合があります。enumerate
を使用する場合は、enumerate(tqdm(...))
と書きます。tqdm(enumerate(...))
ではないようです。
for i,j in enumerate(tqdm(range(100))): # iがenumerate、jがrange
# ここに処理を書く
ネストのループにも対応しています。
from tqdm import trange
from time import sleep
for i in trange(10, desc='1st loop'):
for j in trange(5, desc='2nd loop', leave=False):
for k in trange(100, desc='3nd loop'):
# ここに処理を書く
desc
はプログレスバーのプレフィックスです。leave
をTrueにするとループが終わるまでプログレスバーが進み続けます。
pandasのapply
にもプログレスバーを表示させることができます。
import pandas as pd
import numpy as np
from tqdm import tqdm
df = pd.DataFrame(np.random.randint(0, 100, (100000, 6)))
# Register `pandas.progress_apply` and `pandas.Series.map_apply` with `tqdm`
# (can use `tqdm_gui`, `tqdm_notebook`, optional kwargs, etc.)
tqdm.pandas(desc="my bar!")
# Now you can use `progress_apply` instead of `apply`
# and `progress_map` instead of `map`
df.progress_apply(lambda x: x**2)
# can also groupby:
# df.groupby(0).progress_apply(lambda x: x**2)
jupyter notebookを使用している場合は、グラフィカルなプログレスバーが表示されます。
from tqdm import tnrange, tqdm_notebook
from time import sleep
for i in tnrange(10, desc='1st loop'):
for j in tqdm_notebook(xrange(100), desc='2nd loop'):
sleep(0.01)