詳細說明:
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
)
准備工作:
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)。
如下:
實現過程的部分代碼展示
- 在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
"""
導入相關的庫:
import sys
from plot_figure import plt_fig,plt_fig_month
from tw_boxoffice import tw_fig
from us_boxoffice import us_fig
編寫程序入口:
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__)
運行效果如圖:
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實現的電影票房數據可視化
注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權