Почему мой график обновляется панелью (дважды), когда я изменяю настройку кнопки, которая не должна вызывать никаких обновлений?(Панель Головиз) - PullRequest
0 голосов
/ 26 сентября 2019

Я создал класс для изучения и обучения моделей.

Когда я изменяю значение выпадающего меню «выбирать_модель_тип» в приведенном ниже примере кода, я не ожидал, что в моей панели инструментов ничего не изменится, посколькунет @param.depends('choose_model_type', watch=True) в моем классе.Тем не менее, моя панель инструментов обновляется, когда я изменяю значение выпадающего меню «выбирать_модель_тип».В этом случае функция plot_y () запускается дважды, если я просматриваю журналы:

2019-09-26 11: 24: 42,802 начиная с plot_y
2019-09-26 11:24:42 825 стартовый plot_y

Это для меня неожиданное поведение.Я не хочу, чтобы plot_y () срабатывал при изменении «choose_model_type».
Как сделать так, чтобы plot_y срабатывал только при изменении «y» (и мой график обновляется на панели инструментов), а не когда другиепараметры, такие как раскрывающийся список изменения?
Я хочу контролировать то, когда срабатывает, но для меня, кажется, происходит какая-то магия.

Другой связанный с этим вопрос:
Почему plot_y () срабатывает дважды?Если я изменяю pred_target, он также запускает plot_y () дважды.То же самое происходит, когда я изменяю значение «choose_model_type»: plot_y () срабатывает дважды.

# library imports    
import logging

import numpy as np
import pandas as pd

import hvplot
import hvplot.pandas

import holoviews as hv
from holoviews.operation.datashader import datashade, dynspread
hv.extension('bokeh', logo=False)

import panel as pn
import param

# create some sample data
df = pd.DataFrame(np.random.choice(100, size=[50, 2]), columns=['TARGET1', 'TARGET2'])

# class to train my models with some settings
class 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_plot

model_trainer = ModelTrainer()

# show model dashboard
pn.Column(
    pn.Row(model_trainer.param['pred_target']),
    pn.Row(model_trainer.param['choose_model_type']),
    pn.Row(model_trainer.plot_y)
).servable()

dropdown_changes_dashboard_shouldnt_happen

1 Ответ

1 голос
/ 26 сентября 2019

Проблема здесь одна из проверки, в частности, проблема здесь: @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), он автоматически отслеживает параметры и вызывает метод для обновления графика при изменении параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...