用Python轻松制作一个股票K线图网站

优采云 发布时间: 2022-09-18 10:48

  用Python轻松制作一个股票K线图网站

  在前面的文章中,我们学习了如何使用 Tkinter 构建*敏*感*词*抓取以及展示K线图功能,虽然大致的功能已经具备,但是在当今这个人手一个 Web 服务的年代,GUI 程序还是没有 Web 服务来的香啊。

  我们需要用到的知识包括 PyEcharts 的使用,tushare 库获取*敏*感*词*的方法以及 Flask 的基本用法。

  获取*敏*感*词*

  我们先来看下 tushare 的使用,这个应该是当前最为流行的*敏*感*词*库了吧,一行代码,就能轻松获取某支股票的历史数据

  import tushare as ts<br />df = ts.get_hist_data('000001')<br />print(df)<br />

  现在股票的历史数据有了,我们还需要一份股票名称和股票代码的对应表,同样通过 tushare 来获取

  stock_list = ts.get_stock_basics()<br />stock_list.reset_index(inplace=True)<br />stock_list[['code', 'name']].to_csv('stock_code_name.csv')<br />

  这样就成功保存了一份股票名称和股票代码的对应数据

  PyEcharts 作图

  下面再来看看如何通过 PyEcharts 来制作 K 线图,其实官网上的例子已经非常具体了,我们只需要把拿到的历史*敏*感*词*做些简单处理即可,我这里直接给我的数据处理过程

  mydate = df[:30].index.tolist()<br />mydata = df[:30][['open', 'close', 'low', 'high']].values.tolist()<br /><br /><br />def kline_base(mydate, data) -> Kline:<br />    c = (<br />        Kline()<br />        .add_xaxis(mydate)<br />        .add_yaxis("kline", data)<br />        .set_global_opts(<br />            yaxis_opts=opts.AxisOpts(is_scale=True,<br />                                    splitarea_opts=opts.SplitAreaOpts(<br />                    is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)<br />                ),<br />            ),<br />            xaxis_opts=opts.AxisOpts(is_scale=True,<br />                                    axislabel_opts=opts.LabelOpts(rotate=-30)),<br />            title_opts=opts.TitleOpts(title="Kline-基本示例"),<br />            datazoom_opts=[opts.DataZoomOpts()],<br />        )<br />    )<br />    return c<br /><br />kline_base(mydate, mydata).render_notebook()<br />

  这样就可以得到一个不错的 K 线图了

  下面我们就可以着手完成 Flask 的代码啦

  构建 Web 框架

  首先我们先来完成 Web 框架的整体编写,为了页面的美观与编码的方便,直接使用 bootstrap 来构建前端页面

  视图函数编写

  

  首先完成初始化工作,在项目目录下创建一个 app.py 文件

  from flask import Flask, render_template, request<br />from pyecharts import options as opts<br />from pyecharts.charts import Kline<br />import tushare as ts<br />import pandas as pd<br />from flask_bootstrap import Bootstrap<br /><br />app = Flask(__name__)<br />bootstrap = Bootstrap(app)<br />

  导入需要用到的库,并完成 flask app 的初始化工作。

  接下来再写一个 404 的视图函数,统一处理所有的 Not Found 页面

  @app.errorhandler(404)<br />def page_not_found(e):<br />    return render_template("404.html"), 404<br />

  接着我们绑定根地址到 index 视图函数上,返回到 index.html 模板文件上

  @app.route("/")<br />def index():<br />    return render_template("index.html")<br />

  模板编写

  在同级目录创建一个 templates 文件夹,创建三个 HTML 文件,分别为 404.html,base.html 和 index.html

  base.html 是所有其他页面 HTML 模板的母模板

  {% extends "bootstrap/base.html" %}<br /><br />{% block title %}我的股票走势网站{% endblock %}<br /><br /><br />{% block navbar %}<br /><br />    <br />        <br />            <br />                Toggle navigation<br />                <br />                <br />                <br />            <br />            Stock-Data<br />        <br />        <br />            <br />                Home<br />            <br />        <br />    <br /><br />{% endblock %}<br /><br />{% block content %}<br /><br />    {% block page_content %}<br />    {% endblock %}<br /><br />{% endblock %}<br />

  创建一个导航栏,并定义相关的 block 内容

  接下来编写 404.html 文件,展示非法 url 请求地址时的页面

  {% extends "base.html" %}<br /><br />{% block title %}Page Not Found{% endblock %}<br /><br />{% block page_content %}<br /><br />    Not Found<br /><br />{% endblock %}<br />

  对于 index.html 文件,就是我们需要展示 K 线图的页面,我们后面再处理。

  编辑主逻辑

  首先编写一个检查股票正确性的函数

  def check_stock(code):<br />    n = 0<br />    l = []<br />    stock_code = pd.read_csv("stock_code_name.csv", dtype=object)<br />    stock_code.drop('Unnamed: 0', axis=1, inplace=True)<br />    stock_list = stock_code.values.tolist()<br />    for i in stock_list:<br />        if code in i:<br />            n += 1<br />            l = i<br />        else:<br />            continue<br />    return n, l<br />

  如果股票正确,则返回 n=1,否则返回 n=0

  接下来再编写获取*敏*感*词*的函数

  def get_stock_data(code, ctime):<br />    df = ts.get_hist_data(code)<br />    mydate = df[:ctime].index.tolist()<br />    mydata = df[:ctime][['open', 'close', 'low', 'high']].values.tolist()<br />    return [mydate, mydata]<br />

  

  下面就是把 PyEcharts 集成到 Flask 应用了,可以按照官方的教程走,把 PyEcharts 的样式文件等拷贝到自己的 templates 目录下,再编写一个用于调用 kline_base() 函数的视图函数

  @app.route("/Kline", methods=['GET', 'POST'])<br />def get_kline_chart():<br />    stock_name = request.form.get('stockName')<br />    query_time = request.form.get('queryTime')<br />    if not stock_name:<br />        stock_name = '平安银行'<br />    if not query_time:<br />        query_time = 30<br />    status, stock_code = check_stock(stock_name)<br />    if status == 0:<br />        return 'error stock code or name'<br />    mydate, mydata = get_stock_data(stock_code[0], int(query_time))<br />    c = kline_base(mydate, mydata, stock_code[1])<br />    return c.dump_options()<br />

  首先通过 request 变量获取到前端传递过来的数据,分别为 stockName 和 queryTime,如果这两个参数是空值时,则赋予它们一个默认值。

  接着判断股票代码的正确性并获取股票历史数据。

  最后调用 kline_base 函数画出 K 线图,并渲染到前端页面上。

  前端页面编写

  最后我们来完成前端页面的工作

  首先定义一个表单,用于传递股票名称,查询时间

  <br />             股票名称:<br />                 <br />             <br />             查询时间:<br />                 <br />             <br />             <br />         <br />

  然后就是通过 JQuery 来动态获取数据

  function getData() {<br />            var chart = echarts.init(document.getElementById('kline'), 'white', {renderer: 'canvas'});<br />            $.ajax({<br />                type: "POST",<br />                dataType: "json",<br />                url: "/Kline" ,<br />                data: $('#form1').serialize(),<br />                success: function (result) {<br />                    chart.setOption(result);<br />                },<br />                error: function() {<br />                    alert("错误的股票代码!");<br />                }<br />            });<br />        }<br />

  最后我们看下整体的效果

  是不是效果还不错呢,后面还可以继续添加功能来完善我们的小小网站!

  【室长原理课】系列在不正经地科普一些互联网小知识,没有太多高深的内容,把这个系列分享给你的朋友吧!

  喜欢此内容的人还喜欢

  主线教程系列(有更新):

  番外系列:

  Pandas、Numpy系列:

  数据可视化系列:

  【Python教程】让图表的色彩更丰富!matplotlib中的colormap

  办公自动化系列:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线