我開設了一個課程來探索和訓練模型。當我在下面的代碼示例中更改下拉菜單“choose_model_type”的值時,我希望儀表板中沒有任何變化,因為@param.depends('choose_model_type', watch=True)我的類中沒有。但是,當我更改下拉菜單“choose_model_type”的值時,我的儀表板會更新。在這種情況下,如果我查看日志,函數 plot_y() 會被觸發兩次:2019-09-26 11:24:42,802 開始 plot_y2019-09-26 11:24:42,825 開始 plot_y這對我來說是意想不到的行為。我不希望在更改“choose_model_type”時觸發 plot_y()。我如何確保僅在“y”更改(并且我的繪圖在儀表板中更新)而不是其他參數(例如下拉菜單)更改時才觸發 plot_y?我想控制什么時候觸發,但對我來說似乎有一些魔法正在發生。其他相關問題是:為什么 plot_y() 被觸發兩次?如果我更改 'pred_target' 它也會觸發 plot_y() 兩次。當我更改“choose_model_type”的值時也會發生同樣的情況:plot_y() 被觸發兩次。# library imports import loggingimport numpy as npimport pandas as pdimport hvplotimport hvplot.pandasimport holoviews as hvfrom holoviews.operation.datashader import datashade, dynspreadhv.extension('bokeh', logo=False)import panel as pnimport param# create some sample datadf = pd.DataFrame(np.random.choice(100, size=[50, 2]), columns=['TARGET1', 'TARGET2'])# class to train my models with some settingsclass ModelTrainer(param.Parameterized): logging.info('initializing class') pred_target = param.Selector( default='TARGET1', objects=['TARGET1', 'TARGET2'], label='Choose prediction target' ) choose_model_type = param.Selector( default='LINEAR', objects=['LINEAR', 'LGBM', 'RANDOM_FOREST'], label='Choose type of model', ) y = df[pred_target.default] # i expect this function only to be triggered when pred_target changes @param.depends('pred_target', watch=True) def _reset_variables(self): logging.info('starting reset variables') self.y = df[self.pred_target] # i expect plot_y() only to be triggered when y changes @param.depends('y', watch=True) def plot_y(self): logging.info('starting plot_y') self.y_plot = dynspread(datashade(self.y.hvplot.scatter())) return self.y_plotmodel_trainer = ModelTrainer()
1 回答

德瑪西亞99
TA貢獻1770條經驗 獲得超3個贊
這里的問題是驗證之一,特別是問題在這里:@param.depends('y', watch=True)
. y
不是您示例中的參數,因此 param.depends 無法解決它并最終退回到取決于所有參數。我已經提交了一個問題來解決這個問題。如果您將示例更改為:
y = param.Series(default=df[pred_target.default])
它會起作用,但是您仍然會遇到回調被調用兩次的問題。這是因為你已經watch=True
在依賴聲明中設置了。設置watch=True
只對有副作用的方法有意義,如果你的方法是返回值的,那么設置它幾乎沒有意義。為了擴展這一點,當您將方法傳遞給面板時,例如pn.Row(model_trainer.plot_y)
,它會自動監視參數并在參數更改時調用該方法來更新繪圖。
添加回答
舉報
0/150
提交
取消