# -*- coding: utf-8 -*- # 百家号 39 条视频数据归因分析:按题材分类汇总 + 互动率/点击率 + 输出 Excel 归因表 import sys import pandas as pd import openpyxl sys.stdout.reconfigure(encoding="utf-8") df = pd.read_excel(r"E:\Download\单篇数据.xlsx", sheet_name="data") df.columns = [str(c).strip() for c in df.columns] # 题材人工归类(基于标题与策略文档对照) CAT = { "大角羊IP(悬崖物理反杀)": ["悬崖冰桥上的极限遭遇战", "大角羊被狼群逼入绝境,竟靠这一招", "大角羊卡住悬崖窄道", "悬崖之巅的生死角逐", "罕见野外抓拍:大角羊", "绝地反击!大角羊引发落石"], "农家院保卫战(护崽情感)": ["千万别惹看家大鹅", "迷你黄鼠狼进院偷小鸡", "黄鼠狼进院偷袭小鸡"], "绝对防御(连XX都不敢惹)": ["为什么连鳄鱼都不敢惹河马", "为什么连狮子都忌惮非洲水牛", "连狮子都咬不穿的防御", "穿山甲偶遇小花豹", "连狮子都扎嘴的豪猪", "为什么说一猪二熊三老虎", "水牛轰然倒地"], "高山其他蹄类(物理系)": ["物理学不存在了", "盘羊高处蹬落碎冰", "雪羊占据陡坡高地", "绝壁上的", "野狼仰攻野牦牛", "大自然的天然溜冰场", "雪地追击变成花样滑冰"], "雪兔压强": ["受力面积的降维打击", "为什么雪兔在厚雪地里跑不陷脚"], "北极狐走位": ["饥饿北极熊雪地狂追北极狐", "急眼了!北极熊狂追小狐狸"], "水下题材": ["原来真有动物会用工具", "千万别和企鹅比灵活", "千万别惹"], "萌宠表情/搞笑": ["高空猛禽突然掠过,兔狲", "谁能拒绝一只戴着派对帽的小猫咪", "水豚被大鸟"], "其他(掠食视角/整蛊)": ["当北极熊在碎冰区发起冲锋", "大自然的", "雪原上的三方博弈"], } def cat_of(title): for c, keys in CAT.items(): if any(k in title for k in keys): return c return "未分类" df["题材"] = df["标题"].apply(cat_of) df["点击转化率"] = (df["阅读量"] / df["推荐量"]).round(3) df["点赞率%"] = (df["点赞量"] / df["阅读量"].clip(lower=1) * 100).round(2) g = df.groupby("题材").agg( 条数=("标题", "count"), 总阅读=("阅读量", "sum"), 平均阅读=("阅读量", "mean"), 最好成绩=("阅读量", "max"), 总推荐=("推荐量", "sum"), 点击转化率=("点击转化率", "mean"), 总点赞=("点赞量", "sum"), 总评论=("评论量", "sum"), ).round(1).sort_values("总阅读", ascending=False) print("=" * 88) print(g.to_string()) print("=" * 88) top5 = df.nlargest(5, "阅读量")[["标题", "发布时间", "阅读量", "推荐量", "点赞量", "题材"]] print("\nTOP5 爆款:") print(top5.to_string(index=False)) bottom5 = df.nsmallest(5, "阅读量")[["标题", "发布时间", "阅读量", "推荐量", "题材"]] print("\nBOTTOM5 扑街:") print(bottom5.to_string(index=False)) # 违规词扫描(文档明令禁止) banned = ["实拍", "抓拍", "监控拍", "彻底绝望", "陷入绝望", "最高境界"] hits = df[df["标题"].str.contains("|".join(banned))][["标题", "阅读量"]] print("\n违规词命中(文档红线,需改标题):") print(hits.to_string(index=False) if len(hits) else "无") # 输出归因表 Excel out = r"F:\AI\Obsidian Home\百家\单篇数据归因分析.xlsx" with pd.ExcelWriter(out, engine="xlsxwriter") as w: df.to_excel(w, sheet_name="逐条明细", index=False) g.reset_index().to_excel(w, sheet_name="题材汇总", index=False) top5.to_excel(w, sheet_name="TOP5爆款", index=False) print(f"\nsaved: {out}")