1. ホーム
  2. パイソン

[解決済み】pandas操作中のプログレスインジケーター

2022-04-04 22:15:09

質問

1500万行を超えるデータフレームに対して定期的にpandasの操作を行いますが、特定の操作に対する進捗インジケータにアクセスできるようにしたいのですが、可能ですか?

pandasのsplit-apply-combine操作のテキストベースの進行状況インジケータは存在するのでしょうか?

例えば、こんな感じで。

df_users.groupby(['userID', 'requestDate']).apply(feature_rollup)

ここで feature_rollup は、多くのDFカラムを取り、様々な方法で新しいユーザーカラムを作成する、やや複雑な関数です。 これらの操作は大きなデータフレームでは時間がかかるので、iPythonノートブックにテキストベースの出力をして、進捗状況を更新することが可能かどうか知りたいです。

これまでのところ、Pythonのカノニカルループプログレスインジケータを試しましたが、意味のある方法でpandasと相互作用することはありません。

pandasのライブラリやドキュメントに、分割・適用・結合の進捗を知ることができる何か見落としがないかと期待しています。 単純な実装では、データフレームのサブセットの総数を見ることで、そのサブセットの上に apply 関数が動作しており、それらのサブセットの完了した割合で進捗を報告します。

これはもしかして、ライブラリに追加する必要があるのでしょうか?

どのように解決するのですか?

ご好評につき pandas でサポートしています。 tqdm ( pip install "tqdm>=4.9.0" ). 他の回答とは異なり、この は pandas の速度を著しく低下させます。 --以下はその例です。 DataFrameGroupBy.progress_apply :

import pandas as pd
import numpy as np
from tqdm import tqdm
# from tqdm.auto import tqdm  # for notebooks

# Create new `pandas` methods which use `tqdm` progress
# (can use tqdm_gui, optional kwargs, etc.)
tqdm.pandas()

df = pd.DataFrame(np.random.randint(0, int(1e8), (10000, 1000)))
# Now you can use `progress_apply` instead of `apply`
df.groupby(0).progress_apply(lambda x: x**2)

これがどのように機能するのか (そして、独自のコールバックのためにこれを修正する方法) に興味がある人のために のサンプルをGitHubで公開しています。 PyPIにある完全なドキュメント を実行するか、モジュールをインポートして help(tqdm) . その他にサポートされている関数は map , applymap , aggregate および transform .

EDIT


元の質問に直接答えるなら、置き換える。

df_users.groupby(['userID', 'requestDate']).apply(feature_rollup)

を使っています。

from tqdm import tqdm
tqdm.pandas()
df_users.groupby(['userID', 'requestDate']).progress_apply(feature_rollup)

注:tqdm <= v4.8。 : 4.8未満のtqdmのバージョンでは、代わりに tqdm.pandas() をする必要がありました。

from tqdm import tqdm, tqdm_pandas
tqdm_pandas(tqdm())