社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

AI科技大本营 • 1 年前 • 226 次点击  

在前面的文章中,我们学习了如何使用 Tkinter 构建股票数据抓取以及展示K线图功能,虽然大致的功能已经具备,但是在当今这个人手一个 Web 服务的年代,GUI 程序还是没有 Web 服务来的香啊。
我们需要用到的知识包括 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 class="navbar navbar-inverse" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                <span class="sr-only">Toggle navigationspan>
                <span class="icon-bar">span>
                <span class="icon-bar">span>
                <span class="icon-bar">span>
             button>
            <a class="navbar-brand" href="/">Stock-Dataa>
        div>
        <div class="navbar-collapse collapse">
            <ul class="nav navbar-nav">
                <li><a href="/">Homea>li>
            ul>
        div>
    div>
div>
{% endblock %}

{% block content %}
<div class="container">
    {% block page_content %}
    {% endblock %}
div>
{% endblock %}

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

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

{% extends "base.html" %}

{% block title %}Page Not Found{% endblock %}

{% block page_content %}
class="page-header">
    

Not Found



{% 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(),
                successfunction (result{
                    chart.setOption(result);
                },
                errorfunction() {
                    alert("错误的股票代码!");
                }
            });
        }

最后我们看下整体的效果

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




一个 Python Bug 干倒了估值 1.6 亿美元的公司


如何高效、精准地进行图片搜索?看看轻量化视觉预训练模型


英伟达、AMD 高端芯片断供,国产芯片如何迅速崛起


Python  PDF  Wo rd


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/146883
 
226 次点击