Как динамически заполнить DropDown из данных, загруженных с помощью опции dcc-загрузки Plotly Dash - PullRequest
0 голосов
/ 21 мая 2019

Я загрузил данные, используя опцию Plotly Dash dcc upload.Я не могу динамически заполнить уникальные столбцы загруженного информационного кадра как часть DropDown

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

фрейм данных, я загрузил столбцы (страна, континент, население)

я должен иметь возможность получитьвыпадающий список уникальных столбцов

это мой код:

import base64
import datetime
import io
import plotly.graph_objs as go
import dash
import dash_html_components as html
import dash_core_components as dcc
import dash_table
import dash_table_experiments as dte
from dash.dependencies import Input, Output, State
import pandas as pd

app = dash.Dash()
app.layout = html.Div([

html.Div([
dcc.Upload(
    id='upload-data',
    children=html.Div([
        'Drag and Drop or ',
        html.A('Select Files')
    ]),
  multiple=True
),

html.Div(id='output-data-upload'),
])


    dcc.Tab(label='Discrete Info', children=[
        html.Div([
        dcc.Dropdown(
        id='select_column',
     ),
                ]),
        html.Div([
        dcc.Graph(
        id='bar1',
        hoverData={'points': [{'customdata': ''}]},

        )
], style={'width': '100%', 'display': 'inline-block', 'padding': '0 10'}),



    ]),


])


def parse_contents(contents, filename, date):
content_type, content_string = contents.split(',')

decoded = base64.b64decode(content_string)
try:
    if 'csv' in filename:
        # Assume that the user uploaded a CSV file
        df = pd.read_csv(
            io.StringIO(decoded.decode('utf-8')))
    elif 'xls' in filename:
        # Assume that the user uploaded an excel file
        df = pd.read_excel(io.BytesIO(decoded))
except Exception as e:
    print(e)

    return html.Div([
        'There was an error processing this file.'
    ])


return html.Div([
    html.H5(filename),
    html.H6(datetime.datetime.fromtimestamp(date)),

    dash_table.DataTable(
        data=df.to_dict('records'),
        columns=[{'name': i, 'id': i} for i in df.columns]
    ),

    html.Hr(),  # horizontal line

    # For debugging, display the raw contents provided by the web browser
    html.Div('Raw Content'),
    html.Pre(contents[0:200] + '...', style={
        'whiteSpace': 'pre-wrap',
        'wordBreak': 'break-all'

    })
])


@app.callback(Output('output-data-upload', 'children'),
          [Input('upload-data', 'contents')],
          [State('upload-data', 'filename'),
           State('upload-data', 'last_modified')])


def update_output (list_of_contents, list_of_names, list_of_dates):
if list_of_contents is not None:

    children = [
        parse_contents(c, n, d) for c, n, d in
        zip(list_of_contents, list_of_names, list_of_dates)]

    return children

@app.callback(Output('select_column', 'options'
          [Input('output-data-upload', 'children'')]



def dd_update (options)

return(options)

1 Ответ

1 голос
/ 22 мая 2019

Это немного сложно без специального кода для ссылки, но основная идея состоит в том, чтобы настроить обратный вызов, который обновит options реквизит вашего dcc.Dropdown.Вы можете запустить этот обратный вызов (Input) при загрузке, заставить его читать в кадре данных, получить столбцы и затем вывести правильно отформатированный список словарей.

...