Day 73:【99天精通Python】金融数据看板 - 后端接口与数据分析

Day 73:【99天精通Python】金融数据看板 - 后端接口与数据分析

前言

欢迎来到第73天!

在昨天,我们成功地将股票历史数据存入了 SQLite 数据库。今天,我们的任务是将这些"死数据"变成"活数据"。

前端(ECharts)需要特定的 JSON 格式才能画图。我们需要在后端:

  1. 查询数据库。
  2. 使用 Pandas 计算技术指标(如 MA5, MA20)。
  3. 将数据格式化为 JSON 并通过 API 返回。

本节内容:

  • Pandas 读取 SQL 数据 (read_sql)
  • 计算移动平均线
  • 编写 RESTful API 接口
  • 处理跨域问题 (CORS)

一、编写数据分析服务 (services/analysis.py)

我们需要一个模块,专门负责从数据库取数并计算指标。

importpandasaspdfromappimportdbfrommodelsimportStockDailyclassStockAnalyzer:defget_kline_data(self,code):"""获取 K 线图所需的数据"""# 1. 使用 Pandas 直接读取 SQL (效率高)# 仅读取需要的字段,按日期升序sql=db.session.query(StockDaily.date,StockDaily.open,StockDaily.close,StockDaily.low,StockDaily.high,StockDaily.volume).filter(StockDaily.code==code).order_by(StockDaily.date.asc()).statement df=pd.read_sql(sql,db.session.bind)ifdf.empty:returnNone# 2. 计算均线df['MA5']=df['close'].rolling(window=5).mean()df['MA10']=df['close'].rolling(window=10).mean()df['MA20']=df['close'].rolling(window=20).mean()# 3. 填充 NaN (ECharts 不支持 NaN,需转为 None 或 0,这里前端处理通常更方便,或者填0)df=df.fillna(0)# 4. 格式化日期字符串df['date']=df['date'].astype(str)returndfdefget_stock_list(self):"""获取所有股票列表用于搜索"""sql="SELECT code, code_name FROM stock_basic"df=pd.read_sql(sql,db.session.bind)returndf.to_dict(orient='records')

二、编写 API 路由 (app.py)

修改app.py,增加两个 API 接口。

fromflaskimportFlask,jsonify,requestfromflask_sqlalchemyimportSQLAlchemyfromconfigimportConfig# 引入分析服务fromservices.analysisimportStockAnalyzer app=Flask(__name__)app.config.from_object(Config)db=SQLAlchemy(app)analyzer=StockAnalyzer()# 1. 股票搜索接口@app.route("/api/stocks")defapi_stocks():stocks=analyzer.get_stock_list()returnjsonify(stocks)# 2. K线数据接口@app.route("/api/kline/<code>")defapi_kline(code):df=analyzer.get_kline_data(code)ifdfisNone:returnjsonify({"error":"No data found"}),404# ECharts 需要的数据格式通常是独立的列表# dates: ['2023-01-01', ...]# values: [[open, close, low, high], ...] (注意 ECharts 的 K线顺序)# volumes: [vol1, vol2...]data={"dates":df['date'].tolist(),# ECharts Candlestick: [open, close, low, high]"values":df[['open','close','low','high']].values.tolist(),"volumes":df['volume'].tolist(),"ma5":df['MA5'].tolist(),"ma10":df['MA10'].tolist(),"ma20":df['MA20'].tolist()}returnjsonify(data)if__name__=="__main__":app.run(debug=True)

三、测试 API

启动 Flask (python app.py),在浏览器或 Postman 中访问:

  1. http://127.0.0.1:5000/api/stocks

    • 预期返回:[{"code": "sh.600519", "code_name": "贵州茅台"}, ...]
  2. http://127.0.0.1:5000/api/kline/sh.600519

    • 预期返回:
      {"dates":["2023-01-04",...],"values":[[1727.0,1725.01,1718.0,1738.0],...],"ma5":[0,0,0,0,1730.2,...],...}

四、解决跨域问题 (CORS)

虽然我们在同一个项目里开发,但如果将来前端和后端分开部署(比如前端用 Vue 跑在 8080,后端 Flask 跑在 5000),就会遇到跨域报错。
我们可以使用flask-cors扩展来未雨绸缪。

安装:

pipinstallflask-cors

修改app.py

fromflask_corsimportCORS app=Flask(__name__)CORS(app)# 允许所有来源的跨域请求

五、小结

pd.read_sql

DataFrame

计算 MA

Format JSON

Response

前端请求 /api/kline/600519

Flask Route

StockAnalyzer

SQLite

关键要点

  1. Pandas + SQLread_sql是连接数据库与数据分析的桥梁,比手动cursor.fetchall再转 DataFrame 快且方便。
  2. 数据清洗:在后端计算好 MA 等指标,前端只负责展示,这是比较好的架构模式(轻前端,重后端)。
  3. JSON 序列化:NumPy/Pandas 的数据类型(如int64)不能直接被jsonify序列化,通常需要tolist()转为原生 Python 列表。

六、课后作业

  1. 增加指标:修改analysis.py,增加RSI (相对强弱指标)MACD的计算,并添加到 API 返回结果中。
  2. 日期筛选:给 API 增加start_dateend_date参数,允许前端只请求最近 3 个月的数据(减少传输量)。
  3. 异常处理:如果用户请求了一个不存在的股票代码,API 应该返回什么样的状态码和错误信息?完善这部分逻辑。

下节预告

Day 74:金融数据看板 - 前端展示 (ECharts)- 后端数据已经准备就绪。明天我们将编写 HTML 和 JS,使用 ECharts 绘制出专业的交互式 K 线图!


系列导航

  • 上一篇:Day 72 - 金融数据看板数据层实现
  • 下一篇:Day 74 - 金融数据看板前端ECharts(待更新)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1170984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么证件照总不合规?AI智能工坊保姆级教程一文详解

为什么证件照总不合规&#xff1f;AI智能工坊保姆级教程一文详解 1. 引言&#xff1a;证件照的“隐形门槛” 在日常生活中&#xff0c;无论是办理身份证、护照、社保卡&#xff0c;还是投递简历、报名考试&#xff0c;我们都需要提交符合规范的证件照。然而&#xff0c;很多人…

opencv实战-人脸检测

一 人脸检测进行获取数据包1 传入参数orderDict&#xff08;&#xff09; 按照循序进行导入字典 拒绝乱序访问方式使用命名空间对象使用字典&#xff08;args&#xff09;语法​args.shape_predictorargs["shape_predictor"]动态访问​不方便方便&#xff1a;args[ke…

树莓派插针定义应用场景:4B温度传感器接线指南

树莓派4B接温度传感器&#xff1f;别再被引脚搞晕了&#xff01;一文讲透DS18B20和DHT实战接线你是不是也曾在面包板前拿着杜邦线犹豫不决&#xff1a;这根该插哪个孔&#xff1f;GPIO4到底是第几号物理针脚&#xff1f;为什么读出来温度总是85C&#xff1f;别急&#xff0c;这…

Llama3-8B定时任务处理?Cron调度实战案例

Llama3-8B定时任务处理&#xff1f;Cron调度实战案例 1. 引言&#xff1a;从本地大模型部署到自动化调度的演进 随着大语言模型&#xff08;LLM&#xff09;在企业与个人场景中的广泛应用&#xff0c;如何将模型推理能力集成到日常自动化流程中&#xff0c;成为提升效率的关键…

实测阿里Paraformer模型,识别速度达5倍实时太强了

实测阿里Paraformer模型&#xff0c;识别速度达5倍实时太强了 1. 引言&#xff1a;中文语音识别的新选择 随着人工智能技术的快速发展&#xff0c;自动语音识别&#xff08;ASR&#xff09;在会议记录、访谈转写、语音输入等场景中扮演着越来越重要的角色。在众多开源ASR方案…

用bhyve-webadmin来管理FreeBSD系统下的bhyve虚拟机(上)

BVCP&#xff08;(Bhyve Virtual-Machine Control Panel &#xff0c;bhyve-webadmin &#xff09;是一个图形化和安全的web控制面板&#xff0c;旨在管理FreeBSD bhyve虚拟机。BVCP专为数据中心级可靠性而设计&#xff0c;专为连续24/7运行而构建&#xff0c;专注于稳定性和性…

NPP 草原:印度 Vindhyan,1986-1989 年,R1

NPP Grassland: Vindhyan, India, 1986-1989, R1 简介 该数据集包含四个文本格式 (.txt) 的数据文件。其中三个文件提供了 1986 年至 1989 年间印度北部文迪亚高原三个衍生稀树草原的地上和地下生产力数据&#xff0c;每个文件对应三种不同的处理方式。每个研究地点&#xff…

通义千问2.5-7B房地产:户型分析与描述生成

通义千问2.5-7B房地产&#xff1a;户型分析与描述生成 1. 引言 1.1 业务场景描述 在房地产行业&#xff0c;楼盘推广、线上平台展示和客户沟通高度依赖对户型图的精准解读与生动描述。传统方式下&#xff0c;房产文案撰写依赖人工经验&#xff0c;耗时长、成本高&#xff0c…

FSMN-VAD模型切换:多语言VAD适配可能性探讨

FSMN-VAD模型切换&#xff1a;多语言VAD适配可能性探讨 1. 引言 1.1 语音端点检测的技术背景 语音端点检测&#xff08;Voice Activity Detection, VAD&#xff09;是语音信号处理中的基础模块&#xff0c;其核心任务是从连续音频流中准确识别出有效语音段的起止时间&#x…

Day 68:【99天精通Python】设计模式 (Design Patterns) 下篇 - 观察者与策略

Day 68&#xff1a;【99天精通Python】设计模式 (Design Patterns) 下篇 - 观察者与策略 前言 欢迎来到第68天&#xff01; 在昨天的课程中&#xff0c;我们学习了如何优雅地创建对象&#xff08;单例、工厂&#xff09;。今天&#xff0c;我们来关注对象之间的交互。 观察者模…

Z-Image-ComfyUI工作流分享:导出导入JSON文件的操作步骤

Z-Image-ComfyUI工作流分享&#xff1a;导出导入JSON文件的操作步骤 1. 引言 1.1 业务场景描述 在当前AIGC&#xff08;人工智能生成内容&#xff09;快速发展的背景下&#xff0c;图像生成模型的应用日益广泛。Z-Image-ComfyUI作为基于阿里最新开源文生图大模型Z-Image的可…

Sambert性能优化技巧:让语音合成速度提升50%

Sambert性能优化技巧&#xff1a;让语音合成速度提升50% 1. 引言&#xff1a;多情感语音合成的性能挑战 随着AI语音技术在虚拟主播、智能客服、有声读物等场景中的广泛应用&#xff0c;用户对高质量、低延迟的语音合成服务提出了更高要求。Sambert-HifiGAN作为当前主流的中文…

Python3.8图像处理:云端OpenCV预装,免去编译痛苦

Python3.8图像处理&#xff1a;云端OpenCV预装&#xff0c;免去编译痛苦 你是不是也遇到过这种情况&#xff1f;作为一名设计师&#xff0c;想用Python来批量处理图片、自动裁剪构图、提取配色方案&#xff0c;或者给设计稿加水印。兴致勃勃地打开教程&#xff0c;照着代码敲完…

Day 69:【99天精通Python】C/C++ 扩展 (CTypes/Cython) - 给 Python 装上喷气引擎

Day 69&#xff1a;【99天精通Python】C/C 扩展 (CTypes/Cython) - 给 Python 装上喷气引擎 前言 欢迎来到第69天&#xff01; Python 的优点是开发效率极高&#xff0c;但缺点也很明显&#xff1a;运行速度慢&#xff08;相比 C/C&#xff09;。 在绝大多数场景下&#xff0c;…

单目深度估计实战:MiDaS模型部署与优化

单目深度估计实战&#xff1a;MiDaS模型部署与优化 1. 引言 1.1 技术背景 在计算机视觉领域&#xff0c;从单张二维图像中恢复三维空间结构一直是极具挑战性的任务。传统方法依赖多视角几何或激光雷达等硬件设备&#xff0c;成本高且部署复杂。随着深度学习的发展&#xff0…

效果展示:通义千问2.5-7B-Instruct打造的智能写作助手案例

效果展示&#xff1a;通义千问2.5-7B-Instruct打造的智能写作助手案例 1. 引言&#xff1a;为何选择通义千问2.5-7B-Instruct构建智能写作助手 在当前大模型快速发展的背景下&#xff0c;如何选择一个性能强、响应快、部署灵活且支持商用的开源模型&#xff0c;成为构建垂直领…

树莓派换源零基础指南:网络环境要求

树莓派换源实战指南&#xff1a;从卡顿到飞速的秘诀你有没有遇到过这种情况&#xff1a;刚入手树莓派&#xff0c;兴致勃勃地打开终端准备安装Python库或者升级系统&#xff0c;结果一条sudo apt update执行下去&#xff0c;半天不动&#xff0c;进度条像被冻住了一样&#xff…

CC2530零基础入门:串口下载与调试方式详解

CC2530入门实战&#xff1a;串口下载与调试全解析 你是不是也遇到过这种情况——手里的CC2530开发板接上电脑&#xff0c;打开烧录工具&#xff0c;结果提示“无法连接芯片”&#xff1f;反复检查线序、波特率、跳线&#xff0c;就是搞不定。别急&#xff0c;这几乎是每个ZigB…

IndexTTS2效果优化:语调、停顿、重音调节实战技巧

IndexTTS2效果优化&#xff1a;语调、停顿、重音调节实战技巧 1. 引言&#xff1a;提升语音自然度的关键挑战 随着AI语音合成技术的快速发展&#xff0c;用户对TTS&#xff08;Text-to-Speech&#xff09;系统的自然度和表现力提出了更高要求。尽管IndexTTS2在V23版本中显著增…

A.每日一题——2975. 移除栅栏得到的正方形田地的最大面积

题目链接&#xff1a;2975. 移除栅栏得到的正方形田地的最大面积&#xff08;中等&#xff09; 算法原理&#xff1a; 解法&#xff1a;暴力枚举 622ms击败78.57% 时间复杂度O(N) 此题跟上一题 A.每日一题——2943. 最大化网格图中正方形空洞的面积 的不同点&#x1f447; 空洞…