|
@@ -430,6 +430,34 @@ async def calculate_roi_metrics(
|
|
|
creative_df = pd.concat(merged_dfs, ignore_index=True)
|
|
creative_df = pd.concat(merged_dfs, ignore_index=True)
|
|
|
logger.info("加载 merged 数据: %d 行(%d 天)", len(creative_df), len(merged_dfs))
|
|
logger.info("加载 merged 数据: %d 行(%d 天)", len(creative_df), len(merged_dfs))
|
|
|
|
|
|
|
|
|
|
+ # ============================================================
|
|
|
|
|
+ # TEMP[2026-04-27]: 临时把"近 7 天累计消耗 == 0"的广告视为"已关闭",
|
|
|
|
|
+ # 在所有聚合/ROI 计算之前直接从 creative_df 中抛弃。
|
|
|
|
|
+ # 数学等价于 cost_7d_avg == 0(7 日总和=0 ⇔ 均值=0)。
|
|
|
|
|
+ # 删除本块即恢复原行为。merged CSV 不动,审计可追溯。
|
|
|
|
|
+ # ============================================================
|
|
|
|
|
+ _last_7_start = (end_dt - timedelta(days=6)).strftime("%Y%m%d")
|
|
|
|
|
+ _bizdate_str = creative_df["bizdate"].astype(str)
|
|
|
|
|
+ _recent7 = creative_df[
|
|
|
|
|
+ (_bizdate_str >= _last_7_start) & (_bizdate_str <= end_date_str)
|
|
|
|
|
+ ]
|
|
|
|
|
+ _zero_ads = (
|
|
|
|
|
+ _recent7.groupby("ad_id")["cost"].sum()
|
|
|
|
|
+ .pipe(lambda s: s[s.fillna(0) <= 0].index.tolist())
|
|
|
|
|
+ )
|
|
|
|
|
+ if _zero_ads:
|
|
|
|
|
+ _before = len(creative_df)
|
|
|
|
|
+ creative_df = creative_df[
|
|
|
|
|
+ ~creative_df["ad_id"].isin(_zero_ads)
|
|
|
|
|
+ ].reset_index(drop=True)
|
|
|
|
|
+ logger.info(
|
|
|
|
|
+ f"[TEMP 临时过滤] 抛弃 {len(_zero_ads)} 条广告"
|
|
|
|
|
+ f"(近 7 天累计消耗=0,视为已关闭),creative_df: {_before} → {len(creative_df)} 行"
|
|
|
|
|
+ )
|
|
|
|
|
+ # ============================================================
|
|
|
|
|
+ # TEMP END
|
|
|
|
|
+ # ============================================================
|
|
|
|
|
+
|
|
|
# Step 1: 聚合到广告级
|
|
# Step 1: 聚合到广告级
|
|
|
ad_df = _aggregate_creative_to_ad(creative_df)
|
|
ad_df = _aggregate_creative_to_ad(creative_df)
|
|
|
logger.info("聚合到广告级: %d 行", len(ad_df))
|
|
logger.info("聚合到广告级: %d 行", len(ad_df))
|