0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JOINしてから条件絞り 条件絞りしてからJOIN

Posted at

はじめに

今回扱っていく内容はデータ分析をする上で大事な前処理の結合の部分について軽く触れていきたいと思います。またここでは私が学んだこと実践したことを書いていく記事なので間違いなどがある場合はご指摘の方よろしくお願い致します。

目次

1.はじめに
2.動作環境
3.”JOINしてから条件絞り”と”条件絞りしてからJOIN” 処理の順番でどう違う?
4.まとめ
5.参考文献

2. 動作環境

・ Mac OS 13.5
・ Jupyter lab(100本ノック)

3. ”JOINしてから条件絞り”と”条件絞りしてからJOIN” 処理の順番でどう違う?

私が前処理の勉強にお世話になっている「前処理大全」では”結合処理の前にデータを絞る方が良い”と記されています。では実際に処理時間などどう違っていくのか実践してみたいと思います。

結合してから条件を絞る
# 結合処理の後に絞るのは良くない
import time
start = time.time()
i=0
time_list =[]
for j in range(10):
    while i < 30:    
        merge_df = pd.merge(df_customer[['customer_id','gender_cd']],df_receipt[['customer_id','amount']],on='customer_id',how='outer')\
        .query('gender_cd == "1" & not customer_id.str.startswith("Z")').fillna(0)
        merge_df.groupby('customer_id').agg({'amount':'sum'}).reset_index().head(10)
        i += 1
    end = time.time()
    times = end - start
    time_list.append(times)
[t for t in time_list]  

上のコードは100本ノックのp-038から解いたコードになっています。
timeモジュールを使用して30回同じ処理をした時間を計算し、それを10回繰り返した処理です。
以下が出力結果で、およそ4.38秒だということがわかります。

出力結果
[4.38420844078064,
 4.384221792221069,
 4.384230613708496,
 4.384239196777344,
 4.3842480182647705,
 4.384257078170776,
 4.384265422821045,
 4.384274244308472,
 4.384310007095337,
 4.384319305419922]
条件を絞ってから結合する
import time
start = time.time()
i=0
time_list =[]
for j in range(10):
    while i < 30:
        df_amount_sum = df_receipt.groupby('customer_id').amount.sum().reset_index()

        df_tmp = df_customer. \
                    query('gender_cd == "1" and not customer_id.str.startswith("Z")', 
                          engine='python')

        pd.merge(df_tmp['customer_id'], df_amount_sum, 
                 how='left', on='customer_id').fillna(0).head(10)
        i += 1
    end = time.time()
    times = end - start
    time_list.append(times)
[t for t in time_list]   

次に上のコードでは条件を絞ってから結合している記述となっています。
条件は同じで、timeモジュールを使用して30回同じ処理をした時間を計算し、それを10回繰り返した処理です。
以下が出力結果で、およそ1.47秒だということがわかります。

出力結果
[1.4742095470428467,
 1.4742226600646973,
 1.4742317199707031,
 1.4742403030395508,
 1.4742488861083984,
 1.4742577075958252,
 1.474266767501831,
 1.4742751121520996,
 1.4742841720581055,
 1.4742929935455322]

4. まとめ

以上、実践結果より断然、条件を絞ってから結合する方が処理速度が速いことがわかりました。結合する場合はテーブルをなるべく小さくして、利用するメモリ量を少なくすることがポイントだと言えます。
もしデータ量が何万、何億となるビッグデータを扱っていく場合はすごく重要なことになっていくと思われます。

参考文献

  • 『前処理大全』
    • 著者: (本橋智光)
    • 出版年: (2019年5月29日)
    • 出版社: (株式会社技術評論社)
    • URL: 前処理大全
    • 概要: 本書は、データの前処理に関する包括的なガイドです。実用的なテクニックとベストプラクティスに焦点を当てています。前処理の重要性とその実践的な方法について深く探求しています。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?