Я пытаюсь создать приложение на Python для имитации проблемы Q-Learning. Перед реализацией алгоритма я просто сосредоточился на том, чтобы таблица работала, случайным образом увеличивая значения и ожидая 1 секунду между каждым приращением.
Q - это фрейм данных pandas здесь:
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()
Что мне не хватает?
Спасибо за совет! :)
РЕШЕНО. Нет ничего лучше утреннего кофе; )
Лучше обернуть создание таблицы в функцию и вызывать ее для каждого обновления через каждый интервал. Более того, предыдущий синтаксис не сохранит стиль, определенный в первой созданной таблице.
# 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
Надеюсь, это кому-то поможет!
Предлагаю скопировать свое решение в ответ. На свои вопросы можно отвечать, есть даже значок :)