Как удалить / понять ошибку: «ошибка обратного вызова при обновлении id.element» - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь визуализировать данные в Dash, используя среди прочего радарные карты. После того, как пользователь выбирает выбор из выпадающего меню, диаграмма обновляется соответствующим образом. Визуализация «почти идеальная», за исключением ошибки, генерируемой на каждом графике / выходе, с использованием раскрывающегося списка в качестве входных данных.

Как удалить / устранить следующие ошибки:

Callback error updating new_radar.figure
Callback error updating GDPR_score.children
Callback error updating tbc_radar.figure

Код следующий:

# -*- coding: utf-8 -*-
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output

import plotly.graph_objects as go

import pandas as pd


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

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

cols_to_use = []
for i in range(20):
    cols_to_use.append(i)

df = pd.read_csv('https://raw.githubusercontent.com/lo1gr/GDPR/master/GDPR.csv', usecols=cols_to_use)
row_names = list(df.Policy)
gdpr_dim = list(df.loc[df['Policy'] == 'POLICY01'].iloc[:, 1:8])
# too long:
# tbc_law = list(df.loc[df['Policy'] == 'POLICY01'].iloc[:, 11:19])[::3]
tbc_law = ['TRANSPARENCY', 'BENEFITS', 'CONTROL']


gdpr_dim


# list out of a row:
noway = list(df.loc[df['Policy'] == 'POLICY01'].iloc[:, 1:8].iloc[0])
# numbers = [ int(x) for x in noway ]
noway

# list tbc
# list(df.loc[df['Policy'] == 'POLICY01'].iloc[:, 11:19].iloc[0])[::3]


# df.at[5,'OVERALL: I trust this company for handling my data']

def generate_table(dataframe, max_rows=10):
    return html.Table(
        # Header
        [html.Tr([html.Th(col) for col in dataframe.columns])] +

        # Body
        [html.Tr([
            html.Td(dataframe.iloc[i][col]) for col in dataframe.columns
        ]) for i in range(min(len(dataframe), max_rows))]
    )

app.layout = html.Div(children=[
    html.H1(children='GDPR visualization', style={'textAlign': 'center'}),

    html.Div(children='''
        Using data graciously labeled by our Data Science class <3.
    '''),

    dcc.Dropdown(
            id='dropdown',
            options=[
                {'label': v, 'value': v} for v in row_names
            ],
            value='Policy01',
            placeholder='Policy01'
        ),

    # dcc.Graph(
    #     id='new_radar',
    #     figure={
    #         'data': [go.Scatterpolar(
    #                                 r=list(df.loc[df['Policy'] == 'POLICY01'].iloc[:, 1:8].iloc[0]),
    #                                 theta=gdpr_dim,
    #                                 fill='toself'
    #                                 )],
    #         'layout': {
    #             'title': 'Dash Data Visualization for Policy01'
    #         }
    #     }
    # ),

    # dcc.Graph(
    #     id='new_radar'
    # ),

    html.P(id='GDPR_score'),

    # dcc.Graph(
    #     id='tbc_radar'
    # ),

    html.Div([
        html.Div([
            dcc.Graph(id='tbc_radar')
        ], className="six columns"),

        html.Div([
            dcc.Graph(id='new_radar')
        ], className="six columns"),
    ], className="row"),


    generate_table(df)
])


@app.callback(
    Output(component_id='new_radar', component_property='figure'),
    [Input(component_id='dropdown', component_property='value')]
)
def update_output_div(input_value):
    fig = [go.Scatterpolar(
            r=[int(x) for x in list(df.loc[df['Policy'] == str(input_value)].iloc[:, 1:8].iloc[0])],
            theta=gdpr_dim,
            fill='toself'
            )]
    layout = {'title': 'GDPR viz for ' + input_value}

    return {"data": fig, "layout": layout}

@app.callback(
    Output(component_id='GDPR_score', component_property='children'),
    [Input(component_id='dropdown', component_property='value')]
)
def update_output_div(input_value):
    test = list(df.loc[df['Policy'] == str(input_value)].iloc[:, 1:8].iloc[0])
    score = int(sum(test))

    return score

@app.callback(
    Output(component_id='tbc_radar', component_property='figure'),
    [Input(component_id='dropdown', component_property='value')]
)
def update_output_div(input_value):
    fig = [go.Scatterpolar(
            r=[int(x) for x in list(df.loc[df['Policy'] == str(input_value)].iloc[:, 11:19].iloc[0])[::3]],
            theta=tbc_law,
            fill='toself'
            )]
    layout = {'title': 'TBC viz for ' + input_value}

    return {"data": fig, "layout": layout}


app.css.append_css({
    'external_url': 'https://codepen.io/chriddyp/pen/bWLwgP.css'
})

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

Кроме того, есть какие-либо комментарии к коду в целом? Что бы вы сделали лучше?

Спасибо!

...