使用Flask & Plotly 做股票k线图交互式可视化处理(二)

版权声明:本文为博主原创文章,如若转载请注明出处 https://blog.csdn.net/tonydz0523/article/details/82683862

接上一篇,这篇要实现搜索功能:

创建搜索页面:

在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>

这里要用到bootstrap 的 css,js 可以到官网下载, 然后放static文件夹中,连接:https://getbootstrap.com/docs/4.1/getting-started/download/

项目结构如下:
这里写图片描述

实现搜索后页面跳转

修改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:666@localhost: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:666@localhost: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,多图画在同一网页上,以及传递数据方法。。。。

猜你喜欢

转载自blog.csdn.net/tonydz0523/article/details/82683862
今日推荐