pandas~电影票房实例

温馨提示:

截至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,这里不重复进行
运行结果如下图:


作图.png

从上图不难看出:近十年年度票房增长很快,从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)数据(即输出参数)含义:


meaning.png

参考网站:

Tushare大数据社区
Python编程和数据分析基础_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

疑问:不知道为什么跑数据时会多出来2005和2007的数据?(上面的数据我只是列出了2008到2019的数据),但是在设置输入参数时我并没有涉及到这两个到2005和2007,目前没发现原因。

你可能感兴趣的:(pandas~电影票房实例)