TSouthey's picture
Upload app.py
b235dd0 verified
Raw
History Blame Contribute Delete
4.79 kB
# put streamlit code here as needed
import streamlit as st
import pandas as pd
import altair as alt
st.set_page_config(page_title= "IS 445 Streamlit Homework", layout= "wide")
st.title("Illinois License Records")
licds = "https://raw.githubusercontent.com/UIUC-iSchool-DataViz/is445_data/main/licenses_fall2022.csv"
def licdata():
df = pd.read_csv(licds)
#fixes date string stuff
df["Original Issue Date"] = pd.to_datetime(df["Original Issue Date"], errors= "coerce")
df["Expiration Date"] = pd.to_datetime(df["Expiration Date"], errors= "coerce")
#changes the cols for plot bc full dates were ugly
df["Issue Year"] = df["Original Issue Date"].dt.year
df["Expiration Year"] = df["Expiration Date"].dt.year
return df
df = licdata()
st.write(
"This app is using the Illinois licenses dataset (https://raw.githubusercontent.com/UIUC-iSchool-DataViz/is445_data/main/licenses_fall2022.csv). "
"The dataset includes cols like: license type, license status, city, county, issue date, expiration date, and discipline.")
st.subheader("License Status by Type")
commonlics = (df["License Type"].value_counts().head(5).index)
commonfltrd = df[df["License Type"].isin(commonlics)].copy()
#interactivity for legend
statuss= alt.selection_point(fields= ["License Status"], bind= "legend")
plot1 = (alt.Chart(commonfltrd).mark_bar().encode(
y= alt.Y("License Type:N", sort= "-x", title= "License Type"),
x= alt.X("count():Q", title= "Number of Records"),
color= alt.Color("License Status:N", title="License Status", scale= alt.Scale(scheme= "tableau20")),
order= alt.Order("License Stats:N", sort= "descending"),
opacity= alt.condition(statuss, alt.value(1), alt.value(0.2)),
tooltip= ["License Type:N", "License Status:N", "count():Q"]).add_params(statuss))
# .properties(width=800, height=400))
st.altair_chart(plot1, use_container_width= True)
st.write(
"This first visualization looks into how license records are spread out over the top 5 most common license types, and each bar broken down into the license status. I tried multiple types of plots but settled on a horizontal stacked bar chart primarily due to category names being so long. The horizontal orientation made them easiest to read while still letting me compare the differnt totals. I ended up doing some extra work to sort the bars by the largest categories, and I chose a common color pallet to differentiate between each group. The legend is the interactive aspect, so the viewer can isolate and breakdown any statuses. If I had more time, I would shorten the number of status categories shown or group smaller/redundant ones together so the sections are easier to see. I would also like to order the legend by size but I do not know how to do that.")
st.subheader("Issue Years for Active Licenses")
#had to do some extra stuff here becuase of how i handled the date time before
activels = df[(df["License Status"] == "ACTIVE") & (df["Issue Year"].notna()) & (df["Issue Year"] >= 1950)].copy()
plot2 = (alt.Chart(activels).mark_bar().encode(
#better binning bc of so many years
x= alt.X("Issue Year:O", bin= alt.Bin(step= 5, extent=[1966, 2022]), title= "Year Issued"),
y=alt.Y("count():Q", title="# of Active Licenses"),
tooltip= [alt.Tooltip("Issue Year:Q", bin= alt.Bin(step= 5, extent=[1966, 2022]), title= "Issue Year Range"),
alt.Tooltip("count():Q", title= "# of Active Licenses")]))
st.altair_chart(plot2, use_container_width= True)
st.write("The second visualization looks only at the active licenses and looks at when they were originally issued. They were grouped into five-year bins due to the data set having 56 unique years, since the data ranges from 1966 to 2022 I wanted to reflect that, however altair would not let me set the domain. The binned bar chart made it far easier to identify these trends by zooming out a little, it also makes the increases more stable over time instead of larger spikes and so on, especially in recent years. I also fixed the date times and filtered out any missing values and very early years to keep the focus on the more recent licensing trends. If I had more time, I would want to compare this with other license statuses so I could see how the timing relates to whether a license will remain active or become inactive later over time.")
st.subheader("HW5 Overlap")
st.write("I am not reusing the Building Inventory dataset or the same plots types from Homework #5 nor any of the same code. I chose the Illinois licenses dataset for the streamlit hw here instead, so the dataset, variables, and visual design are going to be quite different to my prior Homework #5 submission mainly becuase I was not a fan of the dataset before.")