我的代码有这个问题。我有一个字符串列表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()
这是我正在寻找的输出...
如果有帮助,这是我用来提取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'
答案 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应用程序可能是不允许您看到标准输出的上下文,因此不会收到错误打印输出。