|
|
@@ -27,7 +27,7 @@ _SELECT_COLUMNS = [
|
|
|
"channel_level3",
|
|
|
"match_video_id",
|
|
|
"experiment_id",
|
|
|
- "rov",
|
|
|
+ "total_rov",
|
|
|
"category_name",
|
|
|
]
|
|
|
_SELECT_CLAUSE = ", ".join(_SELECT_COLUMNS)
|
|
|
@@ -68,9 +68,9 @@ class FetchDemands(DemandConst):
|
|
|
logger.warning("丢弃 %d 行非白名单账号, dt=%s", dropped, dt)
|
|
|
logger.info("白名单过滤后: %d 行", len(filtered))
|
|
|
|
|
|
- # 4. 按 (账号, 视频) 去重,取 rov 最高
|
|
|
+ # 4. 按 (账号, 视频) 去重,取 total_rov 最高
|
|
|
deduped = self._dedup_by_rov(filtered)
|
|
|
- logger.info("rov 去重后: %d 条 (账号+视频)", len(deduped))
|
|
|
+ logger.info("total_rov 去重后: %d 条 (账号+视频)", len(deduped))
|
|
|
|
|
|
# 5. 获取视频解构 + 展开搜索词
|
|
|
items = await self._explode_search_items(deduped)
|
|
|
@@ -148,20 +148,20 @@ class FetchDemands(DemandConst):
|
|
|
|
|
|
@staticmethod
|
|
|
def _dedup_by_rov(rows: List[Dict]) -> List[Dict]:
|
|
|
- """按 (channel_level3, match_video_id) 分组,保留 rov 最高的行
|
|
|
+ """按 (channel_level3, match_video_id) 分组,保留 total_rov 最高的行
|
|
|
|
|
|
同一账号的同一视频可能有多个 experiment_id,
|
|
|
- 取 rov 最高者作为该视频的代表 experiment_id。
|
|
|
+ 取 total_rov 最高者作为该视频的代表 experiment_id。
|
|
|
"""
|
|
|
groups: Dict[tuple, Dict] = {}
|
|
|
for r in rows:
|
|
|
key = (r.get("channel_level3") or "", r.get("match_video_id") or 0)
|
|
|
- rov = float(r.get("rov") or 0)
|
|
|
- if key not in groups or rov > float(groups[key].get("rov") or 0):
|
|
|
+ rov = float(r.get("total_rov") or 0)
|
|
|
+ if key not in groups or rov > float(groups[key].get("total_rov") or 0):
|
|
|
groups[key] = r
|
|
|
result = list(groups.values())
|
|
|
logger.info(
|
|
|
- "rov 去重: %d 行 → %d 条 (按 账号+视频 分组)",
|
|
|
+ "total_rov 去重: %d 行 → %d 条 (按 账号+视频 分组)",
|
|
|
len(rows), len(result),
|
|
|
)
|
|
|
return result
|