# 基础库调用
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 pyechartsponents import Table
from pyecharts import options as opts
from pyechartsmons.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 *
Params['font.sans-serif'] = ['SimHei']
import matplotlib as mpl
Params["font.family"] = "SimHei" # 添加中文字体名称
Params["axes.unicode_minus"]=False # 由于更改了字体导致显示不出负号,此设置用来正常显示负号
Params['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 = py()
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)
)der_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 = [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 = [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'].ains(genre).apply(lambda x :1 if x else 0)
genresDf2['Duration']=movies_gr['Duration']
genresDf2=genresDf2.sort_index()
# 对每个类型的电影按年份求和
genresDf2upby('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('数目')
id(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
aphics.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'].ains(genre).apply(lambda x :1 if x else 0)
genresDf['Year']=movies_gr['Year']
genresDf=genresDf.sort_index()
# 对每个类型的电影按年份求和
genresDfupby('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('数目')
id(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_Genresdict_obj['Genre'] = Genres# 将字典转为dataframe类型Genre_df = pd.DataFrame(dict_obj)# DataFrame的append将genre_df的数据添加进genre_dataGenre_data = Genre_data.append(Genre_df)
# 按题材统计评分
Genre_Rating = upby('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_Genresdict_obj['Genre'] = Genres# 将字典转为dataframe类型Genre_df = pd.DataFrame(dict_obj)# DataFrame的append将genre_df的数据添加进genre_dataGenre_data = Genre_data.append(Genre_df)
# 按题材统计评分
Genre_data['Votes'] = Genre_data['Votes'].astype(float)
Genre_Votes = upby('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 Noneelse:# 对每个组按投票数降序排序,取出前n行的票房,找出'Rating'列,进行求和upby('Director')['Rating'].mean().sort_values(ascending=False)[:20]
# 调用函数:按照导演分组,然后对每组数据应用函数topn函数,最终结果去除nan(即除去电影部数少于20的数据)
train_data2 = train_data
upby('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_Actorsdict_obj['Actor'] = Actors# 将字典转为dataframe类型Actor_df = pd.DataFrame(dict_obj)# DataFrame的append将Actor_data的数据添加进Actor_dataActor_data = Actor_data.append(Actor_df)# 按演员统计评分
Actor_Rating = upby('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 Noneelse:#对每个组按投票数降序排序,取出前n行的票房,找出'Votes'列,进行求和upby('Actor')['Votes'].mean().sort_values(ascending=False)[:20]
#调用函数:按照演员分组,然后对每组数据应用函数topn函数,最终结果去除nan(即除去电影部数少于20的数据)
train_data1 = train_data
upby('Actor').apply(topn).dropna()# 设计参数、绘制子图
plt.subplot(122)
d1 = upby('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)# 删除非近五年的数据
set_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_Genresdict_obj['Genre'] = Genres# 将字典转为dataframe类型Genre_df = pd.DataFrame(dict_obj)# DataFrame的append将genre_df的数据添加进genre_dataGenre_data = Genre_data.append(Genre_df)
# 按题材统计评分
Genre_Rating = upby('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 Noneelse:#对每个组按投票数降序排序,取出前n行的票房,找出'Votes'列,进行求和upby('Director')['Votes'].mean().sort_values(ascending=False)[:20]
#调用函数:按照导演分组,然后对每组数据应用函数topn函数,最终结果去除nan(即除去电影部数少于20的数据)
train_data1 = train_data
upby('Director').apply(topn).dropna()# 设计参数、绘图
plt.figure(figsize=(15, 10))
d1 = upby('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 Noneelse:#对每个组按投票数降序排序,取出前n行的票房,找出'Votes'列,进行求和upby('Actor')['Votes'].mean().sort_values(ascending=False)[:20]
#调用函数:按照导演分组,然后对每组数据应用函数topn函数,最终结果去除nan(即除去电影部数少于20的数据)
train_data1 = train_data
upby('Actor').apply(topn).dropna()# 设计参数、绘图
plt.figure(figsize=(15, 10))
d1 = upby('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()
本文发布于:2024-02-01 13:16:57,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170676461836864.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |