Plotly-Dash: - Фильтрация нескольких столбцов в графическом тире после загрузки файла

Я хотел бы реализовать фильтр с несколькими столбцами во фрейме данных после загрузки файла Excel или CSV и сохранить полученный фрейм данных. Ниже приведен код. Я написал код для загрузки файла и могу его отобразить. Мне нужно получить параметры фильтрации и сохранить данные результата. Ниже мой текущий код

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

#HTML Layout

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)


server = app.server
app.layout = html.Div([           
    html.Div([
   html.Center(
       dcc.Upload(
        id='upload-data',
        children=html.Div([
            'Drag and Drop or ',
            html.A('Select File')
        ]),
        style={
            'width': '20%',
            'height': '32px',
            'lineHeight': '32px',
            'borderWidth': '1px',
            'borderStyle': 'dashed',
            'borderRadius': '5px',
            'textAlign': 'center',
            'margin': '10px'
        },
        # Allow multiple files to be uploaded
        multiple=True
    )),
    ]),
    html.Div(id='output-data-upload'),
    html.Br(),
    
    html.Br(),
    html.Div([
        html.Center(html.H6(id='my-output'))
        #html.Div(id='my-output'),
    ]),
   
    ]),
    
   
    
])

    
# Function for reading the data

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

    decoded = base64.b64decode(content_string)
    try:
        if 'csv' in filename:
            # Assume that the user uploaded a CSV or TXT 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))
        elif 'txt' or 'tsv' in filename:
            # Assume that the user upl, delimiter = r'\s+'oaded an excel file
            df = pd.read_csv(
                io.StringIO(decoded.decode('utf-8')), delimiter = r'\s+')
    except Exception as e:
        print(e)
        return html.Div([
            'There was an error processing this file.'
        ])

    return df



            
#Call backs 

def generate_table(df_final):
    return dash_table.DataTable(data=df_final.to_dict('rows'),columns=[{'name': i, 'id': i} for i in df_final.columns],editable=True,
                                    virtualization=True,
                                    fixed_rows={'headers': True},
                                    page_current=0,
                                    page_size=5,
                                    style_table={ 'height':'350px','overflowY': 'auto'},
                                    style_cell_conditional=[{'if': {'column_id': c},'textAlign': 'left'} 
                                                           for c in ['Date', 'Region']],style_data_conditional=[{
                                       'if': {'row_index': 'odd'},'backgroundColor': 'rgb(248, 248, 248)'}],
                                    style_header={'backgroundColor': 'rgb(230, 230, 230)','fontFamily':'sans-serif',
                                                  'fontWeight': 'bold',"fontSize":'13px'},
                                    
                                    style_cell={'minWidth': 95, 'maxWidth': 95, 'width': 95}
                                   )

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


#function for displaying the preview of the input file.

def display_table(contents,filename):
    if contents:
        contents = contents[0]
        filename= filename[0]
        df = parse_data(contents,filename)
        return html.Div([
            html.Center(html.H5('Preview')),
            html.Center(
                html.Div([
               
                    html.Div([
                        generate_table(df_final_1)
                    ])
                    ],style={'width':'85%'}
                )
        )])
    
@app.callback(Output('output-confirm','children'),
              [Input('submit-filter', 'n_clicks')]
    
)

def filter_button(n_clicks):
    if n_clicks:
        return 'Successful'
   
    

#Calling the server    

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

person Palvadi Adinarayana    schedule 26.10.2020    source источник


Ответы (1)


Здесь скрывается много вопросов, и их слишком много, чтобы подробно описать их в одном ответе. В общем, вам нужно использовать значения из CSV для обновления чего-то вроде раскрывающегося или многопадающего раскрывающегося списка или других компонентов, позволяющих пользователю делать выбор для фильтрации. Этот компонент (или эти компоненты) затем инициирует обратный вызов, который также включает данные из CSV, выполняет фильтрацию и выводит их либо в пользовательский интерфейс Dash, либо в любую другую форму хранения, которую вы используете (например, локальная файловая система , База данных SQL и т. Д.).

person coralvanda    schedule 27.10.2020
comment
Да, точно. Или же после загрузки файла нажатие кнопки дает два раскрывающихся (компонентов) варианта двух значений столбца (которые являются категориальными), и выбор этих значений приведет к отдельному фрейму данных, который я бы отобразил и сохранил. - person Palvadi Adinarayana; 02.11.2020