I figured it out! Here’s the code section that did it:
def main():
# Load the data
df = load_data()
# Create a mapping of Utility Number to a single Utility Name
utility_name_mapping = df.groupby('Utility Number')['Utility Name'].first()
# Set the title of the application
st.title('📈 WattArchive')
# Simple explainer
st.caption('Query and compare average electricity costs over time by utility, service type, and customer class.')
st.header('Query')
tab1, tab2 = st.tabs(["Utilities", "Data Types"])
# Get current query parameters
query_params = st.experimental_get_query_params()
with tab1:
# Allow user to filter by state and ownership before selecting utility
states = st.multiselect("Filter by states", sorted(df['State'].unique()))
ownership_types = st.multiselect("Filter by ownership types", df['Ownership'].unique())
# Filter the DataFrame based on the selected states and ownership types
df_filtered = df.copy()
if states:
df_filtered = df_filtered[df_filtered['State'].isin(states)]
if ownership_types:
df_filtered = df_filtered[df_filtered['Ownership'].isin(ownership_types)]
# Allow user to select utilities from the filtered data
if 'utilities' in query_params:
utilities = query_params['utilities']
else:
utilities = st.multiselect("Select utilities", df_filtered['Utility Name'].unique())
with tab2:
# Allow user to select service types
service_types = df_filtered['Service Type'].unique()
selected_service_types = query_params['service_types'] if 'service_types' in query_params else st.multiselect("Service Types", service_types)
# Allow user to select rate types
rate_types = ['Residential Rate', 'Commercial Rate', 'Industrial Rate']
selected_rates = query_params['rate_types'] if 'rate_types' in query_params else st.multiselect("Rate types", rate_types)
# Year range selection
if not df_filtered.empty:
min_year = int(df_filtered["Data Year"].min())
max_year = int(df_filtered["Data Year"].max())
if 'start_year' in query_params and 'end_year' in query_params:
year_range = (int(query_params['start_year'][0]), int(query_params['end_year'][0]))
else:
year_range = st.slider("Year Range", min_year, max_year, (min_year, max_year))
start_year, end_year = year_range
df_filtered = df_filtered[(df_filtered['Data Year'] >= start_year) & (df_filtered['Data Year'] <= end_year)]
if utilities and selected_rates and selected_service_types:
# Create share permalink
data = {
'utilities': utilities,
'service_types': selected_service_types,
'rate_types': selected_rates,
'start_year': year_range[0],
'end_year': year_range[1],
}
query_string = urllib.parse.urlencode(data, doseq=True)
url = f'https://wattarchive.streamlit.app/?run=1&{query_string}&autoupdate=true'
st.markdown(f'[🔗 Share these rates]({url})', unsafe_allow_html=True)