Проблема с ошибкой обратного вызова при реализации приложения Dash - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь настроить простое приложение Dash, которое возвращает значение из кадра данных, используемого в качестве «справочной таблицы»;Снимок экрана примера тестовой таблицы приведен здесь enter image description here

В приложении пользователь может войти в одно из многих состояний (это первый столбец в приведенной выше таблице), иПриложение должно вернуть соответствующие две записи столбца из той же строки, в которой существует состояние в этом кадре данных.Например: если пользователь выбрал LA, приложение должно вернуть «med» и «radio»

К сожалению, после выбора пользователя я получаю сообщение об обратном вызове.Мой код прилагается ниже.Может кто-нибудь, пожалуйста, помогите мне решить эту проблему?Это мой первый раз, когда я использую Dash - так что цените любые рекомендации!

app = dash.Dash(__name__)
server = app.server

df=pd.read_csv("test_lookup_table.csv", delimiter=',', encoding="utf-8-sig")
df.set_index('state')

app.layout = html.Div([
    html.H1('On demand look up '),
    html.H3('Select from list of states below'),
    dcc.Dropdown(
        id='dropdown',
        options=[{'label': i, 'value': i} for i in df.state],
        value='LALA'
    ),
    html.Div(id='display-value')
])


@app.callback(
    Output('dropdown','options'),
    [Input('dropdown', 'value')])


def callback_a(i):
    return df.loc[i, 1:3]

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

1 Ответ

1 голос
/ 15 июня 2019

Вы не упомянули конкретную ошибку, но я думаю, что вижу проблему.Ваш обратный вызов выводит (Output) в options prop выпадающего компонента.Звучит так, как если бы вы хотели выводить что-то еще, например, div или p компонент.У вас есть display-value ID для одного div, так что, может быть, именно туда вы хотите, чтобы он пошел?Попробуйте изменить свой обратный вызов следующим образом:

@app.callback(
    Output('display-value', 'children'),
    [Input('dropdown', 'value')])
def callback_a(i):
    return df.loc[i, 1:3]

РЕДАКТИРОВАТЬ:

Одна из проблем заключается в настройке индекса для использования значений столбца state.set_index возвращает значение, но вы его не присвоили, поэтому ничего не происходит.Используйте df = df.set_index('state') или включите флаг inplace=True внутри вызова метода.

Это вызывает ошибку ключа, потому что df не имеет значений состояния в качестве индексов, поэтому вы не можете смотретьдля них.Теперь вы можете использовать df.loc[i] в вашем обратном вызове, и он сможет найти правильный ряд.Вы не можете использовать [1:3] здесь, потому что loc ссылается по имени, а не по значению строки / столбца, и у вас нет столбцов, названных целыми числами.Вы могли бы сделать df.loc[i].tolist()[1:3].Однако с state в качестве индекса у вас есть только два значения в каждой строке (индексы 0 и 1), поэтому часть :3] никогда ничего не получит.Вы просто получите то, что находится в индексе 1.

Наконец, и я должен был упомянуть об этом раньше, вы настроили df как глобальную переменную, что, как правило, не лучшая практика.Было бы лучше использовать функцию обратного вызова для загрузки df из вашего CSV-файла и добавления его к какому-либо компоненту, например dash_table.DataTable.Затем вы можете использовать другие обратные вызовы для извлечения значений из этой таблицы вместо ссылки на глобальную переменную.

...