You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dash应用DataTable报错:Expected an array的解决方法

修复Dash DataTable的data参数错误

问题根源

你的回调函数statsTable现在返回的是整个dt.DataTable组件对象,但回调绑定的是table_stats的data属性——这个属性要求接收的是数组(也就是你打印的data列表),而不是组件对象,所以Dash才会报错说收到了object类型,不符合预期的数组类型。

具体修复步骤

1. 调整回调函数的返回值

删掉创建table对象的代码,直接返回data数组(也就是df.to_dict('rows')的结果)。如果需要动态更新表格列,还可以同时返回列配置:

@app.callback(
    # 同时绑定data和columns两个属性
    [dash.dependencies.Output('table_stats', 'data'),
     dash.dependencies.Output('table_stats', 'columns')],
    [dash.dependencies.Input('dynamic-dropdown', 'value')])
def statsTable(symbols):
    print(symbols)
    if symbols == None:
        raise PreventUpdate
    placeholders = ", ".join(['%s' for _ in symbols])
    sql = f"""SELECT id, companyname, marketcap , to_char(100.0*week52change,'999D99%%'), week52high, week52low , to_char(dividend_yield * 100, '99D99%%'), next_earnings_date , pe_ratio, ROUND(beta,2) FROM security_stats WHERE security_stats.id IN ({placeholders}) """
    print(sql)
    df = postgresql_to_dataframe_v1(conn, sql, symbols, stats_col)
    
    # 处理Dash不支持的数据类型:Decimal转float,日期转字符串
    decimal_cols = ['week52high', 'week52low', 'pe_ratio', 'Beta']
    for col in decimal_cols:
        df[col] = df[col].apply(lambda x: float(x) if pd.notnull(x) else x)
    df['Next Earnings Report'] = df['Next Earnings Report'].astype(str)
    
    # 生成表格数据和列配置
    data = df.to_dict('rows')
    columns = [{'name': col, 'id': col} for col in df.columns]
    
    # 返回数据和列,而不是整个DataTable对象
    return data, columns

2. 简化布局中的DataTable定义

因为现在列配置由回调动态生成,布局里只需要保留基础的DataTable结构即可:

dbc.Row([(html.Div(dbc.Container(dt.DataTable(
    id='table_stats', 
    style_table={'margin-left': '20px', 'margin-right':'45px'}
))))], justify="center")

额外说明

  • 为什么要处理Decimal和日期类型?Dash的DataTable无法直接识别Python的Decimal和datetime.date类型,转换成float/字符串后才能正常渲染表格。
  • 如果你的表格列是固定不变的,也可以把columns配置直接写在布局里,这样回调只需要返回data即可,代码会更简洁。

内容的提问来源于stack exchange,提问作者yung peso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:37:39