1 входные данные
Данные в том виде, как они есть в csv
, трудно зациклить.И я бы сказал, что это основная причина, по которой ваш код не работает, потому что вы, кажется, понимаете фундаментальную структуру кода.Надев очки SQL, я думаю, что вы должны попытаться получить его, например,
Date, Vendor, ProductName, Value
2 Изменение типа ввода обратного вызова
multi
сложно, так как переключает переключение между возвратом str
если выбран только 1 элемент, и list
, если выбрано более одного *
3 тип возврата обратного вызова
ваш код возвращает dict
, но обратный вызов объявлен figure
кактип возврата
, но вот код со следами отладки print()
и sleep()
import pandas as pd
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.graph_objs as go
import time
df = pd.read_csv("Data.csv", sep="\t")
df['YearMonth'] = pd.to_datetime(df['YearMonth'], format='%Y-%m')
products = ['Product_1', 'Product_2', 'Product_3']
vendors = df['Vendor'].unique()
app = dash.Dash('Data')
app.layout = html.Div([
html.Div([
html.Div([
html.Label('Product'),
dcc.Dropdown(
id='product',
options=[{'label' : p, 'value' : p} for p in products],
multi=True,
value='Product_1'
),
]),
html.Div([
html.Label('Vendor'),
dcc.Dropdown(
id='vendor',
options=[{'label': v, 'value': v} for v in vendors],
multi=True,
value='ABC'
),
]),
]),
dcc.Graph(id='feature-graphic', figure=go.Figure())
])
@app.callback(
Output('feature-graphic', 'figure'),
[Input('product', 'value'),
Input('vendor', 'value')])
def update_graph(input_product, input_vendor):
# df_filtered[['Product_1', 'YearMonth']]
if type(input_product) == str:
input_product = [input_product]
if type(input_vendor) == str:
input_vendor= [input_vendor]
datasets = ['']
i = 1
for vendor in input_vendor:
df_filtered = df[df['Vendor'] == vendor]
for product in input_product:
datasets.append((df_filtered[['YearMonth', 'Vendor', product]]).copy())
datasets[i]['ProductName'] = product
datasets[i].rename(columns={product: 'Value'}, inplace=True)
i += 1
datasets.pop(0)
print(datasets)
traces = ['']
for dataset in datasets:
print(dataset)
time.sleep(1)
traces.append(
go.Scatter({
'x': dataset['YearMonth'],
'y': dataset['Value'],
'mode': 'lines',
'name': f"Vendor: {dataset['Vendor'].iloc[0]} Product: {dataset['ProductName'].iloc[0]}"
}))
traces.pop(0)
layout = {'title': 'Title of Chart'}
fig = {'data': traces, 'layout': go.Layout(layout)}
return go.Figure(fig)
if __name__ == '__main__':
app.run_server()
быстрое и грязное раскрытие:
Если вы обрабатываете 1.выпуск это сильно все упроститПоэтому я бы попытался выделить pd.DataFrame()
жонглирование из обратного вызова и в верхнюю часть ввода / вывода.
1) не использовать счетчики для циклов
2) мойИмена переменных тоже не самые лучшие
3) следующий стиль - это питон пещерного человека и there must be a better way
:
traces = ['']
traces.append(this_and_that)
traces.pop(0)
Обычно:
с использованием print(input_variable)
и print(type(input_variable))
получает мои колеса большую часть времени из грязи.
после всех
вы должны заметить, что у каждого trace
есть свое индивидуальное имя, которое будет отображаться в легенде.Нажав на имя в легенде, вы добавите или удалите trace
без необходимости @app.callback()