美文网首页
pandas~电影票房实例

pandas~电影票房实例

作者: SCY_e62e | 来源:发表于2020-12-06 14:45 被阅读0次
    温馨提示:

    截至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~电影票房实例

          本文链接:https://www.haomeiwen.com/subject/qiuiwktx.html