链接:https://pan.baidu.com/s/1RIxOxh-TFMey9sGvZLVuJg,提取码:bhh2。
coins:投硬币数
danmu:弹幕数
favorite:收藏数
likes:点赞数
replay:评论数
share:分享数
view:播放量
各字段数量:
df = df.dropna()
df.info()
共删除了19行数据,剩余50111行数据。
df = df.drop_duplicates()
df.info()
删除了1312行重复的数据,剩余数据量48799行。
df = df[['分区', 'author','date','coins','danmu','favorite','likes','replay','share','view']]
df.head()
构建模型
R:最近一次消费时间(最近一次消费到参考时间的间隔)
F:消费的频率(消费了多少次)
M:消费的金额 (总消费金额)
但RFM模型并不能评价视频的质量,所以在这里针对up主的视频信息构建了IFL模型,以评估视频的质量。
sc = df.loc[df['分区']=='科学科普']
so = df.loc[df['分区']=='社科人文']
ma = df.loc[df['分区']=='机械']
tec = df.loc[df['分区']=='野生技术协会']
mi = df.loc[df['分区']=='星海'] # 一般发布军事内容
car = df.loc[df['分区']=='汽车']
sc.info()
# 计算发布视频的次数
count = sc.groupby('author')['date'].count().reset_index()
count.columns =['author','times']
# 剔除掉发布视频少于5的up主
com_m = count[count['times']>5]
#com_m = pd.merge(count,I,on='author',how='inner')
com_m.info()
last = sc.groupby('author')['date'].max()
late = sc.groupby('author')['date'].min()
# 最晚发布日期与最早之间的天数/发布次数,保留整数,用date重新命名列
F =round((last-late).dt.days/sc.groupby('author')['date'].count()).reset_index()
F.columns =['author', 'F']
F = pd.merge(com_m, F,on='author', how='inner')
F.describe()
# 查找的一天内发布视频数大于5的人
F.loc[F['F'].idxmin()]
F = F.loc[F['F']>0]
F.describe()
# 构建I值
danmu = sc.groupby('author')['danmu'].sum()
replay = sc.groupby('author')['replay'].sum()
view = sc.groupby('author')['view'].sum()
count = sc.groupby('author')['date'].count()
I =round((danmu+replay)/view/count*100,2).reset_index() #
I.columns=['author','I']
F_I = pd.merge(F,I,on='author',how='inner')
F_I.head()
# 计算出点赞率计算出所有视频的点赞率
sc['L'] =(sc['likes']+sc['coins']*2+sc['favorite']*3)/sc['view']*100
sc.head()
# 构建L值
L =(sc.groupby('author')['L'].sum()/sc.groupby('author')['date'].count()).reset_index()
L.columns =['author', 'L']
IFL = pd.merge(F_I, L, on='author',how='inner')
IFL = IFL[['author', 'I','F','L']]
IFL.head()
I值,I代表了up主视频的平均评论率,这个值越大,就说明其视频越能使用户有话题,当I值越大时,分值越大。
F值表示视频的平均发布周期,我们当然想要经常看到,所以这个值越大时,分值越小。
L值表示发布视频的平均点赞率,S值越大时,质量越稳定,分值也就越大。I/S值根据四分位数打分,F值根据更新周期打分。
# bins参数代表我们按照什么区间进行分组
# labels和bins切分的数组前后呼应,给每个分组打标签
# right表示了右侧区间是开还是闭,即包不包括右边的数值,如果设置成False,就代表[0,30)
IFL['I_SCORE'] = pd.cut(IFL['I'], bins=[0,0.03,0.06,0.11,1000],
labels=[1,2,3,4], right=False).astype(float)
IFL['F_SCORE'] = pd.cut(IFL['F'], bins=[0,7,15,30,90,1000],
labels=[5,4,3,2,1], right=False).astype(float)
IFL['L_SCORE'] = pd.cut(IFL['L'], bins=[0,5.39,9.07,15.58,1000],
labels=[1,2,3,4], right=False).astype(float)
IFL.head()
# 1为大于均值 0为小于均值
IFL['I是否大于平均值'] =(IFL['I_SCORE'] > IFL['I_SCORE'].mean()) *1
IFL['F是否大于平均值'] =(IFL['F_SCORE'] > IFL['F_SCORE'].mean()) *1
IFL['L是否大于平均值'] =(IFL['L_SCORE'] > IFL['L_SCORE'].mean()) *1
IFL.head()
IFL['人群数值'] =(IFL['I是否大于平均值'] *100) +(IFL['F是否大于平均值'] *10) +(IFL['L是否大于平均值'] *1)
IFL.head()
cat = IFL['人群类型'].value_counts().reset_index()
cat['人数占比'] = cat['人群类型'] / cat['人群类型'].sum()
cat
各分区up主排行top15
high = IFL.loc[IFL['人群类型']=='高价值up主']
rank = high[['author','L','I','F']].sort_values('L',ascending=False)
rank.to_excel('rank.xlsx', sheet_name='科学科普',encoding='utf-8')
更多精彩推荐
☞15 岁黑进系统,发挑衅邮件意外获 Offer,不惑之年捐出全部财产,Twitter CEO 太牛了!
☞避坑!使用 Kubernetes 最易犯的 10 个错误
你点的每个“在看”,我都认真当成了喜欢