I’m coming from the exploratory data analysis side and I have a use case that may be pushing the edge slightly.
Let’s say I’m building a data explorer app and I am going to make 5 plots with different data.
Instead of writing 5 sections of code to add selectboxes, checkboxes, and sliders, I want to write 1 section of code and loop through the sets of data, programmatically adding those checkboxes and sliders based on some configuration file, say a csv. I’ve done this, and it works rather well in automatically generating multiple sections of Streamlet widgets.
So to start off, this is AWESOME. I can write an analysis workflow in 25 lines of code.
My issue comes when I interact with my fancy new programmatically built Streamlit app. For example, because I am generating widgets in a for loop, I may use the st.checkbox function on line 25 multiple times. This sometimes results in the callback for that checkbox being applied to the wrong analysis section.
Here is a code sample where I experience this problem. I am generating lists containing the st objects as an attempt to keep track of the handles:
df = load_data('my_analysis_config.csv')
for ind in df.index:
data.append(load_data(df['DataPath'][ind]))
xFields.append(st.sidebar.selectbox('X-Value:',(data[ind].columns)))
yFields.append(st.sidebar.selectbox('Y-Value:',(data[ind].columns)))
colorField.append(st.sidebar.selectbox('Color by: ', data[ind].columns))
fig = px.scatter(data[ind],
x=xFields[ind],
y=yFields[ind],
color=colorField[ind])
figs.append(st.plotly_chart(fig))
However, I also have the same problem when I don’t keep track of handles:
df = load_data('my_analysis_config.csv')
for ind in df.index:
data = load_data(df['DataPath'][ind]))
xField = st.sidebar.selectbox('X-Value:',(data.columns))
yField = st.sidebar.selectbox('Y-Value:',(data.columns))
colorField = st.sidebar.selectbox('Color by: ', data.columns)
fig = px.scatter(data,
x=xField,
y=yField,
color=colorField)
st.plotly_chart(fig)
Any suggestions on best practices here?