题目:什么题材的电影烂片最多?
要求:
①
按照“类型”字段分类,筛选不同电影属于什么题材
②
整理数据,按照“题材”汇总,查看不同题材的烂片比例,并选取TOP20
③
将得到的题材烂片比例TOP20制作散点图 → 横坐标为“题材”类型,纵坐标为烂片比例,点大小为样本数量
用bokeh制图
按照烂片比例做降序排列
提示:
①
删除“类型”字段空值的数据
②
由于一个电影“类型”会有多个,这里需要将一个电影每个“类型”都识别出来,在统计某个题材时都需要计算,例如:
如果一个电影的类型为:“喜剧/爱情”,则在计算“喜剧”、“爱情”题材的烂片比例时,都需要将该电影算上
③
注意类型字段中,要删除空格字符
④
bokeh图设置点大小,这里通过 开方减小数据差距 → size =
count*0.5系数
筛选所有题材的类型
在完成第一步工作以后,我们得到了筛选烂片的依据是“豆瓣评分<4.3”,接下来首先是筛选出所有电影的题材,根据观察发现,有些电影的类型并不是单一的,如下图:
为了得到每一个电影的类型,而且不重复,需要用到去除空值、替换、切片和去重等函数,具体步骤、代码、结果如下:
- 新建一个列表typelst,用于存放电影的类型
- 单独拿出df数据中“类型”这一列的数据,使用notnull()方法去除空值,并将其转换为字符串
- 将字符串中左右的空格替换
- 将替换后的字符串通过“/”符号进行切片
- 通过for循环取出每一个电影经过切片后的元素序列
- 使用extend()函数将取出的元素序列在typelst列表的末尾一次性追加
- 使用set()函数,使typelst列表的元素变成一个无需不重复的序列(集合)
- 使用list()函数将处理后的集合变成列表,便于操作


查看不同题材烂片比例
现在数据中电影的题材已经全部就位,接下来是分析每一个电影题材,其所对应各电影总数和烂片的数量,得到烂片的比例,具体步骤、代码、结果如下:
- 首先使用notnull()函数,筛选出类型字段不为空的题材,将其赋给df_type
- 创建函数f1得到题材的名称、题材电影的总数、题材烂片的比例
- 创建一个函数f1(),参数设置为数据data和电影题材名称typei
- f1()函数内创建一个字典,用于存储“题材名称”、“题材计数”、“烂片比例”等信息
- 使用contains()函数筛选出每一种类型的电影,并存储在datai变量中
- 使用len()函数得到该题材电影的数量和该题材烂片的数量,得到烂片的比例,将其赋值给lp_pre_i
- 存储“题材名称”、“题材数量”和“烂片比例”并返回结果
- 创建一个列表lst_type_lp,用于存储f1()函数返回的结果
- 通过for循环依次从题材列表typelst中取出每一种题材,调用f1()函数,将结果存储在dici变量中
- 使用append()函数将dici追加在列表lst_type_lp中,然后将其转换为DataFrame格式的数据


烂片比例TOP20
得到所有的烂片比例结果后,我们首先通过排序筛选出烂片比例排名Top20的电影,然后使用Bokeh生成一个散点图,代码如下:
'''Bokeh 制图'''type_lp_top20['size'] = type_lp_top20['typecount']**0.5*2 #设置点的大小source = ColumnDataSource(type_lp_top20)#创建数据lst_type = type_lp_top20['typename'].tolist()hover = HoverTool(tooltips = [('数据量','@typecount'),('烂片比例','@type_lp_pre')])#设置标签内容output_file('pic1.html')p = figure(x_range = lst_type, plot_width = 900, plot_height = 500,title = '不同电影题材的烂片比例',tools = [hover, 'reset,xwheel_zoom,pan,crosshair,box_select'])p.circle(x = 'typename', y = 'type_lp_pre', source = source,size = 'size', line_color = 'black', line_dash = [6, 4],fill_color = 'red', fill_alpha = 0.5)show(p)
在有了排名Top20的数据以后,可以开始制图了,步骤如下:
- 题目要求,图中点的大小为样本数量,由于有些样本数值巨大,因此需要先将样本都适当的缩小,然后将其存储在数据中,字段为‘size’
- 此时作图的数据已经基本完成,我们需要其转化为ColumnDatasource格式的数据
- 题目要求横坐标为‘题材’类型,在此将type_lp_top20中的字段‘typename’取出以列表的形式存储,并将其赋值给lst_type
- 同时,为了方便查看每一个点的数据,我们需要为每一个点都设置标签内容
- 设置生成的Bokeh图的名称
- 开始作图,设置图的宽和高以及title信息,并设置tools数据,将x轴数据类型设置为‘题材’
- 生成散点图,设置点边线颜色为黑色,虚线显示,内部填充颜色为红色,透明度为0.5

