Обновление табличных значений в прямом эфире с Dash и Plotly - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь создать приложение на приборной панели в Python, чтобы имитировать проблему Q-Learning. Перед реализацией алгоритма я просто сконцентрировался на том, чтобы заставить таблицу работать, увеличивая значения случайным образом и ожидая 1 секунду между каждым шагом.

Q - это кадр данных панд здесь:

table = ff.create_table(Q,  height_constant=20)
table.layout.width=300

def update_Q(Q):
    for i in range(len(Q)):
        for j in range(1, len(Q.columns)):        
            Q.iloc[i,j] += np.random.choice([0,1,2])
    print(Q)
    return Q

Я могу заставить его работать с этим оператором печати, значение таблицы на консоли действительно обновляется.

Однако в браузере он просто обновляется в первый раз, но затем остается статичным. Вот код:

# Browser visualization

app.layout = html.Div([
        html.H1(children='Frozen Lake: Q-Learning Demo'),
        dcc.Graph(id='table', figure=table),
        dcc.Interval(
            id='time',
            interval=1*1000, # in milliseconds
            n_intervals=0)
        ]
    )


@app.callback(Output(component_id = 'table', component_property='figure'),
              [Input(component_id = 'time', component_property='n_intervals')])    
def update_table(n):   
    # Update values
    new_table = ff.create_table(update_Q(Q))
    time.sleep(1)
    return new_table


if __name__ == '__main__':
    app.run_server()

Чего мне не хватает?

1 Ответ

0 голосов
/ 22 марта 2019

решено. Ничего подобного утреннему кофе; )

Лучше обернуть создание таблицы в функцию и вызывать ее для каждого обновления через каждый интервал. Кроме того, предыдущий синтаксис не будет сохранять стиль, определенный в первой созданной таблице.

    # Helper functions to draw and update values of the table
    def draw_Table(Q):
        table = ff.create_table(Q, index=True, height_constant=20)
        table.layout.width=300
        return table
    def update_Q(Q):
        for i in range(len(Q)):
            for j in range(1, len(Q.columns)):        
                Q.iloc[i,j] += np.random.choice([0,1,2])
        return Q

А потом,

    @app.callback(Output(component_id = 'table', component_property='figure'),
                  [Input(component_id = 'time', component_property='n_intervals')])    
    def update_table(n):   
        # Update values
        new_table = draw_Table(update_Q(Q))
        time.sleep(1)
        return new_table

Надеюсь, это кому-нибудь поможет!

...