在前面的文章中,我們學(xué)習(xí)了如何使用 Tkinter 構(gòu)建股票數(shù)據(jù)抓取以及展示K線圖功能,雖然大致的功能已經(jīng)具備,但是在當(dāng)今這個(gè)人手一個(gè) Web 服務(wù)的年代,GUI 程序還是沒有 Web 服務(wù)來的香啊。我們需要用到的知識包括 PyEcharts 的使用,tushare 庫獲取股票數(shù)據(jù)的方法以及 Flask 的基本用法。
01獲取股票數(shù)據(jù)
我們先來看下 tushare 的使用,這個(gè)應(yīng)該是當(dāng)前最為流行的股票數(shù)據(jù)庫了吧,一行代碼,就能輕松獲取某支股票的歷史數(shù)據(jù)
importtushareasts
df=ts.get_hist_data('000001')
print(df)
現(xiàn)在股票的歷史數(shù)據(jù)有了,我們還需要一份股票名稱和股票代碼的對應(yīng)表,同樣通過 tushare 來獲取
stock_list=ts.get_stock_basics()
stock_list.reset_index(inplace=True)
stock_list[['code','name']].to_csv('stock_code_name.csv')
這樣就成功保存了一份股票名稱和股票代碼的對應(yīng)數(shù)據(jù)
02PyEcharts作圖
下面再來看看如何通過 PyEcharts 來制作 K 線圖,其實(shí)官網(wǎng)上的例子已經(jīng)非常具體了,我們只需要把拿到的歷史股票數(shù)據(jù)做些簡單處理即可,我這里直接給我的數(shù)據(jù)處理過程
mydate=df[:30].index.tolist()
mydata=df[:30][['open','close','low','high']].values.tolist()
defkline_base(mydate,data)->Kline:
c=(
Kline()
.add_xaxis(mydate)
.add_yaxis("kline",data)
.set_global_opts(
yaxis_opts=opts.AxisOpts(is_scale=True,
splitarea_opts=opts.SplitAreaOpts(
is_show=True,areastyle_opts=opts.AreaStyleOpts(opacity=1)
),
),
xaxis_opts=opts.AxisOpts(is_scale=True,
axislabel_opts=opts.LabelOpts(rotate=-30)),
title_opts=opts.TitleOpts(title="Kline-基本示例"),
datazoom_opts=[opts.DataZoomOpts()],
)
)
returnc
kline_base(mydate,mydata).render_notebook()
這樣就可以得到一個(gè)不錯(cuò)的 K 線圖了
下面我們就可以著手完成 Flask 的代碼啦
03構(gòu)建 Web框架
首先我們先來完成 Web 框架的整體編寫,為了頁面的美觀與編碼的方便,直接使用 bootstrap 來構(gòu)建前端頁面
視圖函數(shù)編寫
首先完成初始化工作,在項(xiàng)目目錄下創(chuàng)建一個(gè) app.py 文件
fromflaskimportFlask,render_template,request
frompyechartsimportoptionsasopts
frompyecharts.chartsimportKline
importtushareasts
importpandasaspd
fromflask_bootstrapimportBootstrap
app=Flask(__name__)
bootstrap=Bootstrap(app)
導(dǎo)入需要用到的庫,并完成 flask app 的初始化工作。
接下來再寫一個(gè) 404 的視圖函數(shù),統(tǒng)一處理所有的 Not Found 頁面
@app.errorhandler(404)
defpage_not_found(e):
returnrender_template("404.html"),404
接著我們綁定根地址到 index 視圖函數(shù)上,返回到 index.html 模板文件上
@app.route("/")
defindex():
returnrender_template("index.html")
模板編寫
在同級目錄創(chuàng)建一個(gè) templates 文件夾,創(chuàng)建三個(gè) HTML 文件,分別為 404.html,base.html 和 index.html
base.html 是所有其他頁面 HTML 模板的母模板
{%extends"bootstrap/base.html"%}
{%blocktitle%}我的股票走勢網(wǎng)站{%endblock%}
{%blocknavbar%}
<divclass="navbarnavbar-inverse"role="navigation">
<divclass="container">
<divclass="navbar-header">
<buttontype="button"class="navbar-toggle"data-toggle="collapse"data-target=".navbar-collapse">
<spanclass="sr-only">Togglenavigationspan>
<spanclass="icon-bar">span>
<spanclass="icon-bar">span>
<spanclass="icon-bar">span>
button>
<aclass="navbar-brand"href="/">Stock-Dataa>
div>
<divclass="navbar-collapsecollapse">
<ulclass="navnavbar-nav">
<li><ahref="/">Homea>li>
ul>
div>
div>
div>
{%endblock%}
{%blockcontent%}
<divclass="container">
{%blockpage_content%}
{%endblock%}
div>
{%endblock%}
創(chuàng)建一個(gè)導(dǎo)航欄,并定義相關(guān)的 block 內(nèi)容
接下來編寫 404.html 文件,展示非法 url 請求地址時(shí)的頁面
{%extends"base.html"%}
{%blocktitle%}PageNotFound{%endblock%}
{%blockpage_content%}
class="page-header">
NotFound
{%endblock%}
對于 index.html 文件,就是我們需要展示 K 線圖的頁面,我們后面再處理。
04編輯主邏輯
首先編寫一個(gè)檢查股票正確性的函數(shù)
defcheck_stock(code):
n=0
l=[]
stock_code=pd.read_csv("stock_code_name.csv",dtype=object)
stock_code.drop('Unnamed:0',axis=1,inplace=True)
stock_list=stock_code.values.tolist()
foriinstock_list:
ifcodeini:
n+=1
l=i
else:
continue
returnn,l
如果股票正確,則返回 n=1,否則返回 n=0
接下來再編寫獲取股票數(shù)據(jù)的函數(shù)
defget_stock_data(code,ctime):
df=ts.get_hist_data(code)
mydate=df[:ctime].index.tolist()
mydata=df[:ctime][['open','close','low','high']].values.tolist()
return[mydate,mydata]
下面就是把 PyEcharts 集成到 Flask 應(yīng)用了,可以按照官方的教程走,把 PyEcharts 的樣式文件等拷貝到自己的 templates 目錄下,再編寫一個(gè)用于調(diào)用 kline_base() 函數(shù)的視圖函數(shù)
@app.route("/Kline",methods=['GET','POST'])
defget_kline_chart():
stock_name=request.form.get('stockName')
query_time=request.form.get('queryTime')
ifnotstock_name:
stock_name='平安銀行'
ifnotquery_time:
query_time=30
status,stock_code=check_stock(stock_name)
ifstatus==0:
return'errorstockcodeorname'
mydate,mydata=get_stock_data(stock_code[0],int(query_time))
c=kline_base(mydate,mydata,stock_code[1])
returnc.dump_options()
首先通過 request 變量獲取到前端傳遞過來的數(shù)據(jù),分別為 stockName 和 queryTime,如果這兩個(gè)參數(shù)是空值時(shí),則賦予它們一個(gè)默認(rèn)值。
接著判斷股票代碼的正確性并獲取股票歷史數(shù)據(jù)。
最后調(diào)用 kline_base 函數(shù)畫出 K 線圖,并渲染到前端頁面上。
05前端頁面編寫
最后我們來完成前端頁面的工作
首先定義一個(gè)表單,用于傳遞股票名稱,查詢時(shí)間
<formid="form1"onsubmit="returnfalse"action="#"method="post">
<pid="p1">股票名稱:
<inputname="stockName"type="text"id="stockName"tabindex="1"size="16"value=""placeholder="股票名稱"/>
p>
<pid="p2">查詢時(shí)間:
<inputname="queryTime"type="text"id="queryTime"tabindex="2"size="16"value=""placeholder="輸入30查詢近30天數(shù)據(jù)"/>
p>
<p><inputtype="submit"value="查詢"onclick="getData()">p>
form>
然后就是通過 JQuery 來動(dòng)態(tài)獲取數(shù)據(jù)
functiongetData(){
varchart=echarts.init(document.getElementById('kline'),'white',{renderer:'canvas'});
$.ajax({
type:"POST",
dataType:"json",
url:"/Kline",
data:$('#form1').serialize(),
success:function(result){
chart.setOption(result);
},
error:function(){
alert("錯(cuò)誤的股票代碼!");
}
});
}
最后我們看下整體的效果
是不是效果還不錯(cuò)呢,后面還可以繼續(xù)添加功能來完善我們的小小網(wǎng)站!
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7080瀏覽量
89175 -
Web
+關(guān)注
關(guān)注
2文章
1265瀏覽量
69526 -
python
+關(guān)注
關(guān)注
56文章
4798瀏覽量
84810
原文標(biāo)題:用Python輕松制作一個(gè)股票K線圖網(wǎng)站
文章出處:【微信號:AI科技大本營,微信公眾號:AI科技大本營】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論