python實現的、帶GUI界面電影票房數據可視化程序


代碼地址如下:
http://www.demodashi.com/demo/14588.html

詳細說明:

Tushare是一個免費、開源的python財經數據接口包.主要實現對股票等金融數據從數據采集、清洗加工 到 數據存儲的過程,能夠為金融分析人員提供快速、整潔、和多樣的便於分析的數據。
完成本項目后,可以進一步通過類似的方法實現股票數據的可視化操作.
(代碼在python2.7或python3.6下均能正常運行,已在以下環境中進行過測試:
python2.7 + tushare0.9.8 + matplotlib1.5 + pandas0.18 + numpy1.14 + wx2.8;
python3.6 + tushare1.2 + matplotlib2.1 + pandas0.22 + numpy1.14 + wx4.0
)

准備工作:

1.安裝必要的第三方庫:

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

項目結構圖:

整體的項目結構十分簡單,一共四個腳本文件,一個是GUI界面腳本(BoxOfficeGui.py),
一個是繪圖腳本(plot_figure.py),一個是獲取台北地區票房數據的
腳本(tw_boxoffice.py),一個是獲取美國票房數據的腳本(us_boxoffice.py)。
如下:
項目結構圖
(項目結構圖)

實現過程的部分代碼展示

以下是程序的實現思路,以及步驟,實現步驟里,附上了關鍵代碼,全部的代碼,請下載代碼后閱讀

  1. 在BoxOfficeGui.py中編寫用戶界面:
    導入相關的庫:
import wx
import  wx.lib.dialogs
from collections import namedtuple
from plot_figure import plt_fig,plt_fig_month
from utility_template import layout_template
from tw_boxoffice import tw_fig
from us_boxoffice import us_fig

編寫界面:


class MainWindow(wx.Frame):
    def __init__(self,parent,title):
        wx.Frame.__init__(self,parent,title=title,size=(600,-1))
        static_font = wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL)
        
        Size = namedtuple("Size",['x','y'])
        s = Size(100,50)

        """預定義參數"""
        self.fig = plt_fig()
        self.fig_month = plt_fig_month()
        
        self.tw_fig = tw_fig()
        self.us_fig = us_fig()
        
        b_labels = [
                    u'今日票房榜',
                      u'今日票房占比',
                      u'總票房榜',
                      u'總票房占比',
                      u'月票房榜',
                      u'月票房占比',
                    u'台北周末票房',
                    u'美國周末票房'
                        ]

        TipString = [ u'今日票房榜',
                      u'今日票房占比',
                      u'總票房榜',
                      u'總票房占比',
                      u'月票房榜',
                      u'月票房占比',
                      u'台北周末票房',
                      u'美國周末票房'
            ]
        funcs = [self.day_boxoffice,self.day_boxoffice_pre,
                 self.sum_boxoffice,self.sum_boxoffice_pre,
                 self.month_boxoffice,self.month_boxoffice_pre,
                 self.tw_boxoffice,self.us_boxoffice]
        
        """創建菜單欄"""
        filemenu = wx.Menu()
        menuExit = filemenu.Append(wx.ID_EXIT,"E&xit\tCtrl+Q","Tenminate the program 退出")

        menuBar = wx.MenuBar ()
        menuBar.Append(filemenu,"&File")
        self.SetMenuBar(menuBar)
        
        '''創建按鈕'''
        self.sizer0 = wx.FlexGridSizer(cols=2, hgap=4, vgap=2) 
        buttons = []
        for i,label in enumerate(b_labels):
            b = wx.Button(self, id = i,label = label,size = (1.5*s.x,s.y))
            buttons.append(b)
            self.sizer0.Add(b)      

        '''菜單綁定函數'''
        self.Bind(wx.EVT_MENU,self.OnExit,menuExit)

        '''設置各控件的顏色、字體屬性,綁定控件函數'''  
        for i,button in enumerate(buttons):
            button.SetForegroundColour('red')
            button.SetFont(static_font)
            button.SetToolTipString(TipString[i]) #wx2.8
##            button.SetToolTip(TipString[i])       #wx4.0
            button.Bind(wx.EVT_BUTTON,funcs[i])

        '''設置頁面布局'''
        self.SetSizer(self.sizer0)
        self.SetAutoLayout(1)
        self.sizer0.Fit(self)
        
        self.CreateStatusBar()
        self.Show(True)
    

注意代碼中wx4.0版本與wx2.8版本的按鈕提示字符的設置方法是不一樣的.
界面如下:
程序界面
(GUI)

部分按鈕點擊后的效果如下:
"今日票房榜"按鈕:繪制當日票房榜,如下圖,
內地日票房
(20181201內地票房)

"今日票房占比"按鈕:獲取當天票房數據,並據此繪制當天票房百分占比餅圖;
內地日票房占比
(20181201內地票房占比)

"月票房榜"按鈕:獲取指定月份的票房數據,並繪制該月票房榜(以“xxxx-xx"形式輸入指定月份),如下圖;
內地月票房
(2018-11月票房榜)

"月票房占比"按鈕:獲取指定月份的票房數據,並繪制該月上映電影票房的百分比餅圖;
內地月票房占比
(2018-11月票房占比)

編寫控件的回調函數:

    def day_boxoffice(self,evt):
        self.fig.day_boxoffice(title = u'本日票房',ylabel = u'票房\萬元')

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

    def month_boxoffice(self,evt):
        month = self.get_month()
        title = u'{m}票房'.format(m = month)
        self.fig_month.day_boxoffice(title,u'票房\萬元',month)

    def month_boxoffice_pre(self,evt):
        month = self.get_month()
        title = u'{m}票房占比'.format(m = month)
        self.fig_month.day_boxoffice_pre(title,month)

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

    def us_boxoffice(self,evt):
        self.us_fig.weekend()

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

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實現的、帶GUI界面電影票房數據可視化程序

代碼地址如下:
http://www.demodashi.com/demo/14588.html

注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM