новичок: кривые holoviews от pandas, продолжение: проблемы со стримом

Строки кадра данных pandas соответствуют последовательным выборкам времени фильтра Калмана. Я хочу отображать траекторию (истину, измерения и оценки фильтра) в потоке.

def show_tracker(index,data=run_tracker()):
    i = int(index)
    sleep(0.1)
    p = \
    hv.Scatter(data[0:i], kdims=['x'],      vdims=['y'])(style=dict(color='r')) *\
    hv.Curve  (data[0:i], kdims=['x.true'], vdims=['y.true']) *\
    hv.Scatter(data[0:i], kdims=['x.est'],  vdims=['y.est'])(style=dict(color='darkgreen')) *\
    hv.Curve  (data[0:i], kdims=['x.est'],  vdims=['y.est'])(style=dict(color='lightgreen'))
    return p

%%opts Scatter [width=600,height=280]
ndx=TimeIndex()
hv.DynamicMap(show_tracker, kdims=[], streams=[ndx])

for i in range(N):
    ndx.update(index=i)
  • Проблема 1: Оси автоматически устанавливаются в соответствии с границами данных. Следовательно, обновления траектории происходят на самом краю границ графика. Есть ли настройка, разрешающая некоторую неточность, или мне нужно вычислить соответствующие границы в функции show_tracker?

  • Проблема 2: бэкенд боке; Я могу масштабировать и панорамировать, но «Сброс» приводит к потере набора данных. Как это исправить?

  • Проблема 3. Аргумент данных по умолчанию для show_tracker требует повторного выполнения функции для создания нового фрейма данных. Есть ли простой способ решить эту проблему?


person user    schedule 08.04.2017    source источник
comment
Проблема 3 решена путем замены аргумента data=run_tracker() на show_tracker на def rerun_tracker(N): def _run(i): if i % N == 0: _run.data = run_tracker(N, датчик,трекер) return _run.data _run.data = run_tracker(N) return _run   -  person user    schedule 09.04.2017
comment
Добавлен блокнот Jupyter по адресу github.com/ea42gh/KalmanFilterExample.   -  person user    schedule 09.04.2017


Ответы (1)


Выпуск 1

Это одна из последних нерешенных проблем в выпуске 1.7, который выйдет на следующей неделе, отследите эту проблему для обновлений. Однако мы также только что изменили способ обновления диапазонов на DynamicMap. Если вы хотите обновить диапазоны, обязательно установите %%opts Scatter {+framewise} или norm=dict(framewise=True) для одного из отображаемых объектов, как вы уже делаете для параметров стиля.

Выпуск 2

Это досадный недостаток инструмента сброса в боке, вы можете отслеживать эту проблему для обновления.

Выпуск 3:

Это зависит от того, что именно вы делаете, были ли данные уже сгенерированы или вы обновляете их на лету? Если вам просто нужно сгенерировать данные один раз, вы можете просто создать их вне функции, что означает, что они будут в области видимости:

data = run_tracker()

def show_tracker(index):
    i = int(index)
    sleep(0.1)
    ...
    return p

Если вы действительно хотите динамически генерировать новые данные, проще всего написать небольшой класс для отслеживания состояния. Вы даже можете сделать этот класс потоком, чтобы вам не нужно было определять его отдельно. Вот как это может выглядеть:

class KalmanTracker(hv.streams.Stream):

    index = param.Integer(default=1)

    def __init__(self, **params):
        # Initializes empty data and parameters
        self.data = None
        super(KalmanTracker, self).__init__(**params)

    def update_data(self, index):
        # Update self.data here

    def get_view(self, index):
        # Update index exceeds data length and
        # create a holoviews view of the data
        if self.data is None or len(self.data) < index:
            self.update_data(index)
        data = self.data[:index]
        ....
        return hv_obj

    def show(self):
        # Create DynamicMap to display and
        # pass in self as the Stream
        return hv.DynamicMap(self.get_view, kdims=[],
                             streams=[self])

tracker = KalmanTracker()
tracker.show()

# Should update data and plot
tracker.update(index=10)

Сделав это, вы также можете использовать библиотеку paramnb для создания виджетов из этого класса. Вы бы просто сделали это:

tracker = KalmanTracker()
paramnb.Widgets(tracker, callback=tracker.update)
tracker.show()
person philippjfr    schedule 09.04.2017
comment
отлично! Я предполагаю, что tracker.update должен быть tracker.view. Я обновлю блокнот на github, как только он полностью заработает. - person user; 10.04.2017
comment
tracker.update правильно, так как это обновляет Stream. Кстати, по вопросам поддержки присоединяйтесь к нам Gitter. - person philippjfr; 10.04.2017
comment
получил этот интерфейс и работает. Новая версия на github.com/ea42gh/KalmanFilterExample/blob/master/ - person user; 10.04.2017