from typing import List import streamlit as st import altair as alt st.subheader("Fan insight") insights = st.session_state["fansifter_ratio_table_df"] insights_per_segments = st.session_state["fansifter_segments_table_df"] with st.sidebar: selected_artist = st.selectbox( label="Choose artist", options=st.session_state["artists"], index=st.session_state["index"], key="artist", ) if selected_artist: territory_multiselect: List[str] = st.multiselect( "Choose territories", insights[insights["ARTIST_NAME"] == selected_artist]["TERRITORY"].unique(), ) # Update the index. It is used in the select box. st.session_state["index"] = st.session_state["artists"].index(st.session_state["artist"]) st.write( '
Overall fan engagement by territory.
', unsafe_allow_html=True, ) if territory_multiselect: aggregated_metric = ( insights[ (insights["FANSIFTER"] == 1) & (insights["ARTIST_NAME"] == st.session_state["artist"]) & (insights["TERRITORY"].isin(territory_multiselect)) ] .groupby(["ARTIST_NAME"])[["UNIQUE_CUSTOMERS", "TOTAL_UNIQUE_CUSTOMERS"]] .sum() .assign(RATIO=lambda x: x["UNIQUE_CUSTOMERS"] / x["TOTAL_UNIQUE_CUSTOMERS"]) ) st.metric( label="% of fans in Fansifter", value=(aggregated_metric["RATIO"] * 100).round(1), help="How many of purchasers are also in Fansifter for this artist", ) st.divider() st.write( 'This is based on the fans who are available in Fansifter.
', unsafe_allow_html=True, ) aggregated_segment_metric = ( insights_per_segments[ (insights_per_segments["ARTIST_NAME"] == st.session_state["artist"]) & (insights_per_segments["TERRITORY"].isin(territory_multiselect)) ] .groupby(["ARTIST_NAME", "SEGMENT_NAME"])[["UNIQUE_CUSTOMERS", "TOTAL_UNIQUE_CUSTOMERS"]] .sum() .assign(PERCENTAGE=lambda x: x["UNIQUE_CUSTOMERS"] / x["TOTAL_UNIQUE_CUSTOMERS"]) .reset_index() ) st.write( alt.Chart(aggregated_segment_metric.sort_values(by=["PERCENTAGE"])) .mark_bar() .encode( x=alt.X("PERCENTAGE", sort=None, title="%"), y=alt.Y("SEGMENT_NAME:N", sort="-x", title="SEGMENT"), ) .properties(width=700, height=350) ) else: st.write("Please choose artist and territory from left menu.")