赞
踩
# 基础库调用
import numpy as np
from numpy.random import seed
%matplotlib inline
import pandas as pd
import seaborn as sns
sns.set(style="darkgrid")
# Pyecharts绘图拓展包 from pyecharts.charts import * from pyecharts.components import Table from pyecharts import options as opts from pyecharts.commons.utils import JsCode import random import datetime from pyecharts.globals import CurrentConfig, OnlineHostType CurrentConfig.ONLINE_HOST = OnlineHostType.NOTEBOOK_HOST from pyecharts.charts import Bar bar = Bar() # 图片加载中文 from pylab import * mpl.rcParams['font.sans-serif'] = ['SimHei'] import matplotlib as mpl mpl.rcParams["font.family"] = "SimHei" # 添加中文字体名称 mpl.rcParams["axes.unicode_minus"]=False # 由于更改了字体导致显示不出负号,此设置用来正常显示负号 plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签 # 删除警告 import warnings warnings.filterwarnings('ignore')
# 数据的导入
train_data = pd.read_csv(r'movies_data.csv')
# 探究数据格式、大小
print('实验数据大小:',train_data.shape)
实验数据大小: (5659, 10)
# train的数据备份
data_Age = train_data.copy()
train_data.head(5)
Name | Year | Duration | Genre | Rating | Votes | Director | Actor 1 | Actor 2 | Actor 3 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | #Gadhvi (He thought he was Gandhi) | 2019 | 109 | Drama | 7.0 | 8 | Gaurav Bakshi | Rasika Dugal | Vivek Ghamande | Arvind Jangid |
1 | #Yaaram | 2019 | 110 | Comedy, Romance | 4.4 | 35 | Ovais Khan | Prateik | Ishita Raj | Siddhant Kapoor |
2 | ...Aur Pyaar Ho Gaya | 1997 | 147 | Comedy, Drama, Musical | 4.7 | 827 | Rahul Rawail | Bobby Deol | Aishwarya Rai Bachchan | Shammi Kapoor |
3 | ...Yahaan | 2005 | 142 | Drama, Romance, War | 7.4 | 1086 | Shoojit Sircar | Jimmy Sheirgill | Minissha Lamba | Yashpal Sharma |
4 | ?: A Question Mark | 2012 | 82 | Horror, Mystery, Thriller | 5.6 | 326 | Allyson Patel | Yash Dave | Muntazir Ahmad | Kiran Bhatia |
列标题 | 中文解释 | 含义 | 解析 |
---|---|---|---|
Name | 电影名称 | 电影的基本门面 | 可以了解电影基本内容和看点。 |
Year | 电影出品年份 | 代表电影的时代背景 | 随着技术和时代的不断发展, 大众审美变化越来越快,结合之前的分析,年份较早的电影容易获得高评分。 |
Duration | 电影时长 | 电影持续的总时间 | 一定程度上影响观影体验,时长太长或太短似乎都不太受大家喜爱,评分也会相应降低。 |
Genre | 电影类型 | 电影内容和展现手法的标签 | 电影贴上不同标签,以期满足不同人群的观影偏好, 进而获得高评分。 |
Rating | IMDb对应评分 | 影评界的标杆 | 为保证整体参选电影的评选质量,设计了严格的筛查和评定标准,为大众广泛接受和认可。 |
Votes | 参评人数 | 对所有评价的数据汇总 | 反映了大众的总体期待程度及电影热度。 |
Director | 电影导演 | 电影生产的组织者和领导者 | 知名导演的影响力有时甚至超过明星大牌,在进行评分时有一定的分数加成。 |
Actor 1 | 第一主演 | 领衔主演 | 一部优秀的影片离不开演员的演绎,“老戏骨”和 “小鲜肉”对于电影最终评分的作用明显不同。 |
Actor 2 | 第二主演 | 主要参演角色 | 但不具备领衔主演的广泛影响力。 |
Actor 3 | 第三主演 | 主要参演角色 | 但不具备领衔主演的广泛影响力。 |
列标题 | 深度分析 |
---|---|
Name | 表述内容往往浅尝辄止,没有更深度的内容说明,不具备简介一样的自然语言处理可分析性。 |
Year | 考虑到网站的时效性和时代的发展,往往年代较久远的电影数目相对会偏少,数据分析可能不具备普遍价值。 |
Duration | 电影本身对时长不设限,后期处理数据时可能会出现个别市场极短和极长的零星数据,影响可视化观感。 |
Genre | 电影类型可能会极其丰富,导致随其他变量共同分析时存在障碍,计划多选取较高频数和较多数据采集分析。 |
Rating | 具备较强价值,需要联合其他数据进行共同分析,其他多因素对其的影响因素分析在报告中较为关键。 |
Votes | 由于缺乏票房的数据,线上投票数目一定程度上决定了电影的整体热度,对后期人物分析也具有一定价值。 |
Director | 导演人数较多,且多数作品较少。但根据Karl Persson的IMDb分析,不需要设置频数门槛也能判断导演的作品价值。 |
Actor 1 | 具备一定影响评分和热度的意义。根据黄恋舒对明星和评价的影响分析,往往领衔第一顺位主演具备很高的分析价值。 |
Actor 2 | 作为主演之一具备一定的分析意义,但是连同第一主演的共同分析价值更高。 |
Actor 3 | 作为主演之一具备一定的分析意义,但是连同第一主演的共同分析价值更高。 |
# 输入思维导图数据与分层 data = [ {"name": "印度电影的IMDb数据分析", "children": [ {"name": "基本对象属性可视化", "children": [ {"name": "随年份变化的电影出品数"}, {"name": "电影的时长分布"}, {"name": "电影的类型分布"}, {"name": "电影的评分分布"}, {"name": "电影的参评人数分布"}, {"name": "电影的年份树状图可视化"}, {"name": "电影的参评人数树状图可视化"}, {"name": "电影的类型词云图可视化"}, {"name": "不同类型电影的时长分布"}, {"name": "导演与演员数目的对比"}, ]}, {"name": "市场反馈与趋势", "children": [ {"name": "年份和电影数目的自相关分析"}, {"name": "不同类型电影随年份变化的规律"}, {"name": "电影指导最多的二十个导演"}, {"name": "电影出演最多的二十个演员"}, {"name": "评分高的电影类型"}, {"name": "热度高的电影类型"}, {"name": "评分最高和热度最高的十个导演"}, {"name": "评分最高和热度最高的十个演员"}, ]}, {"name": "影响评分、热度的因素", "children": [ {"name": "年份、时长、参评人数对评分的影响"}, {"name": "年份、时长、评分对参评人数的影响"}, {"name": "不同类型电影的评分、热度分布"}, ]}, {"name": "近五年的印度电影市场分析", "children": [ {"name": "近五年印度电影热门类型"}, {"name": "近五年印度电影热门导演"}, {"name": "近五年印度电影热门演员"}, ]}, ], } ] # 导入树 tree = ( Tree() .add("",data=data,collapse_interval=3) ) tree.render_notebook()
# 以下六段代码展现六个基本属性的具体信息 # ↓↓下列代码格式基本遵守以下内容↓↓ # plt.subplot()子图的构造位置 # sns.distplot()核密度和直方图 # plt.title()标题 # plt.xlabel()x轴标题 # plt.ylabel()y轴标题 # plt.show()显示图 plt.figure(figsize=(20, 10)) # 图片显示大小 # Year plt.subplot(1,2,1) sns.distplot(train_data['Year'], color="#31BEFA") plt.title('随年份变化的电影出品数') plt.xlabel('年份') plt.ylabel('密度') # Duration plt.subplot(1,2,2) sns.distplot(train_data['Duration'], color="#31BEFA") plt.title('电影的时长分布') plt.xlabel('时长') plt.ylabel('密度') plt.show() plt.figure(figsize=(20, 20)) # Genre import collections plt.subplot(2,1,1) df = train_data.join(train_data['Genre'].str.split(', ',expand=True))# Genre分段 genre = pd.concat([df[0],df[1],df[2]])# 合并后分析 genre.value_counts().plot(kind='bar', color="#31BEFA")# genre的分类统计 plt.title('不同类型的电影数目') plt.xlabel('类型') plt.ylabel('密度') # Rating plt.subplot(2,2,3) sns.distplot(train_data['Rating'], color="#31BEFA") plt.title('电影的评分分布') plt.xlabel('评分') plt.ylabel('密度') # Votes plt.subplot(2,2,4) # 为显示清晰,把显示参评人数大于等于2000的部分 votes_data = train_data.drop(train_data[(train_data['Votes'] > 2000)].index) sns.distplot(votes_data['Votes'], color="#31BEFA") plt.title('电影的参评人数分布') plt.xlabel('参评人数') plt.ylabel('密度') plt.show()
import squarify # 新建df2储存Year,后设计分层 df2 = pd.DataFrame(train_data['Year']) c1 = df2[(df2>2015)].size c2 = df2[((df2<=2015) & (df2>2010))].size c3 = df2[((df2<=2010) & (df2>2005))].size c4 = df2[((df2<=2005) & (df2>2000))].size c5 = df2[((df2<=2000) & (df2>1990))].size c6 = df2[((df2<=1990) & (df2>1980))].size c7 = df2[((df2<=1980) & (df2>1960))].size c8 = df2[(df2<=1960)].size # 填写下标和数据 labels_2 = '2015-','2011-2015','2006-2010','2001-2005','1991-2000','1981-1990','1961-1980','before 1960' sizes_2 = [c1,c2,c3,c4,c5,c6,c7,c8] # 设置参数、输出图 colors = [plt.cm.Spectral(i/float(len(labels_2))) for i in range(len(labels_2))] plt.figure(figsize=(12,8), dpi= 80) squarify.plot(sizes=sizes_2, label=labels_2, color=colors, alpha=.8) plt.title('电影年份树状图') plt.axis('off') df_Year = pd.DataFrame(data = sizes_2,index = labels_2) plt.show()
import squarify # 新建df1储存Votes,后设计分层 df1 = pd.DataFrame(train_data['Votes']) b1 = df1[(df1["Votes"]>10000)].size b2 = df1[((df1["Votes"]<=10000) & (df1["Votes"]>1000))].size b3 = df1[((df1["Votes"]<=1000) & (df1["Votes"]>100))].size b4 = df1[((df1["Votes"]<=100) & (df1["Votes"]>50))].size b5 = df1[((df1["Votes"]<=50) & (df1["Votes"]>10))].size b6 = df1[(df1["Votes"]<=10)].size # 填写下标和数据 labels_1 = '>10000','1000-10000','100-1000','50-100','10-50','<=10' sizes_1 = [b1,b2,b3,b4,b5,b6] # 设置参数、输出图 colors = [plt.cm.Spectral(i/float(len(labels_1))) for i in range(len(labels_1))] plt.figure(figsize=(12,8), dpi= 80) squarify.plot(sizes=sizes_1, label=labels_1,color=colors, alpha=.8) plt.title('电影参评人数树状图') plt.axis('off') df_Votes = pd.DataFrame(data = sizes_1,index = labels_1) plt.show()
# 新建df储存Genre的分类数据,后合并列出统计数据
df = train_data.join(train_data['Genre'].str.split(', ',expand=True))
genre = pd.concat([df[0],df[1],df[2]])
print(genre.value_counts())
# 设计参数、输出词云图
words = [ ('Drama',3796),('Action' ,1686),('Romance' ,1380),('Comedy' ,1344),
('Crime' ,875),('Thriller' ,679),('Family' ,416),('Musical' ,412),
('Mystery' ,304),('Adventure' ,277),('Horror' ,202),('Fantasy' ,146),
('Biography' ,115),('History' ,99),('Music' ,53),('Documentary' ,48),
('Sport' ,40),('Animation' ,40),('War' ,33),('Sci-Fi' ,32),
('News' ,1),('Western' ,1)]
wc = (WordCloud(init_opts=opts.InitOpts(width='600px', height='400px')).add("", words))
wc.render_notebook()
Drama 3796 Action 1686 Romance 1380 Comedy 1344 Crime 875 Thriller 679 Family 416 Musical 412 Mystery 304 Adventure 277 Horror 202 Fantasy 146 Biography 115 History 99 Music 53 Documentary 48 Sport 40 Animation 40 War 33 Sci-Fi 32 Western 1 News 1 dtype: int64
# 设计、引入初始参数 plt.figure(figsize=(20, 10)) movies_gr = train_data genresList=set() # 分类Genre后合并 for s in movies_gr['Genre'].str.split(','): genresList=set().union(s,genresList) genresList=list(genresList) # 新建genresDf2 genresDf2=pd.DataFrame() for genre in genresList: genresDf2[genre]=movies_gr['Genre'].str.contains(genre).apply(lambda x :1 if x else 0) genresDf2['Duration']=movies_gr['Duration'] genresDf2=genresDf2.sort_index() # 对每个类型的电影按年份求和 genresDf2=genresDf2.groupby('Duration').sum() # 汇总各电影类型的总量 total2=genresDf2.sum().sort_values() total2=total2[-10:] # 设计下标输出折线图 genresDf2=genresDf2[['Drama','Action','Romance','Comedy','Crime','Thriller', 'Family','Musical','Mystery','Adventure']] genresDf2.plot(figsize=(12,5)) plt.title('不同类型电影的时长分布') plt.xlabel('时长') plt.ylabel('数目') plt.grid(True) plt.show()
<Figure size 1440x720 with 0 Axes>
# set集合取除重复项,计算不重复项的总数
set1 = set(train_data['Director'])
count1 = len(set1)*3
set2 = set(train_data['Actor 1'])
set3 = set(train_data['Actor 2'])
set4 = set(train_data['Actor 3'])
count2 = len(set2)+len(set3)+len(set4)
# 带入数据进行绘图
p2 = plt.bar(['Director * 3','Actor'], [count1,count2], label="rainfall", color="#31CEFA")
plt.title('导演与演员数目的对比')
plt.ylabel('数目')
plt.show()
# 导入分析库 import matplotlib.pyplot as plt import matplotlib.font_manager as fm from statsmodels.graphics.tsaplots import plot_acf, plot_pacf # 生成测试数据,模拟某商店营业额 data1 = train_data['Year'].value_counts().sort_index(ascending=True) # 绘制时序图 data1.plot() plt.title("年份和电影数目的自相关分析") plt.xlabel('年份') plt.ylabel('数目') plt.legend() # 绘制自相关图 plot_acf(data1) # 绘制偏自相关图 plot_pacf(data1) plt.show()
# 设计、引入初始参数 plt.figure(figsize=(20, 10)) movies_gr = train_data genresList=set() # 分类Genre后合并 for s in movies_gr['Genre'].str.split(','): genresList=set().union(s,genresList) genresList=list(genresList) #genresDF genresDf=pd.DataFrame() for genre in genresList: genresDf[genre]=movies_gr['Genre'].str.contains(genre).apply(lambda x :1 if x else 0) genresDf['Year']=movies_gr['Year'] genresDf=genresDf.sort_index() # 对每个类型的电影按年份求和 genresDf=genresDf.groupby('Year').sum() # 汇总各电影类型的总量 total=genresDf.sum().sort_values() total=total[-10:] # 设计下标输出折线图 genresDf=genresDf[['Drama','Action','Romance','Comedy','Crime','Thriller', 'Family','Musical','Mystery','Adventure']] genresDf.plot(figsize=(8,5)) plt.title('不同类型电影随年份变化的规律') plt.xlabel('年份') plt.ylabel('数目') plt.grid(True) plt.show()
<Figure size 1440x720 with 0 Axes>
# 导入数据,取前20项
direct_Data = train_data['Director'].value_counts()
direct1 = direct_Data[:20]
# 参数设置、绘图
direct1.plot.bar(figsize=(12,5), color="#31BEFA")
plt.title('电影指导最多的二十个导演')
plt.xlabel('导演名字')
plt.ylabel('数目')
plt.show()
# 导入数据,取前20项
Actor_Data = pd.concat([train_data['Actor 1'],train_data['Actor 2'],train_data['Actor 3']])# 合并
Actor = Actor_Data.value_counts()
actor1 = Actor[:20]
# 参数设置、绘图
actor1.plot.bar(figsize=(12,5), color="#31BEFA")
plt.title('电影出演最多的二十个演员')
plt.xlabel('演员名字')
plt.ylabel('数目')
plt.show()
# 构建一个新的dataframe,只需要类别和评分这两个特征 Genre_data = pd.DataFrame(columns = ['Genre','Rating']) # data.iterrows:使用迭代器的方式读取数据,返回数字索引(int)和每一行的数据(series) for i, row_data in train_data.iterrows(): # 使用split将genres分割 Genres = row_data['Genre'].split(', ') n_Genres = len(Genres) # 构建一个空字典,用以保存genre和rating的值 dict_obj = {} dict_obj['Rating'] = [row_data['Rating']] * n_Genres dict_obj['Genre'] = Genres # 将字典转为dataframe类型 Genre_df = pd.DataFrame(dict_obj) # DataFrame的append将genre_df的数据添加进genre_data Genre_data = Genre_data.append(Genre_df) # 按题材统计评分 Genre_Rating = Genre_data.groupby('Genre')['Rating'].mean() Genre_Rating = Genre_Rating.sort_values(ascending = True) plt.figure(figsize=(15.0, 10.0)) Genre_Rating.plot.bar(figsize=(12,5), color="#31BEFA") plt.title('评分高的电影类型') plt.xlabel('电影类型') plt.ylabel('参评人数') plt.show()
根据IMDb的评分标准:
加权平均分(WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C
R = 该电影的平均分
v = 该电影的总投票数
m = 列入前250所需要的最少票数(目前是1300票)
C = 数据库中所有电影的总平均分(目前是6.7)
# 构建一个新的dataframe,只需要类别和参评人数(热度)这两个特征 Genre_data = pd.DataFrame(columns = ['Genre','Votes']) # data.iterrows:使用迭代器的方式读取数据,返回数字索引(int)和每一行的数据(series) for i, row_data in train_data.iterrows(): # 使用split将genres分割 Genres = row_data['Genre'].split(', ') n_Genres = len(Genres) # 构建一个空字典,用以保存genre和votes的值 dict_obj = {} dict_obj['Votes'] = [row_data['Votes']] * n_Genres dict_obj['Genre'] = Genres # 将字典转为dataframe类型 Genre_df = pd.DataFrame(dict_obj) # DataFrame的append将genre_df的数据添加进genre_data Genre_data = Genre_data.append(Genre_df) # 按题材统计评分 Genre_data['Votes'] = Genre_data['Votes'].astype(float) Genre_Votes = Genre_data.groupby('Genre')['Votes'].mean() Genre_Votes = Genre_Votes.sort_values(ascending = True) plt.figure(figsize=(15.0, 10.0)) plt.title('热度高的电影类型') plt.xlabel('电影类型') plt.ylabel('参评人数') Genre_Votes.plot.bar(figsize=(12,5), color="#31BEFA") plt.show()
# 定义函数选取大于20部分 def topn(df,n=20): if df.shape[0]<n: # 如该分组少于20,返回None return None else: # 对每个组按投票数降序排序,取出前n行的票房,找出'Rating'列,进行求和 return df.groupby('Director')['Rating'].mean().sort_values(ascending=False)[:20] # 调用函数:按照导演分组,然后对每组数据应用函数topn函数,最终结果去除nan(即除去电影部数少于20的数据) train_data2 = train_data train_data2.groupby('Director').apply(topn).dropna() # 设计参数、绘制子图合集 plt.subplot(121) d2 = df.groupby('Director')['Rating'].mean().sort_values(ascending=False)[:10] d2.plot.bar(figsize=(12,5), color="#31BEFA") plt.title('评分最高的十个导演') plt.xlabel('导演名字') plt.ylabel('评分') plt.subplot(122) d3 = df.groupby('Director')['Votes'].mean().sort_values(ascending=False)[:10] d3.plot.bar(figsize=(12,5), color="#31BEFA") plt.title('热度最高的十个导演') plt.xlabel('导演名字') plt.ylabel('参评人数') plt.show()
# 构建一个新的dataframe,只需要演员和评分这两个特征 train_data['Actor'] = train_data.apply(lambda x:x['Actor 1']+","+x['Actor 2']+","+x['Actor 3'],axis=1) Actor_data = pd.DataFrame(columns = ['Actor','Rating']) # data.iterrows:使用迭代器的方式读取数据,返回数字索引(int)和每一行的数据(series) for i, row_data in train_data.iterrows(): # 使用split将Actor分割 Actors = row_data['Actor'].split(',') n_Actors = len(Actors) # 构建一个空字典,用以保存actor和rating的值 dict_obj = {} dict_obj['Rating'] = [row_data['Rating']] * n_Actors dict_obj['Actor'] = Actors # 将字典转为dataframe类型 Actor_df = pd.DataFrame(dict_obj) # DataFrame的append将Actor_data的数据添加进Actor_data Actor_data = Actor_data.append(Actor_df) # 按演员统计评分 Actor_Rating = Actor_data.groupby('Actor')['Rating'].mean() Actor_Rating = Actor_Rating.sort_values(ascending = True) # 设计参数、绘制子图 plt.subplot(121) plt.title('评分最高的十个演员') plt.xlabel('演员名字') plt.ylabel('评分') Actor_Rating.tail(10).plot.bar(color="#31BEFA") # 定义函数选取大于20部分 def topn(df,n=20): if df.shape[0]<n: #如该分组少于20,返回None return None else: #对每个组按投票数降序排序,取出前n行的票房,找出'Votes'列,进行求和 return df.groupby('Actor')['Votes'].mean().sort_values(ascending=False)[:20] #调用函数:按照演员分组,然后对每组数据应用函数topn函数,最终结果去除nan(即除去电影部数少于20的数据) train_data1 = train_data train_data1.groupby('Actor').apply(topn).dropna() # 设计参数、绘制子图 plt.subplot(122) d1 = train_data.groupby('Actor 1')['Votes'].mean().sort_values(ascending=False)[:10] d1.plot.bar(figsize=(12,5), color="#31BEFA") plt.title('热度最高的十个演员') plt.xlabel('演员名字') plt.ylabel('参评人数') plt.show()
train_data = train_data.fillna(-1)# 填充空值为-1
print(train_data.isnull().sum())# 观察是否缺失
Name 0
Year 0
Duration 0
Genre 0
Rating 0
Votes 0
Director 0
Actor 1 0
Actor 2 0
Actor 3 0
Actor 0
dtype: int64
train_data = train_data.drop(train_data[(train_data['Duration'] > 250)].index)
train_data = train_data.drop(train_data[(train_data['Votes'] > 10000)].index)
ax = sns.heatmap(train_data[['Name','Year','Duration','Rating','Votes','Director',
'Actor 1','Actor 2','Actor 3','Genre']].corr(),annot=True, fmt = '.3f', cmap = 'coolwarm');
ax.set_title("相关性热图");
# 设计参数、绘制子图合集 fig=plt.figure(figsize=(10,15)) plt.subplot(311) plt.plot(train_data['Year'],train_data['Rating'],'o', color="#31CECE") plt.title('年份与评分关系的散点图') plt.xlabel('年份') plt.ylabel('评分') plt.subplot(312) plt.plot(train_data['Duration'],train_data['Rating'],'o', color="#31CECE") plt.title('时长与评分关系的散点图') plt.xlabel('时长') plt.ylabel('评分') plt.subplot(313) plt.plot(train_data['Votes'],train_data['Rating'],'o', color="#31CECE") plt.title('参评人数与评分关系的散点图') plt.xlabel('参评人数') plt.ylabel('评分')
Text(0, 0.5, '评分')
# 设计参数、绘制子图合集 fig=plt.figure(figsize=(10,15)) plt.subplot(311) plt.plot(train_data['Year'],train_data['Votes'],'o', color="#31CECE") plt.title('年份与热度关系的散点图') plt.xlabel('年份') plt.ylabel('参评人数') plt.subplot(312) plt.plot(train_data['Duration'],train_data['Votes'],'o', color="#31CECE") plt.title('时长与热度关系的散点图') plt.xlabel('时长') plt.ylabel('参评人数') plt.subplot(313) plt.plot(train_data['Rating'],train_data['Votes'],'o', color="#31CECE") plt.title('评分与热度关系的散点图') plt.xlabel('评分') plt.ylabel('参评人数')
Text(0, 0.5, '参评人数')
# 设计参数 plt.figure(figsize=(12, 8)) # 新建df,区分Genre各类后合并 df = train_data['Genre'].str.split(', ',expand=True) df.columns = ['Genre1','Genre2','Genre3'] train_data = train_data.join(df) # 31CECE 青色 # FF6347 橘色 # FFD700 黄色 # 绘制子图合集 plt.subplot(221) plt.plot(train_data['Votes'][train_data['Genre1'] == 'Drama'],train_data['Rating'][train_data['Genre1'] == 'Drama'],'o', color="#31CECE") plt.plot(train_data['Votes'][train_data['Genre2'] == 'Drama'],train_data['Rating'][train_data['Genre2'] == 'Drama'],'o', color="#FF6347") plt.plot(train_data['Votes'][train_data['Genre3'] == 'Drama'],train_data['Rating'][train_data['Genre3'] == 'Drama'],'o', color="#FFD700") plt.title('剧情片的评分、热度分布') plt.subplot(222) plt.plot(train_data['Votes'][train_data['Genre1'] == 'Action'],train_data['Rating'][train_data['Genre1'] == 'Action'],'o', color="#31CECE") plt.plot(train_data['Votes'][train_data['Genre2'] == 'Action'],train_data['Rating'][train_data['Genre2'] == 'Action'],'o', color="#FF6347") plt.plot(train_data['Votes'][train_data['Genre3'] == 'Action'],train_data['Rating'][train_data['Genre3'] == 'Action'],'o', color="#FFD700") plt.title('动作片的评分、热度分布') plt.subplot(223) plt.plot(train_data['Votes'][train_data['Genre1'] == 'Romance'],train_data['Rating'][train_data['Genre1'] == 'Romance'],'o', color="#31CECE") plt.plot(train_data['Votes'][train_data['Genre2'] == 'Romance'],train_data['Rating'][train_data['Genre2'] == 'Romance'],'o', color="#FF6347") plt.plot(train_data['Votes'][train_data['Genre3'] == 'Romance'],train_data['Rating'][train_data['Genre3'] == 'Romance'],'o', color="#FFD700") plt.title('爱情片的评分、热度分布') plt.subplot(224) plt.plot(train_data['Votes'][train_data['Genre1'] == 'Comedy'],train_data['Rating'][train_data['Genre1'] == 'Comedy'],'o', color="#31CECE") plt.plot(train_data['Votes'][train_data['Genre2'] == 'Comedy'],train_data['Rating'][train_data['Genre2'] == 'Comedy'],'o', color="#FF6347") plt.plot(train_data['Votes'][train_data['Genre3'] == 'Comedy'],train_data['Rating'][train_data['Genre3'] == 'Comedy'],'o', color="#FFD700") plt.title('喜剧片的评分、热度分布') plt.show()
data_Age = data_Age.drop(data_Age[(data_Age['Year'] < 2017)].index)# 删除非近五年的数据
data_Age.reset_index(drop=True)# 重新排列索引
Name | Year | Duration | Genre | Rating | Votes | Director | Actor 1 | Actor 2 | Actor 3 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | #Gadhvi (He thought he was Gandhi) | 2019 | 109 | Drama | 7.0 | 8 | Gaurav Bakshi | Rasika Dugal | Vivek Ghamande | Arvind Jangid |
1 | #Yaaram | 2019 | 110 | Comedy, Romance | 4.4 | 35 | Ovais Khan | Prateik | Ishita Raj | Siddhant Kapoor |
2 | 102 Not Out | 2018 | 102 | Comedy, Drama | 7.4 | 6619 | Umesh Shukla | Amitabh Bachchan | Rishi Kapoor | Vijay Raaz |
3 | 12 O'Clock | 2021 | 105 | Horror, Thriller | 4.4 | 63 | Ram Gopal Varma | Mithun Chakraborty | Makrand Deshpande | Dalip Tahil |
4 | 127 B | 2017 | 116 | Comedy, Horror | 6.6 | 26 | Seshu Kmr | Mast Ali | Aziz Naser | Heena Shaik |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
838 | Yours Truly | 2018 | 84 | Drama | 5.9 | 102 | Sanjoy Nag | Soni Razdan | Aahana Kumra | Pankaj Tripathi |
839 | Yug the law of karma | 2021 | 75 | Action, Crime, Drama | 7.7 | 10 | Dilip Kumar | Vinod Kumar | Dilip Kumar | Saurav Bagga |
840 | Zero | 2018 | 164 | Comedy, Drama, Romance | 5.4 | 24784 | Aanand L. Rai | Shah Rukh Khan | Anushka Sharma | Katrina Kaif |
841 | Zindagi Tumse | 2019 | 120 | Family | 6.0 | 13 | Tariq Bhat | Sadhana Singh | Guddi Maruti | Rajesh Puri |
842 | Zoo | 2018 | 100 | Drama | 5.7 | 78 | Shlok Sharma | Shashank Arora | Prince Daniel | Shatakshi Gupta |
843 rows × 10 columns
# 构建一个新的dataframe,只需要类别和参评人数(热度)这两个特征 Genre_age = pd.DataFrame(columns = ['Genre','Votes']) # data.iterrows:使用迭代器的方式读取数据,返回数字索引(int)和每一行的数据(series) for i, row_data in data_Age.iterrows(): # 使用split将genres分割 Genres = row_data['Genre'].split(', ') n_Genres = len(Genres) # 构建一个空字典,用以保存genre和votes的值 dict_obj = {} dict_obj['Votes'] = [row_data['Votes']] * n_Genres dict_obj['Genre'] = Genres # 将字典转为dataframe类型 Genre_df = pd.DataFrame(dict_obj) # DataFrame的append将genre_df的数据添加进genre_data Genre_data = Genre_data.append(Genre_df) # 按题材统计评分 Genre_Rating = Genre_data.groupby('Genre')['Votes'].mean() Genre_Rating = Genre_Rating.sort_values(ascending = True) plt.figure(figsize=(15, 10)) Genre_Rating.plot.bar(figsize=(12,5), color="#31BEFA") plt.title('近五年热门五大类型') plt.xlabel('电影类型') plt.ylabel('参评人数') plt.show()
# 定义函数选取大于20部分 def topn(df,n=20): if df.shape[0]<n: #如该分组少于20,返回None return None else: #对每个组按投票数降序排序,取出前n行的票房,找出'Votes'列,进行求和 return df.groupby('Director')['Votes'].mean().sort_values(ascending=False)[:20] #调用函数:按照导演分组,然后对每组数据应用函数topn函数,最终结果去除nan(即除去电影部数少于20的数据) train_data1 = train_data train_data1.groupby('Director').apply(topn).dropna() # 设计参数、绘图 plt.figure(figsize=(15, 10)) d1 = train_data.groupby('Director')['Votes'].mean().sort_values(ascending=False)[:10] d1.plot.bar(figsize=(12,5), color="#31BEFA") plt.title('近五年热门导演') plt.xlabel('导演名字') plt.ylabel('参评人数') plt.show()
# 构建一个新的dataframe,只需要演员和评分这两个特征 data_Age['Actor'] = data_Age.apply(lambda x:x['Actor 1']+","+x['Actor 2']+","+x['Actor 3'],axis=1)#合并 Actor_data = pd.DataFrame(columns = ['Actor','Rating']) # 定义函数选取大于20部分 def topn(df,n=20): if df.shape[0]<n: #如该分组少于20,返回None return None else: #对每个组按投票数降序排序,取出前n行的票房,找出'Votes'列,进行求和 return df.groupby('Actor')['Votes'].mean().sort_values(ascending=False)[:20] #调用函数:按照导演分组,然后对每组数据应用函数topn函数,最终结果去除nan(即除去电影部数少于20的数据) train_data1 = train_data train_data1.groupby('Actor').apply(topn).dropna() # 设计参数、绘图 plt.figure(figsize=(15, 10)) d1 = train_data.groupby('Actor 1')['Votes'].mean().sort_values(ascending=False)[:10] d1.plot.bar(figsize=(12,5), color="#31BEFA") plt.title('近五年热门演员') plt.xlabel('演员名字') plt.ylabel('参评人数') plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。