为更好地提供数据支持的电影制作依据,要求大家以TMDB 5000 Movie Dataset数据集为研究对象,完成以下数据可视化任务:2012-2016年平均评分前十的电影类型。
此题与15周课堂小测1、14周作业类似
python 第15周课堂小测 1. 2000-2016年产量前十电影类型的平均利润。-CSDN博客https://blog.csdn.net/weixin_73122330/article/details/135129889?spm=1001.2014.3001.550114周 2000-2016年期间产量最高五家电影公司出产电影的平均评分-CSDN博客https://blog.csdn.net/weixin_73122330/article/details/135139528?spm=1001.2014.3001.5501
import pandas as pd
import matplotlib.pyplot as plt # 导入绘图库
import matplotlib as mpl
import warnings
# 忽略警告。pandas很多时候会弹出警告,说某条命令即将在新版本中过期,建议换用新命令。如不想看到警告信息,可用此设置忽略
warnings.filterwarnings('ignore')
# 读取数据
df = pd.read_excel('预处理后的数据1.xlsx')
df.dropna(inplace=True)
#筛选出2012年到2016年且平均评分大于0的数据 预处理时已完成
df = df[(df['year'] >= 2012)&(df['year'] <= 2016)&df['vote_average'] > 0]
df.reset_index(inplace=True)
#df数据内容显示
# 建立genres列表,提取电影的类型
genres_set = set()
for genre in df['genres'].str.split('|'):
for item in genre:
genres_set.add(item)
genres_list = list(genres_set)
genresdf = pd.DataFrame({'genre':[],'average_score':[]})
for genre in genres_list:
score = 0;n = 0;average_score = 0
for i in range(0,df.shape[0]):
if genre in df.loc[i,'genres']:
score = score + float(df.loc[i,'vote_average'])
n = n + 1
average_score = round(score/n,2)
genresdf = pd.concat([genresdf,pd.DataFrame({'genre':[genre],'average_score':[average_score]})],
ignore_index = True)
print(genre,n)
genresdf.sort_values(by = 'average_score',ascending=False,inplace=True)
genresdf.reset_index(inplace=True)
#genresdf.to_excel('各类型电影平均分_1.xlsx')
#genre 每个电影类型对应的数量
History 34 TV Movie 4 War 20 Foreign 1 Documentary 27 Western 13 Science Fiction 114 Fantasy 79 Thriller 265 Horror 127 Action 235 Crime 123 Comedy 285 Family 86 Mystery 53 Animation 61 Romance 120 Adventure 156 Drama 417 Music 36
colors = ['#FF0000','#ff1493','#00BFFF','#9932CC','#0000CD','#FFD700','#FF4500','#00FA9A',
'#191970','#006400']
#设置大小 像素
plt.figure(figsize=(12,8),dpi=100)
#设置中文显示
mpl.rcParams['font.family'] = 'SimHei'
plt.style.use('ggplot')
#绘制柱形图 设置柱条的宽度和颜色
plt.barh(genresdf['genre'][9::-1],genresdf['average_score'][9::-1],height=0.6,color=colors[::-1])
plt.xlabel('平均评分',fontsize=12)
plt.ylabel('电影类型',fontsize=12,color='red')
for i in reversed(range(0,10)):
plt.text(genresdf.loc[i,'average_score']+0.2,genresdf.loc[i,'genre'],
'{}'.format(genresdf.loc[i,'average_score']),ha='center',fontsize=12)
plt.title('2012-2016年平均评分最高的电影类型Top10',fontsize=18,x=0.5,y=1.05)
plt.savefig('9周课后T2_2012-2016平均评分前十电影类型.png')
plt.show()
#图像效果显示