Plotly Dash回调错误:从数据库拉取数据时K线图无法显示
问题描述
首次使用Plotly Dash实现股票K线图可视化,从CSV拉取数据时图表正常运行,但从SQLite数据库拉取数据时出现回调错误(Call Back Error: updating graph.figure),图表无法正常显示。
用户代码如下:
from dash import Dash, dcc, html, Input, Output import plotly.graph_objects as go import pandas as pd app = Dash(__name__) conn = sqlite3.connect('stocks.db') cursor = conn.cursor() app.layout = html.Div([ html.H4('Apple stock candlestick chart'), dcc.Checklist( id='toggle-rangeslider', options=[{'label': 'Include Rangeslider', 'value': 'slider'}], value=['slider'] ), dcc.Graph(id="graph"), ]) @app.callback( Output("graph", "figure"), Input("toggle-rangeslider", "value")) def display_candlestick(value): cursor = conn.cursor() df = pd.read_sql("SELECT Datetime, Open, High, Low, Close FROM stock_data WHERE Symbol = ?", conn, params=('AAPL',)) fig = go.Figure(go.Candlestick( x=df['Datetime'], open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'] )) fig.update_layout( xaxis_rangeslider_visible='slider' in value ) return fig app.run_server(debug=True)
修复方案
1. 补全缺失的依赖导入
代码中未导入sqlite3库,这是数据库连接失败的直接原因,在代码开头添加:import sqlite32. 修正数据格式问题
- 数据库中
Datetime字段可能存储为字符串,需转换为Pandas可识别的日期类型,在读取数据后添加:df['Datetime'] = pd.to_datetime(df['Datetime']) - 检查
Open/High/Low/Close字段是否为数值类型,若为字符串需转换:df[['Open', 'High', 'Low', 'Close']] = df[['Open', 'High', 'Low', 'Close']].astype(float)
- 数据库中
3. 优化数据库连接逻辑
回调函数内无需重复创建cursor,pd.read_sql可直接使用已建立的conn,移除冗余的cursor = conn.cursor()语句。4. 添加异常捕获定位错误
在回调函数中加入异常捕获,便于查看具体错误信息,避免应用崩溃:@app.callback( Output("graph", "figure"), Input("toggle-rangeslider", "value")) def display_candlestick(value): try: df = pd.read_sql("SELECT Datetime, Open, High, Low, Close FROM stock_data WHERE Symbol = ?", conn, params=('AAPL',)) df['Datetime'] = pd.to_datetime(df['Datetime']) df[['Open', 'High', 'Low', 'Close']] = df[['Open', 'High', 'Low', 'Close']].astype(float) fig = go.Figure(go.Candlestick( x=df['Datetime'], open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'] )) fig.update_layout( xaxis_rangeslider_visible='slider' in value ) return fig except Exception as e: print(f"回调错误详情: {str(e)}") return go.Figure()
内容的提问来源于stack exchange,提问作者Pravin
相关产品推荐
相关产品推荐

