本記事は、Pythonの繰り返し処理for文で進捗状態を表示できる「tqdm」について紹介いたします。
私自身データサイエンティストとして業務を行なっていますが、Pythonでの処理が多く、かつデータ量も多かったりするので、そんなときにこの「tqdm」で進捗を表示しながら作業時間/処理時間の見立てを立てながら作業しています。
本記事も、tqdmで進捗が簡単に把握できるので、処理待ちの間に作成していたりします。
該当コード
まずはpip installを忘れずに
!pip install tqdm
# ノートブックでない場合は「!」を外してください
まずは初期設定関係
import pandas as pd
from tqdm import tqdm
df = pd.read_csv('data.csv')
シンプルな使い方
for index, row in tqdm(df.iterrows()): # 最も伝えたい行はこの行
if row["dummy"] == 0:
break
全体に対してどれくらいの進捗か把握したい時
for index, row in tqdm(df.iterrows(), total=len(df)): # 最も伝えたい行はこの行
if row["dummy"] == 0:
break
やむを得ずfor文の中にfor文を書く際に、変にならない方法
for some in tqdm(category_list, total=len(category_list)):
for index, row in tqdm(df.iterrows(), total=len(df), leave=False): # 最も伝えたい行はこの行
pass
解説
シンプルな処理、全体とそのうちどれだけ処理が進んだか、やむを得ずfor文の中にfor文を書く場合に汚くならないようにする書き方を紹介しました。
- シンプルな処理
一般的に、for文のinの後に続く変数(もしくは処理)をtqdm()で囲めば、基本的にOKです。長めのfor文を書く際は、tqdm()で囲む癖をつければ、意図せず時間がかかってしまうことが早くわかるようになります。そうすれば、処理を強制終了して、書き換えたりなどするのも良いでしょう。
とにかく、tqdm()で囲むように癖をつけると良いです。私自身の経験からもオススメします。
- tqdm()内に「total=len(df)」をつける
全体のlen(df)のうち、どれだけ処理をしたかを表示できます。注意点としては、totalが受け取れるのは数値です。そのため、本当に全体の数字でなくても受け取ってしまうことです。 totalに間違った数字を入れてしまうと、処理時間を読み違えてしまうので、注意が必要です。
- tqdmを使ったfor文を重ねる場合のテクニック
一番外側を除いて、内側のfor文のtqdmに「leave=False」を付けることで、内側の処理が1周したらそのプログレスバーが消えて、新たに進捗を表示するプログレスバーを表示します。
つまり、tqdmを使ったfor文を重ねた処理のプログレスバーを綺麗に表示することができるということです。
参照サイト
まとめ
以上となります。
冒頭でも書きましたが、for文の処理の進捗を可視化して、作業時間や処理時間の見立てをつけることは非常に重要です。数万行を越えてくるようなデータフレームに対して処理をする場合などは、必ずtqdmをつけて処理したほうが良いです。これは経験上良いと感じています。
一つのルーティンとして、tqdm()をつけるのであれば、本記事にて紹介している、オプション程度をつける程度で、スッキリかつ見やすいプログレスバーになると思います。
進捗を把握するだけならアレンジしたプログレスバーにしなくても良いと思い、上記の紹介に留めています。もっとオシャレにということであれば、参照記事などから覗いてみてください!
コメント