由于添加了简单的代码行,PlotlyDash图表失败

2024-06-17 09:36:31 发布

您现在位置:Python中文网/ 问答频道 /正文

在我更改此位之前,以下脚本一直有效:

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)



Tags: importformatmapdfifvaluemetricelse
1条回答
网友
1楼 · 发布于 2024-06-17 09:36:31

当选择某些下拉列表时,例如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

现在,无论选择何种下拉列表组合,它都可以工作

相关问题 更多 >