1. 程式人生 > >使用Flask & Plotly 做股票k線圖互動式視覺化處理(二)

使用Flask & Plotly 做股票k線圖互動式視覺化處理(二)

接上一篇,這篇要實現搜尋功能:

建立搜尋頁面:

在templates資料夾內新建main.html檔案,內容如下:

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <meta
name="author" content="">
<link rel="icon" href="
{{ url_for('static', filename='favicon.ico') }}"> <title>stock-graph</title> <!--引入 Bootstrap core CSS --> <link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet"> <!--引入Bootstrap core js-->
<script src="
{{ url_for('static', filename='js/bootstrap.min.js') }}"></script> </head> <body> <div class="container-fluid"> <!--建立一個搜尋的form--> <form style="padding-top: 70px" method="post"> <div class="form-row justify-content-center"
>
<div class="col-7"> <input class="form-control" type="search" placeholder="輸入股票程式碼.." name="search" id="search1"> </div> <div class="col-1"> <button class="btn btn-outline-success" type="submit">搜尋</button> </div> </div> </form> <div class="row justify-content-center"> <div class="col-8"> <div class="alert alert-light" role="alert"> <strong>
{{sign}}</strong> </div> </div> </div> </div> </body> </html>

專案結構如下: 這裡寫圖片描述

實現搜尋後頁面跳轉

修改view.py 檔案,

from flask import render_template, Flask, request

app = Flask(__name__)
# 接收方式為post和get
@app.route('/', methods=["POST", "GET"])
def homepage():
    try:
        if request.method == 'POST':        #接收post資料
            search = request.form['search']         # 獲取name為search的表單資料
            print(search)
            if search == 'stock':           # 這裡只是做個試驗,判斷是否為stock,是的話 返回stock.html網頁
                return render_template("stock.html")
        else:
            return render_template('main.html')
    except Exception as e:
        return render_template("main.html", error=e)

這是我們執行 run 檔案: 開啟頁面是: 這裡寫圖片描述

在搜尋欄裡輸入stock,實現跳轉。。: 這裡寫圖片描述

提取股票名和股票程式碼

這裡我們提取mysql中儲存的所有股票的股票名和股票程式碼存入另一個表中方便搜尋:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
import pandas as pd
from sqlalchemy.types import NVARCHAR, Float, Integer

engine = create_engine('mysql+pymysql://ffzs:[email protected]:3306/stock')

BaseModel = declarative_base()

# 獲取database 的 所有table
BaseModel.metadata.reflect(engine)
tables = BaseModel.metadata.tables
# 獲取所有table名稱
tables_names = list(tables.keys())

df = pd.DataFrame()
# 寫入名稱列
df['名稱'] = tables_names
# 寫入程式碼列
df['程式碼'] = list(map(lambda x: x.split('(')[1].split(')')[0], tables_names))
con = engine.connect()

def map_types(df):
    dtypedict = {}
    for i, j in zip(df.columns, df.dtypes):
        if "object" in str(j):
            dtypedict.update({i: NVARCHAR(length=255)})
        if "float" in str(j):
            dtypedict.update({i: Float(precision=2, asdecimal=True)})
        if "int" in str(j):
            dtypedict.update({i: Integer()})    
    return dtypedict

df.to_sql(name='股票程式碼', con=con, if_exists='replace', index=False, dtype=map_types(df))

con.close()

成功匯入: 這裡寫圖片描述

搜尋關聯資料庫

這裡的邏輯是,根據search獲得的股票程式碼,找到相應的股票名稱,進而找到股票的table,然後將其寫入pandas.Dataframe 中然後使用 plotly做視覺化,將視覺化檔案儲存為stock.html,網頁載入。。 這裡改寫了一下之前畫圖的指令碼: get_graph_html.py

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
import pandas as pd
import plotly.offline as po
import plotly.graph_objs as go


def get_graph(search):
    try:
        # 建立基礎類
        engine = create_engine('mysql+pymysql://ffzs:[email protected]:3306/stock')
        BaseModel = declarative_base()
        # 初始話資料庫記過,與資料庫連線
        BaseModel.metadata.create_all(engine)
        # 例項化一個會話,之後通過session進行操作
        con = engine.connect()
        df_stock_name = pd.read_sql("select 名稱 from `股票程式碼` where 程式碼={}".format(search), con=con)
        stock_name = df_stock_name.values[0][0]
        df = pd.read_sql('select *  from `{}`'.format(stock_name), con=con)

        trace = go.Candlestick(x=df['日期'],
                               open=df['開盤價'],
                               high=df['最高價'],
                               low=df['最低價'],
                               close=df['收盤價'])
        data = [trace]
        layout = {
            'title': stock_name}
        fig = dict(data=data, layout=layout)
        po.plot(fig, filename='templates/stock.html', auto_open=False)
        con.close()
        return True  
    except:
        return False

更改view.py檔案:

from flask import render_template, Flask, request
from stockapp.get_graph_html import get_graph
app = Flask(__name__)
# 接收方式為post和get
@app.route('/', methods=["POST", "GET"])
def homepage():
    try:
        if request.method == 'POST':        #接收post資料
            search = request.form['search']         # 獲取name為search的表單資料
            result = get_graph(search)        #
            if result == True:
                return render_template("stock.html")
            else:
                return render_template('main.html', sign='沒有查到')
        else:
            return render_template('main.html')
    except Exception as e:
        return render_template("main.html", sign=e)

這是再執行run檔案: 找一個你資料庫內的股票程式碼試一下:

這裡寫圖片描述

成功跳轉: 這裡寫圖片描述

試試查詢別的: 這裡寫圖片描述

本篇到處為止,下一篇使用js,多圖畫在同一網頁上,以及傳遞資料方法。。。。