Plotly Dash Update Drop Down 从回调中的数据框在回调中

Plotly Dash Update Drop Down from call back where data frame inside the call back

我正在尝试从数据框列值更新下拉菜单,我的数据框是在回调中生成的,因为我正在接受用户输入并从 API 中提取一些数据。

我想在下拉列表中创建一个过滤器,这就是我希望使用数据框列动态更新下拉列表的原因。

所以在回调中我有 df['name_id'],我想通过它更新细分下拉列表。

由于代码太长,我在代码中使用了唯一重要的代码:

import dash_core_components as dcc
import dash_html_components as html
import dash_bootstrap_components as dbc
import datetime
import dash_table
import httplib2
import pandas as pd
import requests
import io
import time

from Dash_App.app import app
from dash.dependencies import Input, Output, State
from oauth2client import GOOGLE_REVOKE_URI, GOOGLE_TOKEN_URI, client
from oauth2client import client, GOOGLE_TOKEN_URI
from datetime import date, timedelta
from apiclient import discovery

row1 = html.Div(
    [
        dbc.Row([
            dbc.Col([
                dbc.Input(id="client_id",
                          type="text",
                          placeholder="Client ID",
                          style={'width': '150px'}, persistence=True,
                          persistence_type='memory'),
            ]),
        ], align="center"),
    ], style={'margin-top': 20, 'margin-left': -90}
)

row2 = html.Div([
    dbc.Row([
        dbc.Col([
        dcc.Dropdown(
        id='segment',
                 options=[{'label': i, 'value': i} for i in "what"],
                 multi=True,
                 style={'width': '250px'},
                 placeholder='Segment'),
         ]),
    ])
])


tab_2_layout = dbc.Container(children=[
    row1,
    html.Br(),
    row2,
]
)


@app.callback(Output('output_div-ga', 'children'),
              [Input('submit-button', 'n_clicks')],
              [State('client_id', 'value'),
               ],
              )
def ga_output(clicks, client_id):
    if clicks is not None:
        my_client_id = client_id
        credentials = client.OAuth2Credentials(
            access_token=None,  # set access_token to None since we use a refresh token
            client_id=my_client_id)

        credentials.refresh(httplib2.Http())  # refresh the access token (optional)

        http = credentials.authorize(httplib2.Http())  # apply the credentials

        service_v3 = discovery.build('analytics', 'v3', http=http)
        segments = service_v3.management().segments().list().execute()
        df = pd.DataFrame(segments['items'])
        df = df[['name', 'id']]
        df['name_id'] = df.name.astype(str).str.cat(df.id.astype(str), sep=':')
        return html.Div([dcc.Store('memory'),
                         dash_table.DataTable(
                             id='table',
                             columns=[{"name": i, "id": i} for i in dff.columns],
                             data=dff.to_dict("rows"), persistence=True, persistence_type='memory',
                             export_format="csv",
                         ),
                         ])

我可以通过在回调中生成表单来解决这个问题。

return html.Div([
            dbc.Row([
                dbc.Col([
                    dcc.Dropdown(
                        id='segment',
                        options=[{'label': i, 'value': i} for i in df['name_id'].unique()],
                        persistence=True, persistence_type='memory',
                        multi=True,
                        style={'width': '250px', 'margin-left': -250, 'margin-top': 10},
                        placeholder='Segment'),
                ]), ]), ])