競賽紀錄

【2021 Shopee Code League】解題紀錄|Week1:Multi-Channel Contact Problem

green grass field near trees and building

以下用中文解釋題意和解題思考過程,若有誤、更優解等建議,歡迎留言或私訊

本週題意

基本上希望的目的是,將聯繫蝦皮客服的用戶進行 unify(歸一化),方便計算客服流程的總聯繫次數。
由於用戶會用不同信件、手機、基於不同訂單向客服反應意見,但實際上他們背後是同一位用戶。
*同一用戶定義:信箱一致 or 電話一致

期望提交格式

技術學習點

multiprocessing 多進程模組 Pool

資料描述

原檔提供 JSON 格式,包含屬性 = {客服單號, 訂單編號, 信箱, 電話, 聯繫次數}

處理邏輯

  1. 訂單編號必定隸屬單一用戶,先分別以 訂單編號、信箱、電話 aggregate 出同一人的客服紀錄編號
  2. 再根據以訂單編號聚合的客服紀錄,搜尋同時出現在 信箱、電話聚合紀錄的訂單編號
  3. 將所有客服紀錄編號去除重複、由小到大排序
  4. 計算對應客服紀錄編號的聯繫次數總和,連同排序的編號更新

代碼簡示:

困難點

雖然已將查找速度優化至每個客服編號 0.18 秒,總共有 500000 筆資料,全部跑完需 25hr,需要再提升速率

解決方式

使用 multiprocessing 多進程模組 Pool,由於我以字典方式儲存處理結果,最後再對應回表即可,不考慮順序,因此調用其中速度較快的方式 imap_unordered,將資料切成數十段,分配到多個 process 平行處理。

代碼簡示:

好處

時間從 25hr 節省至 3~4hr 跑完所有資料。

壞處

由於 imap_unordered 方法會將 function return 的值緩存,內存大量消耗。

改善方向

  1. 當天由於17:00有事,未提交答案,且研究 multiprocessing 其實額外花的時間,加上跑完肯定來不及。
  2. 是否除了 groupby 後 apply function 做用戶統一的方式,還有更有效率的處理方法?

提供建議與支持

支持:至 Data Agent 資料探員 粉專按讚、分享

實質支持:請我喝杯咖啡

留下建議:於文章下方留言,或至 Data Agent 資料探員 粉專留言

%d 位部落客按了讚: