频道 900 条视频我按播放量排序,头部效应把我骗了
起因是想给一个 900 条视频的老频道做一次重新归档:哪些值得放进合集,哪些可以沉底。环境是本地 Windows + Python 3.11,用 yt-dlp 拉到一份 JSON,字段里带 view_count、like_count、upload_date、duration。数据量不大,900 条,一次就能拉完。
第一版我直接按 view_count 降序排,取前 10% 当“头部”。结果发现前 30 条几乎全是三四年前的视频,最近一年的内容一条都没进。这个结论明显不对——频道还在更新,播放量不该这么断崖。
于是我不再只看单条数字,而是先算每条视频的“日均播放”:
import json, datetime
items = json.load(open("videos.json", encoding="utf-8"))
for v in items:
d = datetime.datetime.strptime(v["upload_date"], "%Y%m%d")
age = max((datetime.datetime.now() - d).days, 1)
v["per_day"] = v["view_count"] / age
再按 per_day 排序,头部结构立刻变了:榜单里出现了大量最近三个月的内容,老视频只有少数几个还在持续涨。这一步的代价是要接受“老视频的存量优势被抹掉”,per_day 会偏向新内容,所以我又补了一列原始 view_count,排序时两个都看。
接着我把数据按 30 天分桶,看每个桶的 per_day 中位数:
from collections import defaultdict
buckets = defaultdict(list)
for v in items:
d = datetime.datetime.strptime(v["upload_date"], "%Y%m%d")
key = d.strftime("%Y-%m")
buckets[key].append(v["per_day"])
for k in sorted(buckets):
vals = sorted(buckets[k])
print(k, len(vals), vals[len(vals)//2])
这才看出真正的形状:频道在某个时间点之后,中位数明显下移,但个别视频还是能冲高。也就是说不是“内容整体变差”,而是“命中率变低了”。
这里会失效的地方:per_day 对刚发布几天的视频极不稳定,一条 2 天 5000 播放能算出 2500/天,直接排到第一;我最后把发布不足 14 天的视频单独标出来,不参与头部判断。另一个坑是 view_count 可能是 None,除法会直接报错,得先过滤。还有播放量本身受平台推荐影响,同一时期不同题材不可比,分桶只能看趋势,不能拿来横向排名。
我现在只把 per_day 当筛选器,不当结论。你们做频道归档时,是看累计播放还是看单位时间的播放?有没有更稳的归一化方式?
0
赞同度 100% · 0 条评论 · 1 阅读
0 条评论
还没有评论,写下第一条。