AttributeError:“ int”对象没有属性“ to_dict”

时间:2020-09-17 17:55:07

标签: python pandas dictionary plotly-dash

我的代码有这个问题。我有一个字符串列表symbols,我将它作为参数传递给函数statsTable()

我在SQL查询中使用symbols列表从dB中提取请求的项目,在我的情况下,该列表是股票列表。我宁愿不在这里使用循环。该函数的输出应使用我的PostgreSQL dB中的数据创建一个DataFrame。

在下面看看:

@app.callback(
dash.dependencies.Output('table_stats', 'data'),
[dash.dependencies.Input('dynamic-dropdown', 'value')])

def statsTable(symbols):
    if symbols == None:
        raise PreventUpdate

    symbols = tuple(symbols)

    df = postgresql_to_dataframe(conn, 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 IS {symbols} ;", col)
    data = df.to_dict('rows')
    columns=[{"name": i, "id": i} for i in security_stats.columns]
    return dt.DataTable(data=data, columns=columns)

我将股票列表转换为元组以删除括号,因此我的SQL查询不会感到困惑。当我为Dash应用程序运行此代码时,我得到AttributeError: 'int' object has no attribute 'to_dict'

我不明白为什么,因为当我在沙盒环境中运行以下代码(以测试其是否正常运行)时,一切看起来都很好,我得到了我要的数据的DataFrame,而没有使用循环:

symbols = ('FB','AAPL', 'EBAY','AMD')
col = ['Symbol','Company','Market Cap','1yr-Change', '52-Week High','52-Week Low','Dividend Yield','Next Earnings Report','PE-Ratio','Beta']

df = postgresql_to_dataframe(conn, 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 {symbols} ;", col)
df.head()

这是我正在寻找的输出...

Dataframe

如果有帮助,这是我用来提取SQL数据并将其转换为DataFrame的函数:

def postgresql_to_dataframe(conn, select_query, column_names):
    """
    Tranform a SELECT query into a pandas dataframe
    """
    cursor = conn.cursor()
    try:
        cursor.execute(select_query)
    except (Exception, psycopg2.DatabaseError) as error:
        print("Error: %s" % error)
        cursor.close()
        return 1
    
    # Naturally we get a list of tupples
    tupples = cursor.fetchall()
    cursor.close()
    
    # We just need to turn it into a pandas dataframe
    df = pd.DataFrame(tupples, columns=column_names)
    return df

是什么导致我在AttributeError: 'int' object has no attribute 'to_dict'函数中引发此错误statsTable(symbols)?我一直很努力地为我提供的一切帮助,我感激不尽。

编辑: 这是完整的错误。

>>> data = df.to_dict('rows')
AttributeError: 'int' object has no attribute 'to_dict'

1 个答案:

答案 0 :(得分:2)

try:
    cursor.execute(select_query)
except (Exception, psycopg2.DatabaseError) as error:
    print("Error: %s" % error)
    cursor.close()
    return 1

引发异常时,您的异常处理将导致postgresql_to_dataframe返回一个整数而不是一个DataFrame。当然,不可能在整数上调用.to_dict,因为错误消息非常明确地告诉您。

因此,最直接的原因是查询执行引发了异常。 Dash应用程序可能是不允许您看到标准输出的上下文,因此不会收到错误打印输出。