使用Flask & Plotly 做股票k線圖互動式視覺化處理(二)
阿新 • • 發佈:2018-12-09
接上一篇,這篇要實現搜尋功能:
建立搜尋頁面:
在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,多圖畫在同一網頁上,以及傳遞資料方法。。。。