欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Python輕松制作一個(gè)股票K線圖網(wǎng)站

 更新時(shí)間:2022年09月06日 15:44:06   作者:周蘿卜  
在當(dāng)今這個(gè)人手一個(gè)?Web?服務(wù)的年代,GUI?程序還是沒(méi)有?Web?服務(wù)來(lái)的香啊。所以本文將用Python制作一個(gè)簡(jiǎn)單的股票K線圖網(wǎng)站,感興趣的可以了解一下

在前面的文章中,我們學(xué)習(xí)了如何使用 Tkinter 構(gòu)建股票數(shù)據(jù)抓取以及展示K線圖功能,雖然大致的功能已經(jīng)具備,但是在當(dāng)今這個(gè)人手一個(gè) Web 服務(wù)的年代,GUI 程序還是沒(méi)有 Web 服務(wù)來(lái)的香啊。

我們需要用到的知識(shí)包括 PyEcharts 的使用,tushare 庫(kù)獲取股票數(shù)據(jù)的方法以及 Flask 的基本用法。

獲取股票數(shù)據(jù)

我們先來(lái)看下 tushare 的使用,這個(gè)應(yīng)該是當(dāng)前最為流行的股票數(shù)據(jù)庫(kù)了吧,一行代碼,就能輕松獲取某支股票的歷史數(shù)據(jù)

import?tushare?as?ts
df?=?ts.get_hist_data('000001')
print(df)

現(xiàn)在股票的歷史數(shù)據(jù)有了,我們還需要一份股票名稱(chēng)和股票代碼的對(duì)應(yīng)表,同樣通過(guò) tushare 來(lái)獲取

stock_list?=?ts.get_stock_basics()
stock_list.reset_index(inplace=True)
stock_list[['code',?'name']].to_csv('stock_code_name.csv')

這樣就成功保存了一份股票名稱(chēng)和股票代碼的對(duì)應(yīng)數(shù)據(jù)

PyEcharts 作圖

下面再來(lái)看看如何通過(guò) PyEcharts 來(lái)制作 K 線圖,其實(shí)官網(wǎng)上的例子已經(jīng)非常具體了,我們只需要把拿到的歷史股票數(shù)據(jù)做些簡(jiǎn)單處理即可,我這里直接給我的數(shù)據(jù)處理過(guò)程

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()

這樣就可以得到一個(gè)不錯(cuò)的 K 線圖了

下面我們就可以著手完成 Flask 的代碼啦

構(gòu)建 Web 框架

首先我們先來(lái)完成 Web 框架的整體編寫(xiě),為了頁(yè)面的美觀與編碼的方便,直接使用 bootstrap 來(lái)構(gòu)建前端頁(yè)面

視圖函數(shù)編寫(xiě)

首先完成初始化工作,在項(xiàng)目目錄下創(chuàng)建一個(gè) 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)入需要用到的庫(kù),并完成 flask app 的初始化工作。

接下來(lái)再寫(xiě)一個(gè) 404 的視圖函數(shù),統(tǒng)一處理所有的 Not Found 頁(yè)面

@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")

模板編寫(xiě)

在同級(jí)目錄創(chuàng)建一個(gè) templates 文件夾,創(chuàng)建三個(gè) HTML 文件,分別為 404.html,base.html 和 index.html

base.html 是所有其他頁(yè)面 HTML 模板的母模板

{%?extends?"bootstrap/base.html"?%}

{%?block?title?%}我的股票走勢(shì)網(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)建一個(gè)導(dǎo)航欄,并定義相關(guān)的 block 內(nèi)容

接下來(lái)編寫(xiě) 404.html 文件,展示非法 url 請(qǐng)求地址時(shí)的頁(yè)面

{%?extends?"base.html"?%}

{%?block?title?%}Page?Not?Found{%?endblock?%}

{%?block?page_content?%}
<div?class="page-header">
????<h1>Not?Found</h1>
</div>
{%?endblock?%}

對(duì)于 index.html 文件,就是我們需要展示 K 線圖的頁(yè)面,我們后面再處理。

編輯主邏輯

首先編寫(xiě)一個(gè)檢查股票正確性的函數(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

接下來(lái)再編寫(xiě)獲取股票數(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 目錄下,再編寫(xiě)一個(gè)用于調(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()

首先通過(guò) request 變量獲取到前端傳遞過(guò)來(lái)的數(shù)據(jù),分別為 stockName 和 queryTime,如果這兩個(gè)參數(shù)是空值時(shí),則賦予它們一個(gè)默認(rèn)值。

接著判斷股票代碼的正確性并獲取股票歷史數(shù)據(jù)。

最后調(diào)用 kline_base 函數(shù)畫(huà)出 K 線圖,并渲染到前端頁(yè)面上。

前端頁(yè)面編寫(xiě)

最后我們來(lái)完成前端頁(yè)面的工作

首先定義一個(gè)表單,用于傳遞股票名稱(chēng),查詢(xún)時(shí)間

<form?id="form1"?onsubmit="return?false"?action="#"?method="post">
?????????????<p?id="p1">股票名稱(chēng):
?????????????????<input?name="stockName"?type="text"?id="stockName"?tabindex="1"?size="16"?value=""?placeholder="股票名稱(chēng)"/>
?????????????</p>
?????????????<p?id="p2">查詢(xún)時(shí)間:
?????????????????<input?name="queryTime"?type="text"?id="queryTime"?tabindex="2"?size="16"?value=""?placeholder="輸入30查詢(xún)近30天數(shù)據(jù)"/>
?????????????</p>
?????????????<p><input?type="submit"?value="查詢(xún)"?onclick="getData()"></p>
?????????</form>

然后就是通過(guò) JQuery 來(lái)動(dòng)態(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("錯(cuò)誤的股票代碼!");
????????????????}
????????????});
????????}

最后我們看下整體的效果

到此這篇關(guān)于基于Python輕松制作一個(gè)股票K線圖網(wǎng)站的文章就介紹到這了,更多相關(guān)Python股票K線圖網(wǎng)站內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Python內(nèi)置庫(kù)實(shí)現(xiàn)創(chuàng)建命令行應(yīng)用程序

    利用Python內(nèi)置庫(kù)實(shí)現(xiàn)創(chuàng)建命令行應(yīng)用程序

    Python?有一個(gè)叫做argparse的內(nèi)置庫(kù),可以用它來(lái)創(chuàng)建一個(gè)命令行界面。本文將詳解如何利用argparse實(shí)現(xiàn)創(chuàng)建一個(gè)命令行應(yīng)用程序,需要的可以參考一下
    2022-06-06
  • 用Python實(shí)現(xiàn)數(shù)據(jù)的透視表的方法

    用Python實(shí)現(xiàn)數(shù)據(jù)的透視表的方法

    今天小編就為大家分享一篇用Python實(shí)現(xiàn)數(shù)據(jù)的透視表的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • 淺析Python中的多進(jìn)程與多線程的使用

    淺析Python中的多進(jìn)程與多線程的使用

    這篇文章主要介紹了Python中的多進(jìn)程與多線程,線程與進(jìn)程一直是Python學(xué)習(xí)和運(yùn)用當(dāng)中的重點(diǎn)和難點(diǎn),本文采用簡(jiǎn)單的例子進(jìn)行講解,需要的朋友可以參考下
    2015-04-04
  • python刪除列表中特定元素的幾種方法

    python刪除列表中特定元素的幾種方法

    這篇文章主要介紹了python刪除列表中特定元素的幾種方法,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • 打包發(fā)布Python模塊的方法詳解

    打包發(fā)布Python模塊的方法詳解

    這篇文章我們來(lái)學(xué)習(xí)打包與發(fā)布你的Python模塊的基礎(chǔ)知識(shí)以及方法,非常的簡(jiǎn)單實(shí)用。所以不要浪費(fèi)時(shí)間了,咱們開(kāi)始吧!
    2016-09-09
  • Python Tornado批量上傳圖片并顯示功能

    Python Tornado批量上傳圖片并顯示功能

    Tornado龍卷風(fēng)是一個(gè)開(kāi)源的網(wǎng)絡(luò)服務(wù)器框架,它是基于社交聚合網(wǎng)站FriendFeed的實(shí)時(shí)信息服務(wù)開(kāi)發(fā)而來(lái)的。這篇文章主要介紹了Python Tornado批量上傳圖片并顯示,需要的朋友可以參考下
    2020-03-03
  • Python利用Matplotlib繪制柱狀圖(豎直柱狀圖和水平柱狀圖)、直方圖和餅狀圖

    Python利用Matplotlib繪制柱狀圖(豎直柱狀圖和水平柱狀圖)、直方圖和餅狀圖

    這篇文章主要給大家介紹了關(guān)于Python利用Matplotlib繪制柱狀圖(豎直柱狀圖和水平柱狀圖)、直方圖和餅狀圖的相關(guān)資料,Python使用matplotlib畫(huà)圖是非常方便的,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • 詳解python的幾種標(biāo)準(zhǔn)輸出重定向方式

    詳解python的幾種標(biāo)準(zhǔn)輸出重定向方式

    這篇文章是基于Python2.7版本,介紹常見(jiàn)的幾種標(biāo)準(zhǔn)輸出(stdout)重定向方式。顯然,這些方式也適用于標(biāo)準(zhǔn)錯(cuò)誤重定向。學(xué)習(xí)python的小伙伴們可以參考借鑒。
    2016-08-08
  • python matplotlib折線圖樣式實(shí)現(xiàn)過(guò)程

    python matplotlib折線圖樣式實(shí)現(xiàn)過(guò)程

    這篇文章主要介紹了python matplotlib折線圖樣式實(shí)現(xiàn)過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • python Elasticsearch索引建立和數(shù)據(jù)的上傳詳解

    python Elasticsearch索引建立和數(shù)據(jù)的上傳詳解

    在本篇文章里小編給大家整理的是關(guān)于基于python的Elasticsearch索引的建立和數(shù)據(jù)的上傳的知識(shí)點(diǎn)內(nèi)容,需要的朋友們參考下。
    2019-08-08

最新評(píng)論