Plotly Dash:多选下载不工作
Plotly Dash: Multiple Selection Download Not Working
我正在尝试构建一个 dash 应用程序,我可以在其中 select 基于过滤器和下载的数据,如 table 中所示。因此,当我下载一个 select 离子的数据时,它可以正常工作,但是当我 select 多个状态的数据时,它会给出一个空白文件。
谁能帮我,这里出了什么问题?
import dash
import dash_core_components as dcc
import dash_html_components as html
import urllib.parse
import pandas as pd
df = pd.read_csv(
'https://gist.githubusercontent.com/chriddyp/'
'c78bf172206ce24f77d6363a2d754b59/raw/'
'c353e8ef842413cae56ae3920b8fd78468aa4cb2/'
'usa-agricultural-exports-2011.csv')
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 = dash.Dash()
app.layout = html.Div(children=[
html.H4(children='US Agriculture Exports (2011)'),
dcc.Dropdown(id='dropdown', options=[
{'label': i, 'value': i} for i in df.state.unique()
], multi=True, placeholder='Filter by state...'),
html.Div(id='table-container'),
html.A('Download Data', id='download-link', download="rawdata.csv", href="", target="_blank")
])
def filter_data(value):
if value is None:
return df
else:
return df[df['state'] == '|'.join(value)]
@app.callback(
dash.dependencies.Output('table-container', 'children'),
[dash.dependencies.Input('dropdown', 'value')])
def display_table(dropdown_value):
if dropdown_value is None:
return generate_table(df)
dff = df[df.state.str.contains('|'.join(dropdown_value))]
return generate_table(dff)
@app.callback(
dash.dependencies.Output('download-link', 'href'),
[dash.dependencies.Input('dropdown', 'value')])
def update_download_link(filter_value):
dff = filter_data(filter_value)
csv_string = dff.to_csv(index=False, encoding='utf-8')
csv_string = "data:text/csv;charset=utf-8,%EF%BB%BF" + urllib.parse.quote(csv_string)
return csv_string
# app.css.append_css({"external_url": "https://codepen.io/chriddyp/pen/bWLwgP.css"})
if __name__ == '__main__':
app.run_server(debug=True)
filter_data()
函数returns一个空数据框,这就是为什么从应用程序下载的 CSV 文件是空的。
import pandas as pd
df = pd.read_csv('https://gist.githubusercontent.com/chriddyp/c78bf172206ce24f77d6363a2d754b59/raw/c353e8ef842413cae56ae3920b8fd78468aa4cb2/usa-agricultural-exports-2011.csv')
def filter_data(value):
if value is None:
return df
else:
return df[df['state'] == '|'.join(value)]
df1 = filter_data(['Alabama', 'Alaska', 'Arizona'])
df1.head()
Empty DataFrame
Columns: [Unnamed: 0, state, total exports, beef, pork, poultry, dairy, fruits fresh, fruits proc, total fruits, veggies fresh, veggies proc, total veggies, corn, wheat, cotton]
Index: []
如果您重新定义 filter_data()
函数,应用程序将按预期运行。
def filter_data(value):
if value is None:
return df
else:
return df[df['state'].isin(value)]
df2 = filter_data(['Alabama', 'Alaska', 'Arizona'])
df2.head()
Unnamed: 0 state total exports beef ... total veggies corn wheat cotton
0 0 Alabama 1390.63 34.4 ... 14.33 34.9 70.0 317.61
1 1 Alaska 13.31 0.2 ... 1.56 0.0 0.0 0.00
2 2 Arizona 1463.17 71.3 ... 386.91 7.3 48.7 423.95
[3 rows x 16 columns]
我正在尝试构建一个 dash 应用程序,我可以在其中 select 基于过滤器和下载的数据,如 table 中所示。因此,当我下载一个 select 离子的数据时,它可以正常工作,但是当我 select 多个状态的数据时,它会给出一个空白文件。 谁能帮我,这里出了什么问题?
import dash
import dash_core_components as dcc
import dash_html_components as html
import urllib.parse
import pandas as pd
df = pd.read_csv(
'https://gist.githubusercontent.com/chriddyp/'
'c78bf172206ce24f77d6363a2d754b59/raw/'
'c353e8ef842413cae56ae3920b8fd78468aa4cb2/'
'usa-agricultural-exports-2011.csv')
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 = dash.Dash()
app.layout = html.Div(children=[
html.H4(children='US Agriculture Exports (2011)'),
dcc.Dropdown(id='dropdown', options=[
{'label': i, 'value': i} for i in df.state.unique()
], multi=True, placeholder='Filter by state...'),
html.Div(id='table-container'),
html.A('Download Data', id='download-link', download="rawdata.csv", href="", target="_blank")
])
def filter_data(value):
if value is None:
return df
else:
return df[df['state'] == '|'.join(value)]
@app.callback(
dash.dependencies.Output('table-container', 'children'),
[dash.dependencies.Input('dropdown', 'value')])
def display_table(dropdown_value):
if dropdown_value is None:
return generate_table(df)
dff = df[df.state.str.contains('|'.join(dropdown_value))]
return generate_table(dff)
@app.callback(
dash.dependencies.Output('download-link', 'href'),
[dash.dependencies.Input('dropdown', 'value')])
def update_download_link(filter_value):
dff = filter_data(filter_value)
csv_string = dff.to_csv(index=False, encoding='utf-8')
csv_string = "data:text/csv;charset=utf-8,%EF%BB%BF" + urllib.parse.quote(csv_string)
return csv_string
# app.css.append_css({"external_url": "https://codepen.io/chriddyp/pen/bWLwgP.css"})
if __name__ == '__main__':
app.run_server(debug=True)
filter_data()
函数returns一个空数据框,这就是为什么从应用程序下载的 CSV 文件是空的。
import pandas as pd
df = pd.read_csv('https://gist.githubusercontent.com/chriddyp/c78bf172206ce24f77d6363a2d754b59/raw/c353e8ef842413cae56ae3920b8fd78468aa4cb2/usa-agricultural-exports-2011.csv')
def filter_data(value):
if value is None:
return df
else:
return df[df['state'] == '|'.join(value)]
df1 = filter_data(['Alabama', 'Alaska', 'Arizona'])
df1.head()
Empty DataFrame
Columns: [Unnamed: 0, state, total exports, beef, pork, poultry, dairy, fruits fresh, fruits proc, total fruits, veggies fresh, veggies proc, total veggies, corn, wheat, cotton]
Index: []
如果您重新定义 filter_data()
函数,应用程序将按预期运行。
def filter_data(value):
if value is None:
return df
else:
return df[df['state'].isin(value)]
df2 = filter_data(['Alabama', 'Alaska', 'Arizona'])
df2.head()
Unnamed: 0 state total exports beef ... total veggies corn wheat cotton
0 0 Alabama 1390.63 34.4 ... 14.33 34.9 70.0 317.61
1 1 Alaska 13.31 0.2 ... 1.56 0.0 0.0 0.00
2 2 Arizona 1463.17 71.3 ... 386.91 7.3 48.7 423.95
[3 rows x 16 columns]