日々精進

新しく学んだことを書き留めていきます

Pandasで最頻値を計算する処理は非常に重い

以下のように、移動平均などを計算しようとしたらすごく時間がかかっていたので速くしようとした時の話。

    agg = sales[SALES_COUNT].astype("float32").shift(shift).rolling(window) \
        .agg(["mean", "max", "min", "std", lambda x: x.mode()[0]]) \
        .reset_index().set_index("seq_idx")
#2.3秒かかった

↑を↓のように書き換え、最頻値を計算しないようにしたら150倍ぐらい速くなった(!)

    agg = sales[SALES_COUNT].astype("float32").shift(shift).rolling(window) \
        .agg(["mean", "max", "min", "std"]) \
        .reset_index().set_index("seq_idx")
#0.015秒かかった

カスタム関数を使うと遅くなると言うが、ここまで違うとは。。 最頻値が必要な場合はDataFrameからndarrayを取り出してnumpyで処理した方が良いかも。