2

我尝试使用plotly中的破折号制作交互式仪表板。我是它的初学者,因此我用一个例子来做。代码应该从某个文件夹上传不同的数据文件,并根据某个列绘制直方图。每个文件的名称看起来像"30092017ARB.csv"(date + ARB.csv)。代码循环遍历数据文件夹中的所有文件名,并在下拉底部打印文件名。选择文件名后,应将其上传并绘制直方图。我写了以下代码:

        import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objs as go
import pandas as pd
#
from os import listdir
from os.path import isfile, join
import numpy as np
#

mypath='/Users/Python/BeN_/data/'
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]



app = dash.Dash()

app.layout = html.Div([
    html.H2("Ausfallsreport"),
    html.Div(
        [
            dcc.Dropdown(
                id="dataFH",
                options=[{
                    'label': i,
                    'value': i
                } for i in onlyfiles],
                value=" "),
        ],
        style={'width': '25%',
               'display': 'inline-block'}),
    dcc.Graph(id='Mygraph'),
])
@app.callback(
dash.dependencies.Output('Mygraph', 'figure'),
[dash.dependencies.Input('dataFH', 'value')])
def update_graph(dataFH):
    df = pd.read_csv(mypath+dataFH, delimiter=';',encoding='cp1252') 
    # aggregate 
    dfagg = df.groupby('Bestand', as_index=False).agg({'MW': 'sum'})
    # make strings for x-axis 
    x=["BE-"+s for s in[str(s) for s in [int(x) for x in dfagg.iloc[:,0].tolist()]]]
    y=dfagg.ix[:,1].tolist()

    trace = go.Bar(x=x, y=y, name='Declined')

    return {
        'data': [trace],
        'layout':
        go.Layout(
            title='Customer Order Status for {}'.format(dataFH),
            barmode='bar',
            yaxis=dict(tickformat=".2%"))
    }


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

输出http://127.0.0.1:8050/. 问题是我没有得到任何条形图。有人可以帮我找出原因。

4

1 回答 1

1

如果您还没有弄清楚,问题是当用户最初连接时,它会触发您的回调。并且您将下拉菜单的初始值设置为

dataFH=" "

什么导致

df = pd.read_csv(mypath+dataFH ... 

因为该文件不存在而引发错误。

解决此问题的不同方法,但一种方法是检查 mypath+dataFH 是否是回调中的文件,如果不是文件,则为跟踪返回一个空列表:

def update_graph(dataFH):
    if isfile(mypath+dataFH):
        df = pd.read_csv(mypath+dataFH, delimiter=';',encoding='cp1252') 
        # aggregate 
        dfagg = df.groupby('Bestand', as_index=False).agg({'MW': 'sum'})
        # make strings for x-axis 
        x=["BE-"+s for s in[str(s) for s in [int(x) for x in dfagg.iloc[:,0].tolist()]]]
        y=dfagg.ix[:,1].tolist()

        trace = go.Bar(x=x, y=y, name='Declined')
    else: 
        trace=[]

    return {
        'data': [trace],
        'layout':
        go.Layout(
            title='Customer Order Status for {}'.format(dataFH),
            barmode='bar',
            yaxis=dict(tickformat=".2%"))
    }
于 2018-05-21T21:51:27.430 回答