dash plotly - динамически создать выпадающее меню, выбрать несколько строк, экспортировать таблицу? - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть набор данных, который выглядит следующим образом:

cat_id  author  year    publisher   country value (dollars)
name1   kunga   1998    D and D Australia   10
name2   siba    2001    D and D UK  20
name3   siba    2001    D and D US  20
name3   shevara 2001    D and D UK  10
name3   dougherty   1992    D and D Australia   20
name4   ken 2011    S and K Australia   10

Я хочу превратить это в таблицу с плотной чертой.У меня есть большая часть кода, который я хочу настроить:

#!/usr/bin/env python
import dash
from dash.dependencies import Input, Output, State
import dash_table
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd

app = dash.Dash(__name__)
df = pd.read_excel('dash_test_doc.xlsx')


app.layout = html.Div([
    html.Div([
        dcc.Input(
            id='adding-rows-name',
            placeholder='Enter a column name...',
            value='',
            style={'padding': 10},
        ),
        html.Button('Add Column', id='adding-rows-button', n_clicks=0)
    ], style={'height': 50}),



     dash_table.DataTable(
         id='adding-rows-table',
         columns=[{"name": i, "id": i} for i in df.columns],
         data = df.to_dict('rows'),
         editable=True,
         filtering=True,
         sorting=True,
         sorting_type="multi",
         row_selectable="multi",
         row_deletable=True,
         selected_rows=[],
         pagination_mode="fe",
         style_cell_conditional=[
         {
             'if': {'row_index': 'odd'},
             'backgroundColor': 'rgb(230, 255, 230)'
         }
     ] + [
         {
             'if': {'column_id': c},
             'textAlign': 'left'
        } for c in ['Date', 'Region']
    ],
    style_header={
        'backgroundColor': 'white',
        'fontWeight': 'bold'
    }
    ),

    html.Button('Add Row', id='editing-rows-button', n_clicks=0),
    dcc.Graph(id='adding-rows-graph'),
])

@app.callback(
    Output('adding-rows-table', 'data'),
    [Input('editing-rows-button', 'n_clicks')],
    [State('adding-rows-table', 'data'),
     State('adding-rows-table', 'columns')])
def add_row(n_clicks, rows, columns):
    if n_clicks > 0:
        rows.append({c['id']: '' for c in columns})
    return rows


@app.callback(
    Output('adding-rows-table', 'columns'),
    [Input('adding-rows-button', 'n_clicks')],
    [State('adding-rows-name', 'value'),
     State('adding-rows-table', 'columns')])
def update_columns(n_clicks, value, existing_columns):
    if n_clicks > 0:
        existing_columns.append({
            'id': value, 'name': value,
            'editable_name': True, 'deletable': True
        })
    return existing_columns


@app.callback(
    Output('adding-rows-graph', 'figure'),
    [Input('adding-rows-table', 'data'),
     Input('adding-rows-table', 'columns')])
def display_output(rows, columns):
    return {
        'data': [{
            'type': 'heatmap',
            'z': [[row.get(c['id'], None) for c in columns] for row in rows],
            'x': [c['name'] for c in columns]
        }]
    }


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

Есть только три вещи, с которыми я борюсь, если кто-то может помочь, я был бы признателен:

  1. Я хочу создать раскрывающееся меню для каждого столбца без предварительного определения параметров раскрывающегося списка и возможности множественного выбора.например, используя таблицу здесь, в издателе, есть два варианта (D и D, и S и K);я хочу, чтобы они автоматически отображались как выпадающий параметр для фильтрации, без необходимости жестко их кодировать, потому что, например, если я редактирую таблицу ввода и добавляю строку, и есть еще один добавленный издатель (например, A и D), я хочу Aа D будет автоматически добавляться в выпадающие опции?(в конечном счете, идея будет заключаться в том, чтобы имитировать Excel, где я мог бы выбрать из раскрывающегося списка, например, D и D, а также S и K из раскрывающегося списка для этого столбца, и записи будут отфильтрованы на основе этого).

  2. возможно ли выделить несколько строк и удалить их одним действием?в минуту я могу удалить отдельные строки.

  3. Можно ли экспортировать таблицу?скажем, я читаю в таблице, а затем кто-то удаляет некоторые столбцы / строки, могу ли я экспортировать полученную таблицу?

Если кто-нибудь может помочь мне выяснить код для них, я быценить это.Как примечание: поскольку я только начинаю, если у кого-то есть какие-либо предложения по улучшению этого скрипта, я буду признателен.

1 Ответ

1 голос
/ 27 апреля 2019
  1. То, что вы, вероятно, захотите сделать здесь, - это создать обратный вызов для каждого раскрывающегося списка (или обратный вызов с несколькими выходами для всех из них), который выводится в options проп.Может быть вызвано обновлениями таблицы.Вы можете инициализировать раскрывающиеся списки в макете с помощью фиктивной опции для запуска и позволить обратному вызову принять его оттуда.

  2. Я не уверен, что таблица делает это самостоятельно, но вы могли бы сделать обратный вызов для таблицы сделать это.Поскольку вы можете иметь только один обратный вызов на уникальный вывод, все, что включает обновление таблицы data prop, должно выполняться под обратным вызовом шва.Возможно, вы могли бы добавить кнопку типа «удалить строки» для прослушивания как Input, а также использовать данные и выбранные строки как State.Когда эта кнопка нажата и запускается обратный вызов, вы просто перестраиваете фрейм данных для таблицы без строк в значении rows_selected, а затем снова выводите данные таблицы.

  3. Конечно.Экспортировать это как?Вы можете настроить обратный вызов с помощью кнопки «экспортировать данные», которая может экспортировать ее по вашему желанию.Вы могли бы сделать функцию выгрузки данных в файл или распечатать их на консоль, сохранить их в базе данных, отправить по электронной почте, или все, что вы хотите в принципе.Все, что вы могли бы сделать с Python на самом деле.Для обратного вызова потребуются выходные данные, поэтому, возможно, просто откройте диалоговое окно или снэк-бар, информирующие пользователя о том, что запрос на экспорт получен и запущен / завершен.

...