2026/4/8 14:15:48
网站建设
项目流程
做虾网站该起啥名好,西安公司招聘信息,电子商务查询网站,咸阳网站开发哪家好Day 73#xff1a;【99天精通Python】金融数据看板 - 后端接口与数据分析
前言
欢迎来到第73天#xff01;
在昨天#xff0c;我们成功地将股票历史数据存入了 SQLite 数据库。今天#xff0c;我们的任务是将这些死数据变成活数据。
前端#xff…Day 73【99天精通Python】金融数据看板 - 后端接口与数据分析前言欢迎来到第73天在昨天我们成功地将股票历史数据存入了 SQLite 数据库。今天我们的任务是将这些死数据变成活数据。前端ECharts需要特定的 JSON 格式才能画图。我们需要在后端查询数据库。使用 Pandas 计算技术指标如 MA5, MA20。将数据格式化为 JSON 并通过 API 返回。本节内容Pandas 读取 SQL 数据 (read_sql)计算移动平均线编写 RESTful API 接口处理跨域问题 (CORS)一、编写数据分析服务 (services/analysis.py)我们需要一个模块专门负责从数据库取数并计算指标。importpandasaspdfromappimportdbfrommodelsimportStockDailyclassStockAnalyzer:defget_kline_data(self,code):获取 K 线图所需的数据# 1. 使用 Pandas 直接读取 SQL (效率高)# 仅读取需要的字段按日期升序sqldb.session.query(StockDaily.date,StockDaily.open,StockDaily.close,StockDaily.low,StockDaily.high,StockDaily.volume).filter(StockDaily.codecode).order_by(StockDaily.date.asc()).statement dfpd.read_sql(sql,db.session.bind)ifdf.empty:returnNone# 2. 计算均线df[MA5]df[close].rolling(window5).mean()df[MA10]df[close].rolling(window10).mean()df[MA20]df[close].rolling(window20).mean()# 3. 填充 NaN (ECharts 不支持 NaN需转为 None 或 0这里前端处理通常更方便或者填0)dfdf.fillna(0)# 4. 格式化日期字符串df[date]df[date].astype(str)returndfdefget_stock_list(self):获取所有股票列表用于搜索sqlSELECT code, code_name FROM stock_basicdfpd.read_sql(sql,db.session.bind)returndf.to_dict(orientrecords)二、编写 API 路由 (app.py)修改app.py增加两个 API 接口。fromflaskimportFlask,jsonify,requestfromflask_sqlalchemyimportSQLAlchemyfromconfigimportConfig# 引入分析服务fromservices.analysisimportStockAnalyzer appFlask(__name__)app.config.from_object(Config)dbSQLAlchemy(app)analyzerStockAnalyzer()# 1. 股票搜索接口app.route(/api/stocks)defapi_stocks():stocksanalyzer.get_stock_list()returnjsonify(stocks)# 2. K线数据接口app.route(/api/kline/code)defapi_kline(code):dfanalyzer.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(debugTrue)三、测试 API启动 Flask (python app.py)在浏览器或 Postman 中访问http://127.0.0.1:5000/api/stocks预期返回[{code: sh.600519, code_name: 贵州茅台}, ...]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.pyfromflask_corsimportCORS appFlask(__name__)CORS(app)# 允许所有来源的跨域请求五、小结pd.read_sqlDataFrame计算 MAFormat JSONResponse前端请求 /api/kline/600519Flask RouteStockAnalyzerSQLite关键要点Pandas SQLread_sql是连接数据库与数据分析的桥梁比手动cursor.fetchall再转 DataFrame 快且方便。数据清洗在后端计算好 MA 等指标前端只负责展示这是比较好的架构模式轻前端重后端。JSON 序列化NumPy/Pandas 的数据类型如int64不能直接被jsonify序列化通常需要tolist()转为原生 Python 列表。六、课后作业增加指标修改analysis.py增加RSI (相对强弱指标)或MACD的计算并添加到 API 返回结果中。日期筛选给 API 增加start_date和end_date参数允许前端只请求最近 3 个月的数据减少传输量。异常处理如果用户请求了一个不存在的股票代码API 应该返回什么样的状态码和错误信息完善这部分逻辑。下节预告Day 74金融数据看板 - 前端展示 (ECharts)- 后端数据已经准备就绪。明天我们将编写 HTML 和 JS使用 ECharts 绘制出专业的交互式 K 线图系列导航上一篇Day 72 - 金融数据看板数据层实现下一篇Day 74 - 金融数据看板前端ECharts待更新