我在滑块,用户输入和工作表之间有依赖关系。虽然,从更新开始,我只能描述从字典创建的基本熊猫DataFrame,并在字典中进行简单的计算(基于阈值)。我无法显示表格,也不确定我要去哪里。
**其他信息:**
df
中metrics
是y_true
和y_pred
的计算值,为fr,这是尝试输出数据并使用回调更新数据的阈值。建议我在回调中创建表,然后使用“ Div”。定义其在显示器中的位置。我的下面的代码:
import dash_bootstrap_components as dbc
import dash_core_components as dcc
import dash_html_components as html
import numpy as np
from scipy import stats
import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot
from datetime import datetime as dt
import dash_table
import pandas as pd
from sklearn import svm, datasets
import base64
import numpy as np
from sklearn.metrics import roc_auc_score, accuracy_score, cohen_kappa_score, recall_score, accuracy_score, precision_score, f1_score
from sklearn import metrics
from dash.dependencies import Input, Output```
import pandas as pd
from dash.dependencies import Input, Output
threshold = 0.5
# read data
data = pd.read_csv('data.csv')
#count columns in dataframe
count_algo = len(data.columns)
################################################################
######################## Body ################################
################################################################
body = dbc.Container(
[
dbc.Row(
[
dbc.Col(
[
html.H2("Slider + Manual entry test"),
dcc.Slider(
id="my-slider",
min=0,
max=1,
step=0.01,
marks={"0": "0", "0.5": "0.5", "1": "1"},
value=threshold,
),
html.Div(id="update-table"),
]
),
dbc.Col(
[
html.Div(
[
html.Div(
dcc.Input(
id="input-box",
max=0,
min=1,
step=0.01,
value=threshold,
)
),
html.Div(id="slider-output-container"),
]
)
]
),
]
)
]
)
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
app.layout = html.Div([body])
##############################################################
######################## callbacks ###########################
##############################################################
@app.callback(
dash.dependencies.Output("slider-output-container", "children"),
[dash.dependencies.Input("my-slider", "value")],
)
def update_output(value):
threshold = float(value)
return threshold
# call back for slider to update based on manual input
@app.callback(
dash.dependencies.Output(component_id="my-slider", component_property="value"),
[dash.dependencies.Input("input-box", "value")],
)
def update_output(value):
threshold = float(value)
return threshold
# call back to update table
@app.callback(
dash.dependencies.Output("update-table", "children"),
[dash.dependencies.Input("my-slider", "value")],
)
def update_output(value):
#take value of threshold
threshold = float(value)
# add predicted
for i in data.iloc[:,1:]:
data['predicted_"{}"'.format(i)] = (data[i] >= threshold).astype('int')
table_data = pd.DataFrame.from_dict({
"AUC":[roc_auc_score(data.actual_label, data[i]) for i in data.iloc[:,count_algo:]],
"Accuracy":[accuracy_score(data.actual_label, data[i])for i in data.iloc[:,count_algo:]],
"Kappa":[cohen_kappa_score(data.actual_label, data[i])for i in data.iloc[:,count_algo:]],
"Sensitivity (Recall)": [recall_score(data.actual_label, data[i], average = 'weighted')for i in data.iloc[:,count_algo:]],
"Specificity": [accuracy_score(data.actual_label, data[i])for i in data.iloc[:,count_algo:]],
"Precision": [precision_score(data.actual_label, data[i], average = 'weighted')for i in data.iloc[:,count_algo:]],
"F1": [f1_score(data.actual_label, data[i], average = 'weighted')for i in data.iloc[:,count_algo:]]
}, orient = 'index').reset_index()
return html.Div([
dash_table.DataTable(
data=table_data.to_dict("rows"),
columns=[{"id": x, "name": x} for x in table_data.columns],
style_table={'overflowX': 'scroll'},
style_cell={'width':100},
)
])
if __name__ == "__main__":
app.run_server()
答案 0 :(得分:0)
我找到了解决问题的方法,但无法确定实际的问题是什么。我必须假设它与脚本的顺序有关(我可能会出现一个未填充的表)。无论如何,我通过创建一个函数来填充并返回表来解决此问题(见下文):
def roc_table(data,threshold):
#count columns in dataframe
count_algo = len(data.columns)
for i in data.iloc[:,1:]:
data['predicted_{}'.format(i)] = (data[i] >= threshold).astype('int')
rock_table = {
"AUC":[roc_auc_score(data.actual_label, data[i]) for i in data.iloc[:,count_algo:]],
"Accuracy":[accuracy_score(data.actual_label, data[i])for i in data.iloc[:,count_algo:]],
"Kappa":[cohen_kappa_score(data.actual_label, data[i])for i in data.iloc[:,count_algo:]],
"Sensitivity (Recall)": [recall_score(data.actual_label, data[i], average = 'weighted')for i in data.iloc[:,count_algo:]],
"Specificity": [accuracy_score(data.actual_label, data[i])for i in data.iloc[:,count_algo:]],
"Precision": [precision_score(data.actual_label, data[i], average = 'weighted')for i in data.iloc[:,count_algo:]],
"F1": [f1_score(data.actual_label, data[i], average = 'weighted')for i in data.iloc[:,count_algo:]]
}
rock_table = pd.DataFrame.from_dict(rock_table, orient = 'index').reset_index()
col = ['metrics']
col.extend([x for x in data.iloc[:,count_algo:]])
rock_table.columns = col
return rock_table
将roc_table(data)
插入dash_table
.div可以正常工作