【2021 Shopee Code League】解題紀錄|Week1:Multi-Channel Contact Problem
以下用中文解釋題意和解題思考過程,若有誤、更優解等建議,歡迎留言或私訊。
本週題意
基本上希望的目的是,將聯繫蝦皮客服的用戶進行 unify(歸一化),方便計算客服流程的總聯繫次數。
由於用戶會用不同信件、手機、基於不同訂單向客服反應意見,但實際上他們背後是同一位用戶。
*同一用戶定義:信箱一致 or 電話一致
期望提交格式
技術學習點
multiprocessing 多進程模組 Pool
資料描述
原檔提供 JSON 格式,包含屬性 = {客服單號, 訂單編號, 信箱, 電話, 聯繫次數}
處理邏輯
- 訂單編號必定隸屬單一用戶,先分別以 訂單編號、信箱、電話 aggregate 出同一人的客服紀錄編號
- 再根據以訂單編號聚合的客服紀錄,搜尋同時出現在 信箱、電話聚合紀錄的訂單編號
- 將所有客服紀錄編號去除重複、由小到大排序
- 計算對應客服紀錄編號的聯繫次數總和,連同排序的編號更新
代碼簡示:
<script src="https://gist.github.com/A-baoYang/f4231cca81b6d776c07338bd25db4d50.js"></script> <script src="https://gist.github.com/A-baoYang/5379aae0477dd2d39c2b7cf7e1d302e2.js"></script>困難點
雖然已將查找速度優化至每個客服編號 0.18 秒,總共有 500000 筆資料,全部跑完需 25hr,需要再提升速率
解決方式
使用 multiprocessing 多進程模組 Pool,由於我以字典方式儲存處理結果,最後再對應回表即可,不考慮順序,因此調用其中速度較快的方式 imap_unordered,將資料切成數十段,分配到多個 process 平行處理。
代碼簡示:
<script src="https://gist.github.com/A-baoYang/f55afc14b16b769d100da6e4bae706c1.js"></script>好處
時間從 25hr 節省至 3~4hr 跑完所有資料。
壞處
由於 imap_unordered 方法會將 function return 的值緩存,內存大量消耗。
改善方向
- 當天由於17:00有事,未提交答案,且研究 multiprocessing 其實額外花的時間,加上跑完肯定來不及。
- 是否除了 groupby 後 apply function 做用戶統一的方式,還有更有效率的處理方法?
提供建議與支持
支持:至 Data Agent 資料探員 粉專按讚、分享
實質支持:請我喝杯咖啡
留下建議:於文章下方留言,或至 Data Agent 資料探員 粉專留言