代码地址如下:
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大师代发,拒绝转载,转载需要作者授权

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

  1. python实现的电影票房数据可视化

    代码地址如下:http://www.demodashi.com/demo/14275.html 详细说明: Tushare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从数据采 ...

  2. Python 实现的、带GUI界面的词云生成器

    代码地址如下:http://www.demodashi.com/demo/14233.html 详细说明: "词云"就是数据可视化的一种形式,给出一段文本,根据文本中词语的出现频率 ...

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

    python抓取豆瓣电影Top250数据 1.豆瓣地址:https://movie.douban.com/top250?start=25&filter= 2.主要流程是抓取该网址下的Top25 ...

  4. 用Python的Plotly画出炫酷的数据可视化(含各类图介绍,附代码)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 我被狗咬了 在谈及数据可视化的时候,我们通常都会使用到matplo ...

  5. python学习笔记(2):科学计算及数据可视化入门

    一.NumPy 1.NumPy:Numberical Python 2.高性能科学计算和数据分析的基础包 3.ndarray,多维数组(矩阵),具有矢量运算的能力,快速.节省空间 (1)ndarray ...

  6. python中文及符号检测工具带GUI界面

    import tkinter import webbrowser import re #本程序是一个中文字符和中文检测工具 #中文字符自己添加,我只添加了一点 #输入字符串,点击检查文本即可判断有没有 ...

  7. python实用脚本-通过jenkins界面化导出数据

    1.jenkins 配置 2.jenkins 脚本 ansible-playbook /opt/test.yaml --extra-vars "loanno=${loanno}" ...

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

    Mysql表数据: demo.sql内容 create table demo( id int ,product varchar(50) ,price decimal(18,2) ,quantity i ...

  9. Python之Numpy:二元函数绘制/三维数据可视化/3D

    意义 在机器学习任务中选择计算模型或者学习数学时,可视化有助于研究函数值的变化趋势(观察收敛.分布.几何形状等),带来直观的感受. 源码 # 绘制二元函数 # 参考文献 # + python画二元函数 ...

随机推荐

  1. INDY10 IDHTTPSERVER返回中文不乱码

    INDY10 IDHTTPSERVER返回中文不乱码 procedure TynHttpServer.CommandGet(AContext: TIdContext; ARequestInfo: TI ...

  2. ubuntu下C++和C编程

      一.anjuta Anjuta DevStudio 的官方地址:http://anjuta.sourceforge.net/Anjuta是一个C/C++ IDE,它最大的特色是灵活,同时打开多个文 ...

  3. C语言函数库

    C语言函数库 分类函数目录函数进程函数诊断函数接口子程序输入输出 str字符串操作函数mem操作存贮数组 数学函数 时间日期函数 转换函数 分类函数,所在函数库为ctype.h[top] int is ...

  4. Appium+python自动化5-Appium Inspector

    前言    appium Inspector从入门到放弃!反正你都打开了,那就看下为什么要放弃吧! Appium Inspector是appium自带的一个元素定位工具,上一篇介绍了如何使用uiaut ...

  5. Android之应用内部实现国际化

    这篇文章也提供了应用内部转换语言的方法: http://blog.csdn.net/sodino/article/details/6596709 .1和2的方法是一样的,然而还是会调整了手机的语言设置 ...

  6. [leetcode]Flatten Binary Tree to Linked List @ Python

    原题地址:http://oj.leetcode.com/problems/flatten-binary-tree-to-linked-list/ 题意: Given a binary tree, fl ...

  7. W-GAN

    令人拍案叫绝的Wasserstein GAN WGAN前作分析了Ian Goodfellow提出的原始GAN两种形式各自的问题,第一种形式等价在最优判别器下等价于最小化生成分布与真实分布之间的JS散度 ...

  8. Android数据存储之SQLite

    SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,占用资源非常少,只有几百KB内存.支持Windows/Linux ...

  9. 对 C# 未来的期望

    接触 C# 一年,总体上是一个非常完善的语言,但是某些细节特征还是不够完美.这里记下我现在对它将来的一些期望.       更强大的泛型约束   与 C++ 的模板相似,C# 的泛型使得编写适用于多种 ...

  10. TypeError: 'newline' is an invalid keyword argument for this function 错误解决

    出错代码: outputFile = open('output1.csv', 'w', newline='') # error line outputWriter = csv.writer(outpu ...