12周课堂作业 2016年的总利润中,各电影类型所占的比例。当电影类型所占比例小于1%时,全部归到other类中。另外:利润=票房收入-预算。

为更好地提供数据支持的电影制作依据,要求大家以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')

 #饼图效果显示

 饼图效果显示:12周课堂作业_2016总利润中各电影类型所占比例.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值