Zain / app.py
Ashar086's picture
Update app.py
459e711 verified
import streamlit as st
import pandas as pd
import plotly.express as px
# Load and clean the dataset
@st.cache_data
def load_data():
df = pd.read_csv("hospital_readmissions.csv")
# Clean missing values
df['medical_specialty'] = df['medical_specialty'].replace('Missing', 'Unknown')
df['diag_1'] = df['diag_1'].replace('Missing', 'Unknown_Diagnosis')
df['diag_2'] = df['diag_2'].replace('Missing', 'Unknown_Diagnosis')
df['diag_3'] = df['diag_3'].replace('Missing', 'Unknown_Diagnosis')
# Extract numerical age from range
df['age'] = df['age'].str.extract(r'\[(\d+)-').astype(float)
return df
df = load_data()
# Sidebar for navigation
st.sidebar.title("Navigation")
page = st.sidebar.radio("Go to", ["Overview", "Factors Influencing Readmissions",
"Hospital Stay and Procedures", "Patient Health Insights",
"Recommendations"])
# Filters for interactivity
st.sidebar.header("Filters")
age_group = st.sidebar.multiselect("Select Age Group", options=sorted(df['age'].unique()), default=sorted(df['age'].unique()))
diagnosis = st.sidebar.multiselect("Select Diagnosis", options=df['diag_1'].unique(), default=["Circulatory", "Diabetes"])
# Filter the data based on user selection
filtered_df = df[df['age'].isin(age_group) & df['diag_1'].isin(diagnosis)]
# Page 1: Overview
if page == "Overview":
st.title("Hospital Readmissions Overview")
# Total Patients and Readmission Rate
total_patients = len(filtered_df)
readmission_rate = filtered_df['readmitted'].value_counts(normalize=True).get('yes', 0) * 100
col1, col2 = st.columns(2)
col1.metric("Total Patients", total_patients)
col2.metric("Readmission Rate (%)", f"{readmission_rate:.2f}%")
# Age Distribution
st.subheader("Age Distribution of Patients")
fig_age = px.histogram(filtered_df, x='age', nbins=10, title="Age Distribution",
labels={'age': 'Age Group', 'count': 'Number of Patients'})
fig_age.update_layout(showlegend=False)
st.plotly_chart(fig_age, use_container_width=True)
# Page 2: Factors Influencing Readmissions
elif page == "Factors Influencing Readmissions":
st.title("Factors Influencing Readmissions")
# Readmission by Medical Specialty
st.subheader("Readmission Rates by Medical Specialty")
specialty_readmission = filtered_df.groupby('medical_specialty')['readmitted'].value_counts(normalize=True).unstack().fillna(0)
specialty_readmission = specialty_readmission.sort_values(by='yes', ascending=False).head(10)
fig_specialty = px.bar(specialty_readmission, y='yes', title="Top Specialties with High Readmission Rates",
labels={'index': 'Medical Specialty', 'yes': 'Readmission Rate (%)'})
fig_specialty.update_layout(yaxis_tickformat=".0%")
st.plotly_chart(fig_specialty, use_container_width=True)
# Page 3: Hospital Stay and Procedures
elif page == "Hospital Stay and Procedures":
st.title("Hospital Stay and Procedures")
# Hospital Stay Duration by Readmission Status
st.subheader("Hospital Stay Duration by Readmission Status")
fig_stay = px.box(filtered_df, x='readmitted', y='time_in_hospital', title="Hospital Stay Duration by Readmission Status",
labels={'readmitted': 'Readmitted', 'time_in_hospital': 'Hospital Stay (Days)'})
st.plotly_chart(fig_stay, use_container_width=True)
# Page 4: Patient Health Insights
elif page == "Patient Health Insights":
st.title("Patient Health Insights")
# Diabetes and Readmissions
st.subheader("Diabetes Medication and Readmissions")
diabetes_readmission = filtered_df.groupby('diabetes_med')['readmitted'].value_counts(normalize=True).unstack().fillna(0)
fig_diabetes = px.bar(diabetes_readmission, barmode='group', title="Readmission Rates by Diabetes Medication",
labels={'index': 'Diabetes Medication', 'yes': 'Readmission Rate (%)'})
fig_diabetes.update_layout(yaxis_tickformat=".0%")
st.plotly_chart(fig_diabetes, use_container_width=True)
# Page 5: Recommendations
elif page == "Recommendations":
st.title("Recommendations to Reduce Readmissions")
st.markdown("""
### Key Risk Factors for Readmission:
- **Age Group**: Older patients (70-90) have higher readmission rates.
- **Medical Specialty**: Certain specialties like Cardiology and Internal Medicine show higher readmission rates.
- **Diagnosis**: Circulatory and Respiratory conditions are common among readmitted patients.
- **Medication Changes**: Patients with medication changes are more likely to be readmitted.
### Tips to Reduce Readmissions:
- **Adhere to Medications**: Ensure patients take prescribed medications consistently.
- **Follow-Up Appointments**: Schedule regular follow-ups after discharge.
- **Monitor Chronic Conditions**: Pay special attention to patients with diabetes or circulatory issues.
- **Emergency Visits**: Address underlying issues for patients with frequent emergency visits.
""")
# Interactive Widget
st.subheader("Personalized Risk Factors")
selected_age = st.selectbox("Select Age Group", sorted(filtered_df['age'].unique()))
selected_diagnosis = st.selectbox("Select Diagnosis", filtered_df['diag_1'].unique())
personalized_df = filtered_df[(filtered_df['age'] == selected_age) & (filtered_df['diag_1'] == selected_diagnosis)]
readmission_rate_personalized = personalized_df['readmitted'].value_counts(normalize=True).get('yes', 0) * 100
st.metric("Readmission Rate for Selected Group", f"{readmission_rate_personalized:.2f}%")