首页 » Python » 牛刀小试:利用Python分析豆瓣电影Top250(一)

牛刀小试:利用Python分析豆瓣电影Top250(一)

原文 http://blog.csdn.net/Cui_Zi_Cheng/article/details/78156380

2017-10-04 14:20:09阅读(1731)

使用Scrapy框架抓取豆瓣电影Top250信息(https://movie.douban.com/top250).

获取影片信息后对数据进行清洗,手动填补遗漏的电影信息等。

整理完毕后具体信息如下

Rank:排名(1-250) title:电影片名 Score:得分(0-10) MovieTypes:影片类型 Year:上映时间 Last:影片时长 CountryOrRegion:制片国家或地区 Votes:参与投票人数 Direction:导演 ScreenWriter:编剧 Actors:主要演员 Comment:一句话评价 OriginalTitle:电影的原始片名 Url:影片对应的链接
# Author : CuiCheng
# Created: 2017-10-03
# E-mail: cuic@lreis.ac.cn
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
# 指定作图的风格
plt.style.use('seaborn')
# 支持中文字符和负号
plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False
filepath = './doubanMovies.xlsx'
movies = pd.read_excel(filepath)
# 查看记录数和字段数
print(movies.shape)
(250, 14)
# 具体查看某一条电影的信息
movies.iloc[10]
Rank                                                      11
Title                                                  海上钢琴师
Score                                                    9.2
MovieTypes                                             剧情 音乐
Year                                                    1998
Last                                                     165
CountryOrRegion                                          意大利
Votes                                                 597778
OriginalTitle           La leggenda del pianista sull'oceano
Direction                                           朱塞佩·托纳多雷
ScreenWriter                              亚利桑德罗·巴里克 朱塞佩·托纳多雷
Actors               蒂姆·罗斯 普路特·泰勒·文斯 比尔·努恩 梅兰尼·蒂埃里 阿尔贝托·巴斯克斯
Comment                            每个人都要走一条自己坚定了的路,就算是粉身碎骨。 
Url                https://movie.douban.com/subject/1292001/
Name: 10, dtype: object
电影评分
fig, ax = plt.subplots(figsize=(9,9))
n,bins,pathces=ax.hist(movies['Score'],bins=7,facecolor='g',alpha=0.7)
ax.set_xticks(np.linspace(8,10,11))
ax.set_ylim(ymax=90)
ax.set_yticklabels(np.arange(0,91,10),size=14)
ax.set_xticklabels(np.linspace(8,10,11),size=14)
for i in range(len(n)): 
    ax.text(bins[i]+0.1,n[i]+2,int(n[i]),fontsize=13,horizontalalignment='center')
ax.set_xlabel('评  分',fontsize=17)
ax.set_ylabel('数  量',fontsize=17)
title='影片评分直方图'
ax.set_title(title,fontsize=20)
fig.savefig(title)
plt.show()

牛刀小试:<a href=利用Python分析豆瓣电影Top250(一)" src="http://img.blog.csdn.net/20171003211110345" alt="png" title="">

果不其然,入选豆瓣电影TOP250的评分都高达8分以上,整体质量很高。

电影类型

在分析之前,需要对每部电影所属的类型进行展开,形成0-1矩阵。

genres_iter = (set(x.split()) for x in movies['MovieTypes'])
genres = set.union(*genres_iter)
dummies = pd.DataFrame(np.zeros((len(movies),len(genres))),columns=genres)
for i,gen in enumerate(movies.MovieTypes):
    dummies.loc[i,gen.split()]=1
movies_genres = movies.join(dummies.add_prefix('Genre_'))
typedict = {column[6:]:movies_genres[column].sum() for column in movies_genres.columns if column.startswith('Genre_')}
typedict=dict(sorted(typedict.items(),key = lambda d:d[1],reverse=True))
fig,ax = plt.subplots(figsize=(24,18))
ax.bar(np.arange(start=0,stop=4*len(typedict),step=4),typedict.values(),tick_label=typedict.keys(),fc='g',alpha=1,width=0.8)
ax.set_xticklabels(typedict.keys(),size=14)
ax.set_yticks(np.arange(0,201,20))
ax.set_yticklabels(np.arange(0,201,20),size=14)
ax.set_ylim(ymax=200)
ax.set_xlabel('电 影 类 型',size=18)
ax.set_ylabel('数 量',size=18)
title = '影 片 类 型 分 布'
ax.set_title(title,size=20)
fig.savefig(title)
plt.show()

牛刀小试:利用Python分析豆瓣电影Top250(一)

剧情片大当其道,本身也是因为每个电影基本都可以打上“剧情”的标签,“爱情”,”喜剧“的电影更受欢迎,人们还是愿意更多的在电影里看到美好的东西。

电影年代
fig, ax = plt.subplots()
bins = np.arange(1930,2021,10)
ax.set_xticks(bins)
ax.set_xticklabels(bins,size=14)
n,bins,patches = ax.hist(movies_genres['Year'],bins=bins,fc='g',alpha=0.7)
for i in range(len(n)):
    ax.text(bins[i]+5,n[i]+3,int(n[i]),size=14,horizontalalignment='center')
ax.set_yticks(np.arange(0,101,20))
ax.set_yticklabels(np.arange(0,101,20),size=14)
ax.set_xlabel('年  代',size=16)
ax.set_ylabel('数  量',size=16)
title = '电影年代分布'
ax.set_title(title,size=20)
ax.grid(True)
fig.savefig(title)
plt.show()

牛刀小试:利用Python分析豆瓣电影Top250(一)

得益于电影技术和表现手法的成熟,优质电影分布在20世纪90年代以后。

豆瓣用户每天都在对“看过”的电影进行“很差”到“力荐”的评价,豆瓣根据每部影片看过的人数以及该影片所得的评价等综合数据,通过算法分析产生豆瓣电影 Top 250。

可见豆瓣电影TOP250并不是一成不变的,它会结合新近的热门电影做出调整,如《看不见的客人》,《二十二》等。
近期的电影受商业宣传的影响,评分可能会出现虚高。结合经验,2010年以后的“喜剧”“动画”题材的电影有可能属于短期热度型的电影,最后在时间的冲刷下被淘汰。

moviefilter = (movies_genres['Year']>=2010) & (movies_genres['Genre_喜剧']*movies_genres['Genre_动画']==1)
print("未来有极大可能被淘汰的电影:")
(movies[moviefilter].loc[:,['Rank','Title','Year']])
未来有极大可能被淘汰的电影: Rank Title Year 63 64 疯狂动物城 2016 108 109 驯龙高手 2010 117 118 神偷奶爸 2010 130 131 疯狂原始人 2013 148 149 玩具总动员3 2010 169 170 超能陆战队 2014 223 224 无敌破坏王 2012 240 241 头脑特工队 2015

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹