76 lines
3.8 KiB
Python
76 lines
3.8 KiB
Python
# -*- 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}")
|