BCS - 廣告預算控制系統
目錄
一、技術一覽
二、開發功能特色介紹
三、技術詳細說明(流量預測、Pacing)
一、技術一覽
- 語言:Python
- 函式庫:Pandas, Scikit-learn, Google-cloud-bigquery, etc.
- 資料庫:Mysql, Redis, BigQuery
- 環境:AWS EC2 上 使用 Docker(透過 dockerfile 部署 Nginx, postgres, prefect).
- 監控:Prefect.
- CI/CD:Jenkins, Ansible.
- 版控:Git.
設計規範:
- 遵循 PEP 8 (Python Enhancement Proposal 8) 風格
二、開發功能特色介紹
- 每日流量預測
- 每分鐘 Pacing 計算
- 即時在線監控每一隻 Python 程式的執行狀況
- 有需求可即時在監控面板調整每支程式的執行時間,例如每5分/次。
- 程式錯誤時發訊息 & Mail 通知
三、技術詳細說明(流量預測、Pacing)
BCS 從 0 開始構建,作為控制廣告預算走速的核心系統,需要確保高可用及高穩定,否則會影響廣告投遞的目標流量可能未達標或超額,無論哪一種都會導致公司虧損。
1. 每日流量的預測:
從 BigQuery 取得資料後,接下來進行資料特徵工程,會針對每一個 廣告單元 的流量的24小時進行預測,同時需要分出週一到週日,因為平日與週末的流量以及顛峰時段的流量都會有所不同。
有些 廣告單元 因為資料不夠,無法進行預測,這邊則會選擇其它處理方式,例如以過往特定期間區間的平均,或者挪移到其它廣告單元來進行投遞(不預測這些廣告單元流量)。
預測的模型選擇隨機森林,預測方式初步參考「scikit-learn algorithm cheat-sheet」這張圖表,爾後微調,在流量大的廣告單元中,準確率可達85%以上,解決先前廣告投遞選擇 ASAP 的問題(廣告會在一天開始時迅速把流量投放完畢)。
2. 每分鐘 Pacing 的計算。
這部分會與 Go工程師&負責處理投遞廣告RD 一同開發完成。
Pacing 每分鐘執行/次(Pacing 論文的建議最佳值),每次執行 Pacing 時都會計算出 PTR(Pass Through Rate, 求通過率)。
PTR 會根據當前版位廣告曝光量來提高 或 降低,增高代表該則廣告的曝光率提高,反之亦然,舉例來說我已經計算出本日廣告曝光量需要滿足10,000,我需要投遞在指定期間的12小時內,則每小時投遞曝光量需要 833 個曝光量,假設第一個小時第1分鐘曝光量為0,則 PTR 在下一分鐘增加。
當 第30分鐘時,曝光量已達 833,則 PTR 降低,直到歸0意味著不再曝光,多餘的曝光量會在下一次重新計算。
3. 環境配置
透過 Dockerfiles 進行配置,nginx 設置反向代理到指定的 port 服務上。
Dockerfiles 處理 Run 指令,例如需要設定時區(TZ=Asia/Taipei)統一時區,同時部署對應環境。