内容简介:公众号后台回复“
今天我们来分享一个 Flask 小应用,如何动手实现一个简易的在线股票 K 线图表。 我们需要用到的知识包括 PyEcharts 的使用,tushare 库获取股票数据的方法以及 Flask 的基本用法。
获取股票数据
我们先来看下 tushare 的使用,这个应该时当前最为流行的股票数据库了吧,一行代码,就能轻松获取某支股票的历史数据
import tushare as ts df = ts.get_hist_data('000001') print(df)
现在股票的历史数据有了,我们还需要一份股票名称和股票代码的对应表,同样通过 tushare 来获取
stock_list = ts.get_stock_basics() stock_list.reset_index(inplace=True) stock_list[['code', 'name']].to_csv('stock_code_name.csv')
这样就成功保存了一份股票名称和股票代码的对应数据
PyEcharts 作图
下面再来看看如何通过 PyEcharts 来制作 K 线图,其实官网上的例子已经非常具体了,我们只需要把拿到的历史股票数据做些简单处理即可,我这里直接给我的数据处理过程
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 的代码啦
构建 Web 框架
首先我们先来完成 Web 框架的整体编写,为了页面的美观与编码的方便,直接使用 bootstrap 来构建前端页面
视图函数编写
首先完成初始化工作,在项目目录下创建一个 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)
导入需要用到的库,并完成 flask app 的初始化工作。
接下来在写一个 404 的视图函数,统一处理所有的 Not Found 页面
@app.errorhandler(404) def page_not_found(e): return render_template("404.html"), 404
接着我们绑定根地址到 index 视图函数上,返回到 index.html 模板文件上
@app.route("/") def index(): return render_template("index.html")
模板编写
在同级目录创建一个 templates 文件夹,创建三个 HTML 文件,分别为 404.html,base.html 和 index.html
base.html 时所有其他页面 HTML 模板的母模板
{% extends "bootstrap/base.html" %} {% block title %}我的股票走势网站{% endblock %} {% block navbar %} <div role="navigation"> <div> <div> <button type="button" data-toggle="collapse" data-target=".navbar-collapse"> <span>Toggle navigation</span> <span></span> <span></span> <span></span> </button> <a href="/">Stock-Data</a> </div> <div> <ul> <li><a href="/">Home</a></li> </ul> </div> </div> </div> {% endblock %} {% block content %} <div> {% block page_content %} {% endblock %} </div> {% endblock %}
创建一个导航栏,并定义相关的 block 内容
接下来编写 404.html 文件,展示非法 url 请求地址时的页面
{% extends "base.html" %} {% block title %}Page Not Found{% endblock %} {% block page_content %} <div> <h1>Not Found</h1> </div> {% endblock %}
对于 index.html 文件,就是我们需要展示 K 线图的页面,我们后面再处理。
编辑主逻辑
首先编写一个检查股票正确性的函数
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
接下来再编写获取股票数据的函数
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 应用了,可以按照官方的教程走,把 PyEcharts 的样式文件等拷贝到自己的 templates 目录下,再编写一个用于调用 kline_base() 函数的视图函数
@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 变量获取到前端传递过来的数据,分别为 stockName 和 queryTime,如果这两个参数是空值时,则赋予它们一个默认值。
接着判断股票代码的正确性并获取股票历史数据。
最后调用 kline_base 函数画出 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天数据"/> </p> <p><input type="submit" value="查询" onclick="getData()"></p> </form>
然后就是通过 JQuery 来动态获取数据
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("错误的股票代码!"); } }); }
最后我们看下整体的效果
是不是效果还不错呢,后面还可以继续添加功能来完善我们的小小网站!
公众号后台回复“ flask ”获取完整代码哦
近期文章
公众号后台回复“ flask ”获取完整代码哦
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Design Accessible Web Sites
Jeremy Sydik / Pragmatic Bookshelf / 2007-11-05 / USD 34.95
It's not a one-browser web anymore. You need to reach audiences that use cell phones, PDAs, game consoles, or other "alternative" browsers, as well as users with disabilities. Legal requirements for a......一起来看看 《Design Accessible Web Sites》 这本书的介绍吧!