Python Da sh приложение добавить кнопку загрузки в обратном вызове - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь загрузить фрейм данных с помощью кнопки загрузки в приложении sh, но я не могу поместить logi c, где я могу вставить это в свой обратный вызов. Я генерирую фрейм данных на основе выбора пользователя и использую Dash_table.DataTable.

вот полный код:

import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output, State
import dash_bootstrap_components as dbc
import datetime
import dash_table

from Dash_App.app import app
import pandas as pd

row1 = html.Div(
    [
        dbc.Row([
            dbc.Col([
                dbc.Input(id="ad_account_id",
                          type="text",
                          placeholder="Account ID",
                          style={'width': '150px'}),
            ]),

            dbc.Col([
                dbc.Input(id="app_id",
                          type="text",
                          placeholder="App ID",
                          style={'width': '150px'}),
            ]),
            dbc.Col([
                dbc.Input(id="access_token",
                          type="text",
                          style={'width': '150px'},
                          placeholder="Access Token")
            ]),
            dbc.Col([
                dbc.Input(id="app_secret",
                          type="text",
                          style={'width': '150px'},
                          placeholder="App Secret")
            ]),

            dbc.Col([
                dcc.Dropdown(
                    id='dimensions',
                    options=[{'label': i, 'value': i} for i in ['Campaign', 'Placement', 'Creative']],
                    multi=True,
                    style={'width': '150px'},
                    placeholder='Dimensions')
            ]),
            dbc.Col([
                dcc.Dropdown(
                    id='metrics',
                    options=[{'label': i, 'value': i} for i in ['Impressions', 'Clicks', 'Conversions']],
                    multi=True,
                    style={'width': '150px'},
                    placeholder='Metrics')
            ])
        ], align="center"),
    ], style={'margin-top': 20, 'margin-left': -100}
)

row2 = html.Div([
    dbc.Row([
        dbc.Col([
            dcc.DatePickerSingle(
                id='start-date',
                placeholder="Start Date",
                min_date_allowed=datetime.datetime.now().strftime('2018-01-01'),
                max_date_allowed=datetime.datetime.today().date(),
                display_format='YYYY-MM-DD',
                style={'width': '150px', 'margin-left': 180}
            ),
        ], ),
        dbc.Col([
            # html.Br(),
            dcc.DatePickerSingle(
                id='end-date',
                placeholder="End Date",
                min_date_allowed=datetime.datetime.now().strftime('2018-01-01'),
                max_date_allowed=datetime.datetime.today().date(),
                display_format='YYYY-MM-DD',
                style={'width': '150px', 'margin-left': 60}
            )], align="center"),
    ])
])

row3 = html.Div([
    dbc.Row([
        dbc.Col([
            html.Button(id='submit-button', type='submit', children='Submit', style={'width': '150px', 'margin-top': 5,
                                                                                     'margin-left': 370}),

        ], width={"order": "first"}),
        dbc.Col([
            html.Div(id='output_div'),
        ])
    ])
])

row4 = html.Div([
    html.A(html.Button('Download Data', id='download-button'), id='download-link-facebook',
           style={'width': '120px', 'margin-top': 10, 'margin-left': 345})
])

tab_1_layout = dbc.Container(children=[
    row1,
    html.Br(),
    row2,
    html.Br(),
    row3,
    row4
]
)


@app.callback(Output('output_div', 'children'),
              [Input('submit-button', 'n_clicks')],
              [State('ad_account_id', 'value'),
               State('app_id', 'value'), State('access_token', 'value'),
               State('app_secret', 'value'), State('dimensions', 'value'),
               State('metrics', 'value'),
               State('start-date', 'date'),
               State('end-date', 'date'),
               ],
              )
def update_output(clicks, ad_account_id, app_id, access_token, app_secret, dimensions, metrics, start_date, end_date):
    if clicks is not None:
        my_ad_account = ad_account_id
        my_app_id = app_id
        my_access_token = access_token
        my_app_secret = app_secret
        my_dimensions = dimensions
        my_metrics = metrics
        my_start_date = start_date
        my_end_date = end_date

        df = pd.read_csv('usa-agricultural-exports-2011.csv', encoding='ISO-8859-1')
        new_df_col_list = my_dimensions + my_metrics
        print(new_df_col_list)
        dff = df[new_df_col_list]
        return html.Div([
            dash_table.DataTable(
                css=[{'selector': '.row',
                      'rule': 'margin: 0; white-space: inherit; overflow: inherit; text-overflow: inherit;'}],
                id='table',
                columns=[{"name": i, "id": i} for i in dff.columns],
                data=dff.to_dict("rows"),

                style_cell={"fontFamily": "Arial", "size": 10, 'textAlign': 'left',
                            'width': '{}%'.format(len(dff.columns)), 'textOverflow': 'ellipsis', 'overflow': 'hidden'},

                style_table={'maxHeight': '200px', 'overflowY': 'scroll', 'maxWidth': '1500px', 'overflowX': 'scroll'},
                row_selectable="multi",
                selected_rows=[],
                editable=True,
                style_header={'backgroundColor': '#ffd480', 'color': 'white', 'height': '10', 'width': '10',
                              'fontWeight': 'bold'},
                style_data={'whiteSpace': 'auto', 'height': 'auto', 'width': 'auto'},
                tooltip_data=[
                    {
                        column: {'value': str(value), 'type': 'markdown'}
                        for column, value in row.items()
                    } for row in dff.to_dict('rows')
                ],
                tooltip_duration=None
            ),
        ], style={'margin-top': 30, 'display': 'inline-block', 'margin-left': 20, 'width': '100%'})

1 Ответ

0 голосов
/ 05 мая 2020

Я никогда не ожидал, что это понравится так просто. Я добавил аргумент 'export' в свою таблицу da sh, и он решен.

return html.Div([
        dash_table.DataTable(
            css=[{'selector': '.row',
                  'rule': 'margin: 0; white-space: inherit; overflow: inherit; text-overflow: inherit;'}],
            id='table',
            export = "csv"
            columns=[{"name": i, "id": i} for i in dff.columns],
            data=dff.to_dict("rows"),

            style_cell={"fontFamily": "Arial", "size": 10, 'textAlign': 'left',
                        'width': '{}%'.format(len(dff.columns)), 'textOverflow': 'ellipsis', 'overflow': 'hidden'},

            style_table={'maxHeight': '200px', 'overflowY': 'scroll', 'maxWidth': '1500px', 'overflowX': 'scroll'},
            row_selectable="multi",
            selected_rows=[],
            editable=True,
            style_header={'backgroundColor': '#ffd480', 'color': 'white', 'height': '10', 'width': '10',
                          'fontWeight': 'bold'},
            style_data={'whiteSpace': 'auto', 'height': 'auto', 'width': 'auto'},
            tooltip_data=[
                {
                    column: {'value': str(value), 'type': 'markdown'}
                    for column, value in row.items()
                } for row in dff.to_dict('rows')
            ],
            tooltip_duration=None
        ),
    ], style={'margin-top': 30, 'display': 'inline-block', 'margin-left': 20, 'width': '100%'})
...