基于Python輕松制作一個股票K線圖網(wǎng)站
在前面的文章中,我們學(xué)習(xí)了如何使用 Tkinter 構(gòu)建股票數(shù)據(jù)抓取以及展示K線圖功能,雖然大致的功能已經(jīng)具備,但是在當(dāng)今這個人手一個 Web 服務(wù)的年代,GUI 程序還是沒有 Web 服務(wù)來的香啊。
我們需要用到的知識包括 PyEcharts 的使用,tushare 庫獲取股票數(shù)據(jù)的方法以及 Flask 的基本用法。
獲取股票數(shù)據(jù)
我們先來看下 tushare 的使用,這個應(yīng)該是當(dāng)前最為流行的股票數(shù)據(jù)庫了吧,一行代碼,就能輕松獲取某支股票的歷史數(shù)據(jù)
import?tushare?as?ts 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ù)
PyEcharts 作圖
下面再來看看如何通過 PyEcharts 來制作 K 線圖,其實官網(wǎng)上的例子已經(jīng)非常具體了,我們只需要把拿到的歷史股票數(shù)據(jù)做些簡單處理即可,我這里直接給我的數(shù)據(jù)處理過程
mydate?=?df[:30].index.tolist() mydata?=?df[:30][['open',?'close',?'low',?'high']].values.tolist() def?kline_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()], ????????) ????) ????return?c kline_base(mydate,?mydata).render_notebook()
這樣就可以得到一個不錯的 K 線圖了
下面我們就可以著手完成 Flask 的代碼啦
構(gòu)建 Web 框架
首先我們先來完成 Web 框架的整體編寫,為了頁面的美觀與編碼的方便,直接使用 bootstrap 來構(gòu)建前端頁面
視圖函數(shù)編寫
首先完成初始化工作,在項目目錄下創(chuàng)建一個 app.py 文件
from?flask?import?Flask,?render_template,?request from?pyecharts?import?options?as?opts from?pyecharts.charts?import?Kline import?tushare?as?ts import?pandas?as?pd from?flask_bootstrap?import?Bootstrap app?=?Flask(__name__) bootstrap?=?Bootstrap(app)
導(dǎo)入需要用到的庫,并完成 flask app 的初始化工作。
接下來再寫一個 404 的視圖函數(shù),統(tǒng)一處理所有的 Not Found 頁面
@app.errorhandler(404) def?page_not_found(e): ????return?render_template("404.html"),?404
接著我們綁定根地址到 index 視圖函數(shù)上,返回到 index.html 模板文件上
@app.route("/") def?index(): ????return?render_template("index.html")
模板編寫
在同級目錄創(chuàng)建一個 templates 文件夾,創(chuàng)建三個 HTML 文件,分別為 404.html,base.html 和 index.html
base.html 是所有其他頁面 HTML 模板的母模板
{%?extends?"bootstrap/base.html"?%} {%?block?title?%}我的股票走勢網(wǎng)站{%?endblock?%} {%?block?navbar?%} <div?class="navbar?navbar-inverse"?role="navigation"> ????<div?class="container"> ????????<div?class="navbar-header"> ????????????<button?type="button"?class="navbar-toggle"?data-toggle="collapse"?data-target=".navbar-collapse"> ????????????????<span?class="sr-only">Toggle?navigation</span> ????????????????<span?class="icon-bar"></span> ????????????????<span?class="icon-bar"></span> ????????????????<span?class="icon-bar"></span> ????????????</button> ????????????<a?class="navbar-brand"?href="/" rel="external nofollow" rel="external nofollow" >Stock-Data</a> ????????</div> ????????<div?class="navbar-collapse?collapse"> ????????????<ul?class="nav?navbar-nav"> ????????????????<li><a?href="/" rel="external nofollow" rel="external nofollow" >Home</a></li> ????????????</ul> ????????</div> ????</div> </div> {%?endblock?%} {%?block?content?%} <div?class="container"> ????{%?block?page_content?%} ????{%?endblock?%} </div> {%?endblock?%}
創(chuàng)建一個導(dǎo)航欄,并定義相關(guān)的 block 內(nèi)容
接下來編寫 404.html 文件,展示非法 url 請求地址時的頁面
{%?extends?"base.html"?%} {%?block?title?%}Page?Not?Found{%?endblock?%} {%?block?page_content?%} <div?class="page-header"> ????<h1>Not?Found</h1> </div> {%?endblock?%}
對于 index.html 文件,就是我們需要展示 K 線圖的頁面,我們后面再處理。
編輯主邏輯
首先編寫一個檢查股票正確性的函數(shù)
def?check_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() ????for?i?in?stock_list: ????????if?code?in?i: ????????????n?+=?1 ????????????l?=?i ????????else: ????????????continue ????return?n,?l
如果股票正確,則返回 n=1,否則返回 n=0
接下來再編寫獲取股票數(shù)據(jù)的函數(shù)
def?get_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 目錄下,再編寫一個用于調(diào)用 kline_base() 函數(shù)的視圖函數(shù)
@app.route("/Kline",?methods=['GET',?'POST']) def?get_kline_chart(): ????stock_name?=?request.form.get('stockName') ????query_time?=?request.form.get('queryTime') ????if?not?stock_name: ????????stock_name?=?'平安銀行' ????if?not?query_time: ????????query_time?=?30 ????status,?stock_code?=?check_stock(stock_name) ????if?status?==?0: ????????return?'error?stock?code?or?name' ????mydate,?mydata?=?get_stock_data(stock_code[0],?int(query_time)) ????c?=?kline_base(mydate,?mydata,?stock_code[1]) ????return?c.dump_options()
首先通過 request 變量獲取到前端傳遞過來的數(shù)據(jù),分別為 stockName 和 queryTime,如果這兩個參數(shù)是空值時,則賦予它們一個默認(rèn)值。
接著判斷股票代碼的正確性并獲取股票歷史數(shù)據(jù)。
最后調(diào)用 kline_base 函數(shù)畫出 K 線圖,并渲染到前端頁面上。
前端頁面編寫
最后我們來完成前端頁面的工作
首先定義一個表單,用于傳遞股票名稱,查詢時間
<form?id="form1"?onsubmit="return?false"?action="#"?method="post"> ?????????????<p?id="p1">股票名稱: ?????????????????<input?name="stockName"?type="text"?id="stockName"?tabindex="1"?size="16"?value=""?placeholder="股票名稱"/> ?????????????</p> ?????????????<p?id="p2">查詢時間: ?????????????????<input?name="queryTime"?type="text"?id="queryTime"?tabindex="2"?size="16"?value=""?placeholder="輸入30查詢近30天數(shù)據(jù)"/> ?????????????</p> ?????????????<p><input?type="submit"?value="查詢"?onclick="getData()"></p> ?????????</form>
然后就是通過 JQuery 來動態(tài)獲取數(shù)據(jù)
function?getData()?{ ????????????var?chart?=?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("錯誤的股票代碼!"); ????????????????} ????????????}); ????????}
最后我們看下整體的效果
到此這篇關(guān)于基于Python輕松制作一個股票K線圖網(wǎng)站的文章就介紹到這了,更多相關(guān)Python股票K線圖網(wǎng)站內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Python內(nèi)置庫實現(xiàn)創(chuàng)建命令行應(yīng)用程序
Python?有一個叫做argparse的內(nèi)置庫,可以用它來創(chuàng)建一個命令行界面。本文將詳解如何利用argparse實現(xiàn)創(chuàng)建一個命令行應(yīng)用程序,需要的可以參考一下2022-06-06用Python實現(xiàn)數(shù)據(jù)的透視表的方法
今天小編就為大家分享一篇用Python實現(xiàn)數(shù)據(jù)的透視表的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11Python利用Matplotlib繪制柱狀圖(豎直柱狀圖和水平柱狀圖)、直方圖和餅狀圖
這篇文章主要給大家介紹了關(guān)于Python利用Matplotlib繪制柱狀圖(豎直柱狀圖和水平柱狀圖)、直方圖和餅狀圖的相關(guān)資料,Python使用matplotlib畫圖是非常方便的,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12詳解python的幾種標(biāo)準(zhǔn)輸出重定向方式
這篇文章是基于Python2.7版本,介紹常見的幾種標(biāo)準(zhǔn)輸出(stdout)重定向方式。顯然,這些方式也適用于標(biāo)準(zhǔn)錯誤重定向。學(xué)習(xí)python的小伙伴們可以參考借鑒。2016-08-08python matplotlib折線圖樣式實現(xiàn)過程
這篇文章主要介紹了python matplotlib折線圖樣式實現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11python Elasticsearch索引建立和數(shù)據(jù)的上傳詳解
在本篇文章里小編給大家整理的是關(guān)于基于python的Elasticsearch索引的建立和數(shù)據(jù)的上傳的知識點內(nèi)容,需要的朋友們參考下。2019-08-08