下面的脚本一直有效,直到我更改了这一点:
if selected_class=='USD':
tick_format=None
else:
tick_format='%'要这样做:
if selected_class=='USD':
tick_format=None
else:
if max(abs(df4['value'])) < 0.1:
tick_format='.2%'
else:
tick_format='%'下面是更改后的当前脚本。我不明白为什么它不能工作。
我得到一个回调错误。这跟max(abs(df4['value'])) < 0.1这行有关系。
我以前尝试过max(abs(df4.value)) < 0.1,但返回了一个错误:dataframe has no attribute 'value'。
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import numpy as np
import pandas as pd
external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
path = 'https://raw.githubusercontent.com/tbuckworth/Public/master/CSVTest.csv'
df = pd.read_csv(path)
df2 = df[(df.Map==df.Map)]
def layout_function():
global df
df = pd.read_csv(path)
global df2
df2 = df[(df.Map==df.Map)]
available_strats = np.append('ALL',pd.unique(df2.Map.sort_values()))
classes1 = pd.unique(df2["class"].sort_values())
metrics1 = pd.unique(df2.metric.sort_values())
return html.Div([
html.Div([
dcc.Dropdown(
id="Strategy",
options=[{"label":i,"value":i} for i in available_strats],
value=list(available_strats[0:1]),
multi=True
),
dcc.Dropdown(
id="Class1",
options=[{"label":i,"value":i} for i in classes1],
value=classes1[0]
),
dcc.Dropdown(
id="Metric",
options=[{"label":i,"value":i} for i in metrics1],
value=metrics1[0]
)],
style={"width":"20%","display":"block"}),
html.Hr(),
dcc.Graph(id='Risk-Report')
])
app.layout = layout_function
@app.callback(
Output("Risk-Report","figure"),
[Input("Strategy","value"),
Input("Class1","value"),
Input("Metric","value"),
])
def update_graph(selected_strat,selected_class,selected_metric):
if 'ALL' in selected_strat:
df3 = df2[(df2["class"]==selected_class)&(df2.metric==selected_metric)]
else:
df3 = df2[(df2.Map.isin(selected_strat))&(df2["class"]==selected_class)&(df2.metric==selected_metric)]
df4 = df3.pivot_table(index=["Fund","Date","metric","class"],values="value",aggfunc="sum").reset_index()
traces = []
for i in df4.Fund.unique():
df_by_fund = df4[df4["Fund"] == i]
traces.append(dict(
x=df_by_fund["Date"],
y=df_by_fund["value"],
mode="lines",
name=i
))
if selected_class=='USD':
tick_format=None
else:
if max(abs(df4['value'])) < 0.1:
tick_format='.2%'
else:
tick_format='%'
return {
'data': traces,
'layout': dict(
xaxis={'type': 'date', 'title': 'Date'},
yaxis={'title': 'Values','tickformat':tick_format},
margin={'l': 40, 'b': 40, 't': 10, 'r': 10},
legend={'x': 0, 'y': 1},
hovermode='closest'
)
}
if __name__ == '__main__':
app.run_server(debug=True)发布于 2020-10-05 16:28:49
如果选择了某些下拉列表,使得df4没有行(因为没有为该下拉列表的组合选择任何值),则行if max(abs(df4['value'])) < 0.1:会产生错误。
我已经将这段代码调整为以下代码,以便在运行上述测试之前测试df4是否有一些行:
if selected_class=='USD':
tick_format=None
else:
if len(df4.index) != 0:
if max(abs(df4["value"])) < 0.1:
tick_format='.2%'
else:
tick_format='%'
else:
tick_format=None现在,无论选择哪种下拉菜单组合,它都可以正常工作。
https://stackoverflow.com/questions/63847795
复制相似问题