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大师代发,拒绝转载,转载需要作者授权

原文地址:https://www.cnblogs.com/demodashi/p/10474113.html

时间: 2024-10-30 10:24:49

python实现的、带GUI界面电影票房数据可视化程序的相关文章

Python 实现下载进度条(不带GUI界面)

话不多说,先上图该Python代码可以实现获取下载的文件名,下载文件的大小,下载速度等. 代码关键点: 1.关于下载文件名的获取:代码里使用两种方式获取:(1) 通过Content-Disposition属性,该属性是作为对下载文件的一个标识字段,存储着下载文件名(2) 直接通过链接获取,例如:sw.bos.baidu.com/sw-search-sp/software/8b23f8846df3d/BaiduMusicSetup.exe 文件后面直接就是文件名称了.2.关于下载文件大小的获取:直

转:Python 简单串口收发GUI界面

https://blog.csdn.net/freedom098/article/details/48211567 忙活了三个多小时,连学带做,总算是搞出来了一个具有基本功能的串口通信PC机的GUI界面,Tkinter在python中确实很好用,而且代码量确实也很少,不足的是Tkinter不自带combox,但是幸运的是我下载的2.7版本自带了包含有combox的ttk模块,于是乎问题就顺利解决了.下面是源代码,一些错误提示功能还没有做,目前只是简单地实现了下位机与PC的通信界面,下位机还是用的

python基础-简单的GUI界面

采用tkinter实现了几个简单的GUI界面 调用tkinter的方式非常简单,只需要如下几行代码 1 import Tkinter 2 top = Tkinter.Tk() 3 # Code to add widgets will go here... 4 top.mainloop() 使用Button import Tkinter import tkMessageBox top = Tkinter.Tk() #add a function def hello(): tkMessageBox.

用Python写一个带图形界面的文件压缩软件

文件压缩和解压我们在日常工作学习中会经常用到,比如winrar.快压.好压等压缩软件 打开之后的界面长这个样子: 压缩完成后是这个样子: 解压完成后是这个样子: 大家在学python的时候肯定会遇到很多难题,以及对于新技术的追求,这里推荐一下我们的Python学习扣qun:784758214,这里是python学习者聚集地!!同时,自己是一名高级python开发工程师,从基础的python脚本到web开发.爬虫.django.数据挖掘等,零基础到项目实战的资料都有整理.送给每一位python的小

Python:简单的登陆GUI界面

import tkinterimport sysimport re top = tkinter.Tk()top.geometry('400x170+350+150')top.wm_title('综合实例') def validateText(): val = entry1.get() if re.findall('^[0-9a-zA-Z_]{1,}$',str(val)): return True else: label3['text'] = '用户名只能包含字母.数字.下划线' return

Python小爬虫——抓取豆瓣电影Top250数据

写LeetCode太累了,偶尔练习一下Python,写个小爬虫玩一玩~ 确定URL格式 先找到豆瓣电影TOP250任意一页URL地址的格式,如第一页为:https://movie.douban.com/top250?start=0&filter=,分析该地址: https:// 代表资源传输协议使用https协议: movie.douban.com/top250 是豆瓣的二级域名,指向豆瓣服务器: /top250 是服务器的某个资源: start=0&filter= 是该URL的两个参数,

Python利用Plotly实现对MySQL中的数据可视化

Mysql表数据: demo.sql内容 create table demo( id int ,product varchar(50) ,price decimal(18,2) ,quantity int ,amount decimal(18,2) ,orderdate datetime ); insert into demo select 1,'AAA',15.2,5,76,'2017-09-09' union all select 2,'BBB',10,6,60,'2016-05-18' u

Matlab GUI界面

做SVD的时候,看学姐的demo,用到了matlab的GUI,感兴趣就自己学了一下: 从简单的例子说起吧. 创建Matlab GUI界面通常有两种方式: 1,使用 .m 文件直接动态添加控件     2.  使用 GUIDE 快速的生成GUI界面 显然第二种可视化编辑方法算更适合写大型程序.一:创建GUI1.在 .m文件中动态添加 例如 h_main=figure(‘name’,‘a demo of gui design’,‘menubar’,‘none’,… 'numbertitle','of

MATLAB GUI界面总结

创建Matlab GUI界面通常有两种方式: 1,使用 .m 文件直接动态添加控件 2.  使用 GUIDE 快速的生成GUI界面 显然第二种可视化编辑方法算更适合写大型程序. 一:创建GUI 1.在 .m文件中动态添加 例如 h_main=figure('name','a demo of gui design','menubar','none',- 'numbertitle','off','position',[100 100 300 100]); h_edit=uicontrol('styl