温馨提示:
截至2019年年终,tushare可使用
ts.month_boxoffice()
这个公用的数据接口来下载电影的月票房榜的数据;
但到了2020年,这个接口已经无法使用,必须使用新的pro接口才能获得所需数据,所以今天讲到的代码与教材上的旧接口的代码是有出入的,不兼容的。
电影票房统计实例操练:
前期准备
在cmd中执行以下命令安装Tushare
pip install tushare
打开python设置接口
import tusahre as ts #https://tusahre.pro
ts.set_token('自己的接口token') #执行一次在本机保存token,以后无需执行
pro = ts.pro_api() #初始化pro接口
在导入tushare后,我们必须要去tushare官网上注册一个正式的用户,每个tushare用户都有一个自己的token(即凭证),这个token可以在tushare官网的个人主页中找到,然后通过上述操作即可设置好自己的token接口。
注:Tushare社区为了形成更好的互动,鼓励用户更多参与社区活动,也让数据从需求、规划、采集到服务变得更完善,同时为提高数据的及时性和准确性,Tushare Pro引入积分概念。平台积分将作为用户最重要的凭证参与社区活动,甚至分享平台更多权益。用一句话来说:积分很重要;比如要完成此次的电影票房实例操作必须要达到500积分;如果是高校学生,可以加入tushare的高校学习群完成学生认证来获得积分。
实例操作
一、下载数据并保存文件
import tushare as ts
import time
import pandas as pd
from pandas import DataFrame, Series
pro = ts.pro_api(' ') # 初始化 pro 接口
movie = DataFrame() # 生成一个DataFrame对象
for year in range(2008, 2020): # 2008—2019年
for mon in range(1, 13): # 1~12月
date='{:4d}{:02d}{:02d}'.format(year,mon,1)
df = pro.bo_monthly(date=date) # 下载指定月票房
df['month']=date[4:6] #添加month列
movie = movie.append(df, ignore_index=True) # 将df追加到movie中
time.sleep(2) # 休眠2s, 每分钟访问次数有限制
movie.to_excel('promovie1.xlsx', index=False)
其中 df['month']=date[4:6] 这一步很重要,可以记录下所属月份后便后续分析
二、添加'人数'列
movie = pd.read_excel('promovie1.xlsx')#读取文件
m['people']=(m.month_amount*10000/m.avg_price).astype('int')
m.to_excel('promovie1.xlsx')#再将数据保存,便于后续使用
因为原数据中不含人数,按'单月票房(万元人民币)/平均票价'计算人数,添加新列people便于统计观影人数
三、查看2008—2019年电影十大票房排行榜、总票房(万元)和总观影人数
movie = pd.read_excel('promovie1.xlsx')#读取文件
m = movie[movie.name!='其他'] # 先排除“其他”行,避免出现干扰
m.groupby('name').month_amount.sum().sort_values(ascending=False)[:10]
# 按年度,str[:4]取出年份,以此分类统计,sort_index按索引年度顺序排列:
ybox = m.groupby(m.list_date.str[:4]).month_amount.sum().sort_index()
ybox[::-1] # 票房年度额
#统计总票房(万元)、总观影人数:
movie.loc[:, ['month_amount', 'people']].sum()
ybox[::-1] ——把最新的数据放在最前面
运行结果如下:
name
战狼2 566339
哪吒之魔童降世 495111
流浪地球 462947
复仇者联盟4:终局之战 423768
红海行动 359928
唐人街探案2 339240
美人鱼 338968
我不是药神 303854
我和我的祖国 297912
中国机长 282271
Name: month_amount, dtype: int64
month_amount 33056448
people 9353562302
dtype: int64
四、统计年度票房和月度票房,然后绘制对比图形
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定中文黑体字体,不然标签显示不清
mbox = m.groupby(m.list_date.str[5:7]).month_amount.sum().sort_index()
mbox.plot(title='月票房', marker='o', fontsize=14)
plt.show()
ybox.plot(title='年票房', marker='o', fontsize=14)
plt.show()
因为上一步已经统计ybox,这里不重复进行
运行结果如下图:
从上图不难看出:近十年年度票房增长很快,从2008年的31亿元增加到了2018年的600亿元。电影月度消费差异很大,春节和暑假消费爆棚,所以这两个档期也是电影公司必争的黄金档期。
五、其他:
# 计算年度人均票价“年度总票房(万元人民币)/观影人数”,保留1位小数
p=m.groupby(m.list_date.str[:4]).people.sum().sort_values(ascending=False)#将票房以年度排序
print(p)
print(np.round(ybox*10000/p, 1))
运行结果如下:
list_date
2019 1550761827
2018 1487967626
2017 1457154375
2016 1201646796
2015 1146167119
2014 745294619
2013 543220223
2012 414370196
2011 298093559
2010 247083312
2009 162734703
2008 94057177
Name: people, dtype: int32
list_date
2008 29.8
2009 31.6
2010 36.1
2011 35.9
2012 36.3
2013 35.3
2014 35.8
2015 34.9
2016 33.6
2017 34.7
2018 35.6
2019 37.3
dtype: float64
这里运算ybox*10000/p体现了Pandas索引运算的优势,两列统计数据都以年份为索引,
在运算时自动按年份匹配。
补充:
promovie1.xlsx(2008.1-2019.12)数据(即输出参数)含义:
参考网站:
Tushare大数据社区
Python编程和数据分析基础_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili