如何修改Dash代码实现RadioItems回调更新max_deviations参数
代码修改方案
现有代码共4处核心问题,按如下规则修改即可实现RadioItems阈值联动、动态更新异常值过滤规则:
- 给实际的
dcc.RadioItems组件添加id="radio_items"属性,删除多余的空占位<div id="radio_items">,否则回调无法捕获单选框的选中值。 - 删除回调函数中绘图代码前的
return (dff)语句,该语句会导致后续绘图逻辑成为永远不会执行的死代码。 - 修正回调返回值:回调绑定的输出是图表组件的
figure属性,直接返回plotly生成的图表对象即可,不需要返回DataFrame,也不需要返回dcc.Graph组件。 - 简化异常值过滤逻辑:由于距离均值的偏差序列和原DataFrame索引完全对齐,直接用布尔索引过滤原DataFrame即可,无需做表合并,避免出现列名带
_y后缀的问题。
修正后完整代码
import dash import plotly.express as px from dash import Dash, dcc, html, Input, Output import pandas as pd import numpy as np app = dash.Dash(__name__) server = app.server df=pd.read_csv(r'C:\SVS_GIS\POWER BI\CSV_DATA\QSAS2021.csv', encoding='unicode_escape') #SET DATE OF VALUATION df['TIME'] = ((pd.to_datetime(df['Sale Date'], dayfirst=True) .rsub(pd.to_datetime('01/10/2021', dayfirst=True)) .dt.days )*-1) df=df[df['TIME'] >= -365] df = df.query("(SMA >=1 and SMA <= 3) and (LGA==60)") # 预计算全量数据的均值、标准差、与均值的距离,这部分不需要随回调重复计算 y = df.CHANGE mean = np.mean(y) standard_deviation = np.std(y) distance_from_mean = abs(y - mean) # 应用布局定义 app.layout = html.Div([ html.Label("Standard Deviation Picker:", style={'fontSize':25, 'textAlign':'center'}), html.Br(), html.Label("1.0 = 68%, 2.0 = 95%, 3.0 = 99.7%", style={'fontSize':15, 'textAlign':'center'}), # 给单选框绑定对应id,删除原来的空占位div dcc.RadioItems( id="radio_items", options=[{'label': i, 'value': i} for i in [1.0, 2.0, 3.0]], value=2.0 ), html.Div([ dcc.Graph(id="the_graph") ]) ]) # 回调函数定义 @app.callback( Output("the_graph", "figure"), Input("radio_items", 'value') ) def update_graph(max_deviations): # 直接用布尔索引过滤非异常值,无需merge not_outlier = distance_from_mean < max_deviations * standard_deviation dff = df[not_outlier] fig = px.scatter( dff, x='TIME', y='CHANGE', color='SMA', trendline='ols', size='PV', height=500, width=800, hover_name='SMA', ) return fig if __name__ == '__main__': app.run_server(debug=False)
内容的提问来源于stack exchange,提问作者Colin Clark
相关产品推荐
相关产品推荐

