data_actor_top10 = data_actor[data_actor[‘电影名称’]==‘我和我的祖国’].groupby([‘电影id’,‘电影名称’]).head(10)
data_actor_top4 = pd.concat([data_actor_top4,data_actor_top10])
剔除外国演员
data_actor_top4[‘演员名字长度’] = data_actor_top4.apply(lambda x: len(x[‘演员’]),axis=1)
data_actor_top4 = data_actor_top4[(data_actor_top4[‘演员名字长度’]<=3)].copy()
data_actor_top4.drop(“演员名字长度”,axis = 1,inplace=True)
匹配
data = pd.merge(data,data_actor_top4,how=‘inner’,on=[‘电影id’,‘电影名称’,‘演员’])
然后,拆分每部电影的电影题材类型并进行转置,再汇总每个演员出演过的电影题材,排序后取前三个类型,作为演员的拿手题材。
拆分电影题材
data = data.join(data[“电影题材”].str.split(“,”,expand = True).stack().reset_index(level = 1,drop = True).rename(“题材”))
取每位演员最擅长的电影题材TOP3
data_type_actor = data[[‘电影id’,‘电影名称’,‘演员’,‘题材’]].drop_duplicates().groupby([‘演员’, ‘题材’]).agg({‘电影id’: ‘count’}).reset_index().sort_values([‘演员’,‘电影id’],ascending=False)
data_type_actor = data_type_actor.groupby([‘演员’]).head(3)
data_type_actor = data_type_actor.groupby([‘演员’])[‘题材’].apply(list).reset_index()
data_type_actor[‘题材’] = data_type_actor[‘题材’].apply(lambda x: ‘,’.join(str(i) for i in list(set(x)) if str(i) != ‘nan’))
data_type_actor.rename(columns={‘题材’: ‘演员_拿手题材’}, inplace=True)
data = pd.merge(data,data_type_actor,how=‘left’,on=[‘演员’])
四、数据分析
目前只有“演员总票房”和“影片平均评分”两个字段,可用作描述一个演员综合能力,所以需要衍生一些字段:
电影数量:统计演员主演过的影片数量;
大于10亿票房影片数量:汇总单部影片票房大于10亿的数量;
大于10亿票房影片计分:按照不同票房区间赋予分值,再汇总;
由于部分演员只出演过一部影片,属于单样本,若不剔除,会影响各项指标的数值分布。
##Python学习群 592539176
actor = result[[‘演员’,‘总票房’,‘用户评分’]].drop_duplicates()
衍生字段:平均票房、大于10亿票房影片、大于10亿票房影片计分
actor[‘用户评分’] = actor.apply(lambda x:0 if x[‘用户评分’]==‘暂无评分’ else x[‘用户评分’],axis=1)
actor[‘大于10亿票房影片数量’] = actor.apply(lambda x:1 if x[‘总票房’]>100000 else 0,axis=1)
按照票房赋予分值
def goal(x):
if x[‘总票房’]<=100000:
division_goal = 0
elif x[‘总票房’]<=200000:
division_goal = 1
elif x[‘总票房’] <= 300000:
division_goal = 2
elif x[‘总票房’] <= 400000:
division_goal = 3
elif x[‘总票房’] <= 500000:
division_goal = 4
else:
division_goal = 5
return division_goal
actor[‘大于10亿票房影片计分’] = actor.apply(goal,axis=1)
actor[‘电影数量’] = 1
actor[‘用户评分’] = pd.to_numeric(actor[‘用户评分’])
actor[‘大于10亿票房影片数量’] = pd.to_numeric(actor[‘大于10亿票房影片数量’])
actor[‘大于10亿票房影片计分’] = pd.to_numeric(actor[‘大于10亿票房影片计分’])
汇总
actor2 = actor.groupby([‘演员’]).agg({‘总票房’: ‘sum’,
‘大于10亿票房影片数量’: ‘sum’,
‘大于10亿票房影片计分’: ‘sum’,
‘电影数量’: ‘count’,
‘用户评分’:‘mean’,}).reset_index()
筛选影片数量大于1的行——只有一部影片的演员设为单样本,会影响标准化的结果
actor2 = actor2[actor2[‘电影数量’]>1].reset_index(drop=True)
最后,由于数值字段之间的量纲不同,需要进行标准化处理后才可以进行比较。“演员总票房”的高低是衡量一个演员能力的重要因素,这里笔者将“大于10亿票房影片数量”和“大于10亿票房影片计分”也作为两点重要因素,而“影片平均评分”和“电影数量”作为次要因素,最终标准化处理后的计算公式:
总分=演员总票房+大于10亿票房影片数量+大于10亿票房影片计分+0.5_影片平均评分+0.5_电影数量
这里笔者曾用K-means聚类算法将演员划分为四个集群,通过查看集群的分布情况后发现,划分结果与上述公式计算后的总分排名情况十分相似(比如,总分1-20名划分成集群1,21-50名划分成集群2),所以取消了用聚类算法的方式划分演员档次。
#Python学习群 592539176
#免费领取资料
复制一份副本
actor_copy = actor2.copy()
标准化处理
scaler = StandardScaler()
numeric_features = actor2.dtypes[actor2.dtypes != ‘object’].index
scaler.fit(actor2[numeric_features])
scaled = scaler.transform(actor2[numeric_features])
for i, col in enumerate(numeric_features):
actor2[col] = scaled[:, i]
划分演员档次:权重求和,根据分值排序
result = actor2.apply(lambda x: x[‘总票房’]+x[‘大于10亿票房影片数量’]+x[‘大于10亿票房影片计分’]+0.5x[‘电影数量’]+0.5x[‘用户评分’],axis=1)
# 划分演员档次——方法2:采用聚类算法,自动分成4个组
actor_model = actor2[[‘总票房’, ‘大于10亿票房影片数量’, ‘大于10亿票房影片计分’,‘电影数量’,‘用户评分’]].values
y_pred = KMeans(n_clusters=4, random_state=9).fit_predict(actor_model)
result2 = pd.Series(y_pred)
合并两种结果
model_actor_reuslt = pd.concat([actor_copy, result], axis=1)
model_actor_reuslt.rename(columns={0: ‘总分’},inplace=True)
model_actor_reuslt = model_actor_reuslt.sort_values(‘总分’,ascending=False).reset_index(drop=True)
五、数据描述
由于工作上经常使用BI工具tableau进行图表制作,因此下列的图表均用tableau绘制。其实pyecharts生成的图表也十分美观,为了方便这里就不用这个库画图了,有兴趣的小伙伴也可以了解下这个库。
先从整体上对电影的概况进行描述分析,才能更好地理解演员各项指标高低的优劣程度。首先,2011年至今,国内上映的影片总共是2129部,其中10亿票房以上的影片只有39部,占了总体的0.02%。
电影总数
目前国内影片最高票房已经到50-60亿之间,只有一部。40-50亿只有两部,大部分10亿以上的票房都集中在10-20亿之间。
电影票房区间
整体上,剧情、喜剧和爱情类型的电影题材拍得最多,而灾难类型的电影最少。从热门和冷门的电影题材中,很好地诠释了“报喜不报忧”这句成语,毕竟每个走进电影院的人都希望能轻松愉快地度过这两个小时。所以10亿以上票房的影片中,喜剧类型的电影题材反而排在了第一位。
电影题材
从电影上映时间轴中可以看出,整体上,17年之前上映的影片逐年增加,但在17年之后有所下降。而10亿以上票房的影片每年都在增加,侧面说明近几年国内电影影片质量有所上升。
电影上映时间轴
最后,将全部图表放到同一个仪表板中,可以很方便地看到10亿以上票房的影片分布情况,以及具体的影片名称。其中,2012年的《人在囧途之泰囧》是国内第一部10亿+票房影片,2015年的《捉妖记》是首部20亿+票房影片,2016年的《美人鱼》是首部30亿+票影片,2017年的《战狼2》是首部50亿+票房影片,而2019年的《流浪地球》和《哪吒之魔童降世》是唯一两部40亿+票房影片。从这个时间轴可以看出,自2015年起,每年最高票房都比前年多出10亿以上。
电影概况
感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!