题目:什么题材的电影烂片最多?

要求:

① 按照“类型”字段分类,筛选不同电影属于什么题材
② 整理数据,按照“题材”汇总,查看不同题材的烂片比例,并选取TOP20
③ 将得到的题材烂片比例TOP20制作散点图 → 横坐标为“题材”类型,纵坐标为烂片比例,点大小为样本数量
用bokeh制图
按照烂片比例做降序排列

提示:

① 删除“类型”字段空值的数据
② 由于一个电影“类型”会有多个,这里需要将一个电影每个“类型”都识别出来,在统计某个题材时都需要计算,例如:
如果一个电影的类型为:“喜剧/爱情”,则在计算“喜剧”、“爱情”题材的烂片比例时,都需要将该电影算上
③ 注意类型字段中,要删除空格字符
④ bokeh图设置点大小,这里通过 开方减小数据差距 → size = count*0.5系数


筛选所有题材的类型

在完成第一步工作以后,我们得到了筛选烂片的依据是“豆瓣评分<4.3”,接下来首先是筛选出所有电影的题材,根据观察发现,有些电影的类型并不是单一的,如下图:
图片.png
为了得到每一个电影的类型,而且不重复,需要用到去除空值、替换、切片和去重等函数,具体步骤、代码、结果如下:

  1. 新建一个列表typelst,用于存放电影的类型
  2. 单独拿出df数据中“类型”这一列的数据,使用notnull()方法去除空值,并将其转换为字符串
  3. 将字符串中左右的空格替换
  4. 将替换后的字符串通过“/”符号进行切片
  5. 通过for循环取出每一个电影经过切片后的元素序列
  6. 使用extend()函数将取出的元素序列在typelst列表的末尾一次性追加
  7. 使用set()函数,使typelst列表的元素变成一个无需不重复的序列(集合)
  8. 使用list()函数将处理后的集合变成列表,便于操作

图片.png
图片.png


查看不同题材烂片比例

现在数据中电影的题材已经全部就位,接下来是分析每一个电影题材,其所对应各电影总数和烂片的数量,得到烂片的比例,具体步骤、代码、结果如下:

  1. 首先使用notnull()函数,筛选出类型字段不为空的题材,将其赋给df_type
  2. 创建函数f1得到题材的名称、题材电影的总数、题材烂片的比例
    1. 创建一个函数f1(),参数设置为数据data和电影题材名称typei
    2. f1()函数内创建一个字典,用于存储“题材名称”、“题材计数”、“烂片比例”等信息
    3. 使用contains()函数筛选出每一种类型的电影,并存储在datai变量中
    4. 使用len()函数得到该题材电影的数量和该题材烂片的数量,得到烂片的比例,将其赋值给lp_pre_i
    5. 存储“题材名称”、“题材数量”和“烂片比例”并返回结果
  3. 创建一个列表lst_type_lp,用于存储f1()函数返回的结果
  4. 通过for循环依次从题材列表typelst中取出每一种题材,调用f1()函数,将结果存储在dici变量中
  5. 使用append()函数将dici追加在列表lst_type_lp中,然后将其转换为DataFrame格式的数据

图片.png
图片.png


烂片比例TOP20

得到所有的烂片比例结果后,我们首先通过排序筛选出烂片比例排名Top20的电影,然后使用Bokeh生成一个散点图,代码如下:

  1. '''
  2. Bokeh 制图
  3. '''
  4. type_lp_top20['size'] = type_lp_top20['typecount']**0.5*2 #设置点的大小
  5. source = ColumnDataSource(type_lp_top20)
  6. #创建数据
  7. lst_type = type_lp_top20['typename'].tolist()
  8. hover = HoverTool(tooltips = [
  9. ('数据量','@typecount'),
  10. ('烂片比例','@type_lp_pre')
  11. ])
  12. #设置标签内容
  13. output_file('pic1.html')
  14. p = figure(x_range = lst_type, plot_width = 900, plot_height = 500,
  15. title = '不同电影题材的烂片比例',
  16. tools = [hover, 'reset,xwheel_zoom,pan,crosshair,box_select'])
  17. p.circle(x = 'typename', y = 'type_lp_pre', source = source,
  18. size = 'size', line_color = 'black', line_dash = [6, 4],
  19. fill_color = 'red', fill_alpha = 0.5)
  20. show(p)

在有了排名Top20的数据以后,可以开始制图了,步骤如下:

  1. 题目要求,图中点的大小为样本数量,由于有些样本数值巨大,因此需要先将样本都适当的缩小,然后将其存储在数据中,字段为‘size’
  2. 此时作图的数据已经基本完成,我们需要其转化为ColumnDatasource格式的数据
  3. 题目要求横坐标为‘题材’类型,在此将type_lp_top20中的字段‘typename’取出以列表的形式存储,并将其赋值给lst_type
  4. 同时,为了方便查看每一个点的数据,我们需要为每一个点都设置标签内容
  5. 设置生成的Bokeh图的名称
  6. 开始作图,设置图的宽和高以及title信息,并设置tools数据,将x轴数据类型设置为‘题材’
  7. 生成散点图,设置点边线颜色为黑色,虚线显示,内部填充颜色为红色,透明度为0.5

图片.png