为更好地提供数据支持的电影制作依据,要求大家以TMDB 5000 Movie Dataset数据集为研究对象,使用Pycharts库完成以下数据可视化任务:2016年的总利润中,各电影类型所占的比例。当电影类型所占比例小于1%时,全部归到other类中。另外:利润=票房收入-预算。
思路:
1.提取出电影类型
2.计算每部电影有几种电影类型,一行为一部电影,看genres列中有几种类型
3.每部电影的利润÷每部电影的电影类型数量=每部电影的每种电影类型平均利润
4.按电影类型计算每种电影类型的总利润
5.计算每种电影类型所占百分比
6.用pyecharts画饼图
import pandas as pd
import pyecharts.options as opts
from pyecharts.charts import Pie
import warnings
warnings.filterwarnings('ignore')
df = pd.read_excel('第12周课内作业(预处理后的数据).xlsx')
#df.info()
df
#df内容显示
df.dropna(inplace=True)
#df = df[df['year'] == 2016] #预处理数据时已经有
df.reset_index(inplace=True)
#df['profit'] = df['revenue'] - df['budget'] #预处理数据时已经有
#df.info()
#建立genres列表,提取电影的类型
genres_set = set()
for genre in df['genres'].str.split('|'):
for item in genre:
genres_set.add(item)
genres_list = list(genres_set)
#查看genres_list
genres_list
#查看genres_list ['Family', 'History', 'Drama', 'Animation', 'Western', 'Romance', 'Fantasy', 'Adventure', 'Thriller', 'War', 'Science Fiction', 'Action', 'Music', 'Mystery', 'Crime', 'Comedy', 'Horror']
#初始化一个空列表
n = []
for i in range(0,df.shape[0]):
#df.shape[0]获取一维数组的长度 为104 即df的104行数据
n.append(len(df.loc[i,'genres'].split('|')))
#df.loc[i,'genres'].split('|') 选取df中第i行和'genres'列的元素,将该元素(一个以'|'分隔的字符串)分割成一个列表
#len(...)计算分割后得到列表的长度
#n.append(...)将计算得到的长度添加到列表n中
for genre in genres_list:
for i in range(0,df.shape[0]):
#遍历df的所有行 df.shape[0]返回df的行数104
if genre in df.loc[i,'genres']:
#判断从genres_list取出的电影类型是否在df的第i行的'genres'列中
df.loc[i,genre] = df.loc[i,'profit']/n[i]
#如果在,则df的第行的genre列的值为 第i行'profit'列的值÷该行电影类型数量n
#df.to_excel('profit2.xlsx')
#查看此时的df
#在df中选择列,列名在genres_list中,对选定的电影类型列进行求和,按降序排序返回一个新的series
profit_count = df.loc[:,genres_list].sum().sort_values(ascending = False,inplace = False)
#去掉小于或等于0的数据,上面显示最后两种类型数据小于0
profit_count = profit_count[profit_count>0]
#计算每个电影类型的总和的百分比:每个电影类型的值÷所有电影类型的值的总和
profit_perc_all = profit_count / profit_count.values.sum()
#创建一个新的series,包含大于或等于1%的百分比值
profit_perc_big = profit_perc_all[profit_perc_all >= 0.01]
#把小于百分之一的类型都加起来
other = profit_perc_all[profit_perc_all < 0.01].sum()
if other > 0:
profit_perc = pd.concat([profit_perc_big,pd.Series([other],index=['other'])])
else:
profit_perc = profit_perc_big
#每种电影类型占比
keys = [[profit_perc.index[i],round(profit_perc.values[i],4)]
#round(profit_perc.values[i],4) 保留4位小数
for i in range(len(profit_perc))]
#keys内容
keys
#keys内容
[['Action', 0.1803], ['Adventure', 0.1794], ['Comedy', 0.1066], ['Science Fiction', 0.1048], ['Fantasy', 0.0945], ['Family', 0.0902], ['Animation', 0.0663], ['Thriller', 0.0452], ['Drama', 0.043], ['Horror', 0.0399], ['Crime', 0.022], ['Romance', 0.0157], ['Mystery', 0.0116], ['other', 0.0007]]
#画pyecharts饼图
pie=(
Pie(init_opts=opts.InitOpts(width="1100px",height="550px"))
.add("",keys,center=["40%","60%"],radius=["40%","75%"],)
.set_global_opts(title_opts=opts.TitleOpts
(title="各种电影类型所占比例",
title_textstyle_opts=opts.TextStyleOpts(font_size=30)),
legend_opts=opts.LegendOpts(type_="scroll",
pos_left="80%",
orient="vertical"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
)
pie.render('12周课堂作业_2016总利润中各电影类型所占比例.html')
#饼图效果显示