#python #plotly-dash
#python #plotly-dash
Вопрос:
У меня есть приложение dash, для которого макет довольно прост. Я впервые использую dash, поэтому, надеюсь, кто-нибудь сможет мне здесь помочь.
То, что я пытаюсь сделать, это заставить пользователя приложения ввести 5 функций, а затем нажать кнопку отправки, которая вызовет функцию для возврата графика на основе этих 5 функций.
Код, который у меня есть до сих пор:
app = dash.Dash()
app.layout = html.Div(children=[
html.H1(children='Regression Analyzer for Individual Market Securities', style={'textAlign': 'center'
}),
html.Div([
dcc.DatePickerRange(
id = 'my-date',
min_date_allowed=datetime(2015, 1, 1),
max_date_allowed=datetime(2020, 11, 11),
initial_visible_month=datetime(2017, 8, 5),
start_date=str(datetime(2015, 11, 1)),
end_date=str(datetime(2020, 11, 1)))
]),
html.Div([
dcc.Dropdown(id = 'MA',
options=[
{'label': 'Day Average', 'value': 'Day Average'},
{'label': '7 Day Avg', 'value': '7 Day Avg'},
{'label': '50 Day Avg', 'value': '50 Day Avg'},
{'label': '200 Day Avg', 'value': '200 Day Avg'}
])]),
html.Div([
dcc.Input(id = 'Name',
placeholder='Enter stock ticker ...',
type='text',
value='AAPL')
]),
html.Div([
dcc.Slider(id = 'err',
min=0,
max=100,
step=0.5,
value=10)
])
])
@app.callback()
def compare_to_market1():
return compare_to_market()
Функции, которые должна вызывать функция ‘compare_to_market1’, следующие: start_date, end_date, Name, MA и err.
Как вы можете видеть, compare_to_market1 вызывает функцию compare_to_market , и я бы предпочел оставить это так, поскольку последняя функция довольно длинная, но я, очевидно, могу вставить ее туда, если потребуется.
Главное, что я, очевидно, не знаю, как настроить функцию app.callback для получения правильных входных данных и передачи их функции compare_to_market1, которую я хочу запустить.
Любая помощь приветствуется.
Комментарии:
1. когда должен быть вызван ваш обратный вызов? зависимости нет
2. извините, я не понимаю, что вы имеете в виду
3. обратный вызов вызывается, когда что-то происходит, например, когда вы изменили выбранный параметр в выпадающем меню, но вы этого не указали. На этом уровне лучше всего посмотреть документацию / примеры dash plotly
4. Да, как я уже сказал, я не знаю, как настроить обратный вызов, но я объяснил, что я хотел бы сделать в сообщении.
5. в вашем вопросе вы не указываете, когда хотите, чтобы вызывался обратный вызов, ни входные данные, которые он получает, ни выходные данные, которые он производит, вам невозможно помочь
Ответ №1:
Итак, вы хотите вызвать обратный вызов, когда что-либо изменится.
Очень вероятно, что вы не хотите использовать datetime, но date.
Замена вашего вызова compare_to_market вызовом print, чтобы иметь возможность выполнять следующий код и видеть вызовы обратного вызова:
from datetime import date
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
app = dash.Dash()
app.layout = html.Div(children=[
html.H1(children='Regression Analyzer for Individual Market Securities', style={'textAlign': 'center'
}),
html.Div([
dcc.DatePickerRange(
id = 'my-date',
min_date_allowed=date(2015, 1, 1),
max_date_allowed=date(2020, 11, 11),
initial_visible_month=date(2017, 8, 5),
start_date=str(date(2015, 11, 1)),
end_date=str(date(2020, 11, 1)))
]),
html.Div([
dcc.Dropdown(id = 'MA',
options=[
{'label': 'Day Average', 'value': 'Day Average'},
{'label': '7 Day Avg', 'value': '7 Day Avg'},
{'label': '50 Day Avg', 'value': '50 Day Avg'},
{'label': '200 Day Avg', 'value': '200 Day Avg'}
])]),
html.Div([
dcc.Input(id = 'Name',
placeholder='Enter stock ticker ...',
type='text',
value='AAPL')
]),
html.Div([
dcc.Slider(id = 'err',
min=0,
max=100,
step=0.5,
value=10)
]),
html.Div(id='my-output')
])
@app.callback(
Output(component_id='my-output', component_property='children'),
[dash.dependencies.Input("my-date", "start_date"),
dash.dependencies.Input("my-date", "end_date"),
dash.dependencies.Input("Name", "value"),
dash.dependencies.Input("MA", "value"),
dash.dependencies.Input("err", "value")])
def compare_to_market1(startDate, endDate, name, ma, err):
print(startDate, endDate, name, ma, err)
if __name__ == '__main__':
app.run_server(debug=True)
Комментарии:
1. Это кажется правильным. Мне нужно что-то исправить с форматированием даты и времени с моей стороны, но это очень помогает, спасибо.
2. @mark21 возможно, вы видите первую версию моего ответа, я отредактировал ее, чтобы использовать date , а не datetime , и добавить MA , который я пропустил во входных зависимостях обратного вызова
3. Да, я попытался переключить дату и время на дату, но проблема немного отличается от этой. Я собираюсь опубликовать еще один вопрос, который я свяжу с вами, если вы захотите попробовать. Просто нужно как-то преобразовать регулярное выражение datetime.
4. На самом деле похоже, что я не могу опубликовать его, так как я получил отрицательный ответ на этот вопрос. Может быть, если вы проголосуете за это, они позволят мне задать другой?
5. @mark21 ваш вопрос имеет 0 голосов, вы не можете опубликовать новый? DV был от меня, потому что ваш вопрос неясен, я не могу отменить DV, пока вы не отредактируете свой вопрос. Если вы хотите отредактировать свой вопрос, например, чтобы было ясно, что вы хотите, чтобы обратный вызов вызывался при любом изменении start_date, end_date, Name, MA и err.