python實現的電影票房數據可視化

代碼地址以下:<br>http://www.demodashi.com/demo/14275.htmlhtml

##詳細說明:python

Tushare是一個免費、開源的python財經數據接口包.主要實現對股票等金融數據從數據採集、清洗加工 到 數據存儲的過程,可以爲金融分析人員提供快速、整潔、和多樣的便於分析的數據。 完成本項目後,能夠進一步經過相似的方法實現股票數據的可視化操做. (代碼在python2.7或python3.6下均能正常運行,已在如下環境中進行過測試: python2.7 + tushare0.9.8 + matplotlib1.5.0 + pandas0.18.0 + numpy1.14.3; python3.6 + tushare1.2 + matplotlib2.1.2 + pandas0.22.0 + numpy1.14.2 )python2.7

##準備工做: 1.安裝必要的第三方庫:函數

pip install matplotlib
 pip install numpy
 pip install tushare
 pip install pandas

##項目結構: 總體的項目結構十分簡單,一共四個腳本文件,一個是程序入口(BoxOffice_cli.py), 一個是繪圖腳本(plot_figure.py),一個是獲取臺北地區票房數據的 腳本(tw_boxoffice.py),一個是獲取美國票房數據的腳本(us_boxoffice.py)。 以下: 項目結構圖測試

##實現過程的部分代碼展現網站

  1. 在BoxOffice_cli.py編寫程序命令說明:
"""
本程序可獲取各地票房數據,
並將其可視化。
Usage:
Today boxoffice:
  python BoxOffice_cli.py
  
Sum boxoffice:
  python BoxOffice_cli.py -sum
  
Month boxoffice:
  python BoxOffice_cli.py -m month("xxxx-xx")
  
Taipei weekend boxoffice:
  python BoxOffice_cli.py -tw
  
US weekend boxoffice:
  python Boxoffice_cli.py -us
"""

導入相關的庫:url

import sys

from plot_figure import plt_fig,plt_fig_month 
from tw_boxoffice import tw_fig
from us_boxoffice import us_fig

編寫程序入口:3d

class Main(object):
    def __init__(self):
        """預約義參數"""
        self.fig = plt_fig()
        self.fig_month = plt_fig_month()
        
        self.tw_fig = tw_fig()
        self.us_fig = us_fig()
        
    def day_boxoffice(self):
        self.fig.day_boxoffice(title = u'本日票房',ylabel = u'票房\萬元')

    def sum_boxoffice(self):
        self.fig.sum_boxoffice(title =u'本日影片累計票房',ylabel = u'累計票房\萬元')

    def month_boxoffice(self,month):
        self.fig_month.day_boxoffice(u'月份票房',u'票房\萬元',month)       

    def tw_boxoffice(self):
        self.tw_fig.weekend()

    def us_boxoffice(self):
        self.us_fig.weekend()
        
if __name__ == '__main__':
    print(__doc__)
    main = Main()
    if len(sys.argv)==1:
        main.day_boxoffice()
        
    elif len(sys.argv)==2:
        action = sys.argv[1]
        if action =="-sum":
            main.sum_boxoffice()
        elif action =="-tw":
            main.tw_boxoffice()
        elif action =="-us":
            main.us_boxoffice()

    elif len(sys.argv)==3:
        month = sys.argv[2]
        main.month_boxoffice(month)
        
    else:
        print(__doc__)

運行效果如圖: cliexcel

2.編寫繪圖腳本(plot_figure.py): 導入相關的庫:code

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import tushare as ts
import time
import os

由於tushare庫提供了內地票房的接口,因此能夠經過tushare來獲取相關的票房信息.

編寫獲取單日票房數據的函數:

class plt_fig():
    def __init__(self):
        tt = time.gmtime()
        self.today = str(tt[0]) + str(tt[1]) + str(tt[2])

    def get_data(self,*args):
        self.cd_dir()
        f0 = self.today+'.xlsx'
        try:
            d1 = pd.read_excel(f0)
        except IOError:
            d0 = ts.realtime_boxoffice()
            d0.to_excel(f0)
            d1 = pd.read_excel(f0)
        d2 = d1.Irank
        d3 = d1.BoxOffice
        d4 = d1.MovieName
        d5 = d1.sumBoxOffice
        return d2,d3,d4,d5
    
    def day_boxoffice(self,title = u'本日票房',ylabel = u'票房\萬元',*args):
        if len(args)>0:
            irank,box,name,sumbox = self.get_data(args[0])
        else:
            irank,box,name,sumbox = self.get_data()        
        self.plt_bar(irank,box,name,title,ylabel)
        
    def sum_boxoffice(self,title =u'本日影片累計票房',ylabel = u'累計票房\萬元'):
        irank,box,name,sumbox = self.get_data()
        self.plt_bar(irank,sumbox,name,title,ylabel)

編寫繪圖函數:

def plt_bar(self,xdata,ydata,xticks,title,ylabel):
        fig = plt.figure()
        ax = fig.add_subplot(111)
        bar_width = 0.65

        rect = ax.bar(xdata,ydata,bar_width,color = 'r')
        plt.xticks(xdata+bar_width/2,xticks)
        ax.set_title(title)
        ax.set_ylabel(ylabel)
        
        plt.grid()
        fig.autofmt_xdate()
        self.autolabel(ax,rect)
        plt.tight_layout()
        plt.show()

與之相似,能夠編寫一個獲取月度票房數據的類和函數, 類能夠繼承plt_fig,只需改寫其get_data函數便可. 程序到這裏已經能夠知足獲取內地票房數據並繪圖的需求了. 效果如圖: 內地日票房

日累計票房

月份票房

3.編寫獲取臺北,美國週末票房數據的腳本(tw_boxoffice.py): 由於tushare只提供了內地票房數據的接口,要獲取臺北等地 的票房數據,須要從其餘網站爬取.

pandas中的read_html函數能夠讀取網頁中的表格, 所以能夠直接用pandas讀取網頁的表格,稍做數據清洗後, 轉存爲本地的excel表格,程序再從中讀取數據而後繪圖.

導入相關的庫:

import pandas as pd

from plot_figure import plt_fig

獲取數據及數據清洗:

'''獲取臺北週末票房'''

class tw_fig(plt_fig):

    def table2excel(self,url):
        tbs = pd.read_html(url,header = 0,index_col = 0,skiprows = 0)
        df = tbs[1]
        df.columns = [u'MovieName',u'weekbox',u'sumbox',u'lastweek',u'weeknum',u'nouse']
        df.index.name = u'irank'

        df1 = df.fillna(method = 'bfill')
        df1 = df1.dropna(axis = 1,how = 'all')
        df1.weekbox = df1.weekbox.str.replace('$','')
        df1.sumbox = df1.sumbox.str.replace('$','')

        df1.sumbox = df1.sumbox.str.replace(',','')
        df1.weekbox = df1.weekbox.str.replace(',','')
    
        df1.sumbox = pd.to_numeric(df1.sumbox)
        df1.weekbox = pd.to_numeric(df1.weekbox)
    
        n = range(1,21)
        df2 = df1[df1.index.isin(n)]
        return df2

    def get_data(self,area,url):
        self.cd_dir()
        f0 = str(area)+'_'+self.today+'.xlsx'
        try:
            df = pd.read_excel(f0)
        except IOError:
            df = self.table2excel(url)
            df.to_excel(f0)
        irank = df.index
        weekbox = df.weekbox
        name = df.MovieName
        title = str(area)+self.today+'boxoffice'
        return irank,weekbox,name,title

與之相似,能夠編寫一個獲取美國票房數據的類和函數, 類能夠繼承tw_fig,只需改寫其weekend函數便可.

效果以下: 臺北週末票房

美國週末票房python實現的電影票房數據可視化

代碼地址以下:<br>http://www.demodashi.com/demo/14275.html

注:本文著做權歸做者,由demo大師代發,拒絕轉載,轉載須要做者受權

相關文章
相關標籤/搜索