ayush-thakur02's picture
Create app.py
9dd40a1 verified
import streamlit as st
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.svm import SVR
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
import time
# Wide mode
st.set_page_config(layout="wide")
# Initialize parameters
params = {
'Beds': 100,
'Doctors': 50,
'Nurses': 100,
'Ventilators': 20,
'ICU_Beds': 20,
'Surgical_Suites': 5,
'Emergency_Room_Beds': 10,
'Pharmacy_Staff': 5,
'Lab_Staff': 5,
'Radiology_Staff': 5,
'Patient_Admissions': 50,
'Patient_Discharges': 40,
'Average_Stay': 5,
'ICU_Admissions': 10,
'Surgical_Cases': 20,
'Emergency_Room_Visits': 30,
'Pharmacy_Requests': 50,
'Lab_Requests': 40,
'Radiology_Requests': 30
}
# Create a Streamlit app
st.title("Hospital Resource Allocation Simulator")
# Add a sidebar for input parameters
st.sidebar.header("Input Parameters")
for param, value in params.items():
params[param] = st.sidebar.slider(param, 0, 200, value)
# Create a button to start the simulation
if st.sidebar.button("Start Live Simulation"):
st.header("Live Simulation")
st.write("Simulation started. Graphs will update every second to represent hourly changes in resource allocation.")
# Initialize dataframes to store simulation data
beds_df = pd.DataFrame(index=pd.date_range(start='2022-01-01', periods=24, freq='H'), columns=['Available', 'Occupied'])
doctors_df = pd.DataFrame(index=pd.date_range(start='2022-01-01', periods=24, freq='H'), columns=['Available', 'Busy'])
nurses_df = pd.DataFrame(index=pd.date_range(start='2022-01-01', periods=24, freq='H'), columns=['Available', 'Busy'])
ventilators_df = pd.DataFrame(index=pd.date_range(start='2022-01-01', periods=24, freq='H'), columns=['Available', 'In_Use'])
icu_beds_df = pd.DataFrame(index=pd.date_range(start='2022-01-01', periods=24, freq='H'), columns=['Available', 'Occupied'])
surgical_suites_df = pd.DataFrame(index=pd.date_range(start='2022-01-01', periods=24, freq='H'), columns=['Available', 'In_Use'])
emergency_room_beds_df = pd.DataFrame(index=pd.date_range(start='2022-01-01', periods=24, freq='H'), columns=['Available', 'Occupied'])
pharmacy_staff_df = pd.DataFrame(index=pd.date_range(start='2022-01-01', periods=24, freq='H'), columns=['Available', 'Busy'])
lab_staff_df = pd.DataFrame(index=pd.date_range(start='2022-01-01', periods=24, freq='H'), columns=['Available', 'Busy'])
radiology_staff_df = pd.DataFrame(index=pd.date_range(start='2022-01-01', periods=24, freq='H'), columns=['Available', 'Busy'])
# Initialize log for resource usage
log = []
# Generate synthetic data for training
np.random.seed(42)
X = pd.DataFrame(np.random.randint(0, 100, size=(100, len(params))), columns=params.keys())
y = np.random.randint(0, 100, size=100) # Dummy target for demonstration
# Split data for training and testing
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Initialize regression models
models = {
'Linear Regression': LinearRegression(),
'Random Forest Regression': RandomForestRegressor(),
'SVR': SVR(),
'Decision Tree Regression': DecisionTreeRegressor(),
'Gradient Boosting Regression': GradientBoostingRegressor()
}
# Predict values for each parameter using each model
predicted_values = {}
for name, model in models.items():
predictions = model.fit(X_train, y_train).predict(X_test)
predicted_values[name] = predictions
# Display predicted values
# st.subheader("Predicted Parameter Values")
# predicted_df = pd.DataFrame(predicted_values, index=X_test.index)
# st.write(predicted_df)
# Create a grid layout for the graphs
col1, col2, col3 = st.columns(3)
with col1:
st.subheader("Beds Availability")
beds_chart = st.line_chart(beds_df)
with col2:
st.subheader("Doctors Availability")
doctors_chart = st.line_chart(doctors_df)
with col3:
st.subheader("Nurses Availability")
nurses_chart = st.line_chart(nurses_df)
col4, col5, col6 = st.columns(3)
with col4:
st.subheader("Ventilators Availability")
ventilators_chart = st.line_chart(ventilators_df)
with col5:
st.subheader("ICU Beds Availability")
icu_beds_chart = st.line_chart(icu_beds_df)
with col6:
st.subheader("Surgical Suites Availability")
surgical_suites_chart = st.line_chart(surgical_suites_df)
col7, col8, col9 = st.columns(3)
with col7:
st.subheader("Emergency Room Beds Availability")
emergency_room_beds_chart = st.line_chart(emergency_room_beds_df)
with col8:
st.subheader("Pharmacy Staff Availability")
pharmacy_staff_chart = st.line_chart(pharmacy_staff_df)
with col9:
st.subheader("Lab Staff Availability")
lab_staff_chart = st.line_chart(lab_staff_df)
col10, col11, col12 = st.columns(3)
with col10:
st.subheader("Radiology Staff Availability")
radiology_staff_chart = st.line_chart(radiology_staff_df)
# Start the simulation
for i in range(24):
# Simulate patient admissions and discharges
admissions = np.random.poisson(params['Patient_Admissions'])
discharges = np.random.poisson(params['Patient_Discharges'])
# Update bed availability
beds_df.iloc[i, 0] = params['Beds'] - admissions + discharges
beds_df.iloc[i, 1] = admissions
# Simulate doctor and nurse availability
doctors_available = params['Doctors'] - (admissions * 0.6 + params['ICU_Admissions'] * 0.4)
nurses_available = params['Nurses'] - (admissions * 1.4 + params['ICU_Admissions'] * 0.6)
doctors_df.iloc[i, 0] = doctors_available
doctors_df.iloc[i, 1] = admissions * 0.25
nurses_df.iloc[i, 0] = nurses_available
nurses_df.iloc[i, 1] = admissions * 0.8
# Simulate ventilator availability
ventilators_available = params['Ventilators'] - (admissions * 0.1 + params['ICU_Admissions'] * 0.2)
ventilators_df.iloc[i, 0] = ventilators_available
ventilators_df.iloc[i, 1] = admissions * 0.05
# Simulate ICU bed availability
icu_beds_available = params['ICU_Beds'] - (admissions * 0.1 + params['ICU_Admissions'] * 0.5)
icu_beds_df.iloc[i, 0] = icu_beds_available
icu_beds_df.iloc[i, 1] = admissions * 0.08
# Simulate surgical suite availability
surgical_suites_available = params['Surgical_Suites'] - (admissions * 0.1 + params['Surgical_Cases'] * 0.4)
surgical_suites_df.iloc[i, 0] = surgical_suites_available
surgical_suites_df.iloc[i, 1] = admissions * 0.05
# Simulate emergency room bed availability
emergency_room_beds_available = params['Emergency_Room_Beds'] - (admissions * 0.1 + params['Emergency_Room_Visits'] * 0.5)
emergency_room_beds_df.iloc[i, 0] = emergency_room_beds_available
emergency_room_beds_df.iloc[i, 1] = admissions * 0.1
# Simulate pharmacy, lab, and radiology staff availability
pharmacy_requests = params['Pharmacy_Requests'] + params['ICU_Admissions'] * 0.1 + admissions * 0.1
lab_requests = params['Lab_Requests'] + params['ICU_Admissions'] * 0.1 + admissions * 0.1
radiology_requests = params['Radiology_Requests'] + params['ICU_Admissions'] * 0.1 + admissions * 0.1
pharmacy_staff_available = params['Pharmacy_Staff'] - pharmacy_requests * 0.1
lab_staff_available = params['Lab_Staff'] - lab_requests * 0.1
radiology_staff_available = params['Radiology_Staff'] - radiology_requests * 0.1
pharmacy_staff_df.iloc[i, 0] = pharmacy_staff_available
pharmacy_staff_df.iloc[i, 1] = pharmacy_requests * 0.1
lab_staff_df.iloc[i, 0] = lab_staff_available
lab_staff_df.iloc[i, 1] = lab_requests * 0.1
radiology_staff_df.iloc[i, 0] = radiology_staff_available
radiology_staff_df.iloc[i, 1] = radiology_requests * 0.1
# Update graphs with new data
beds_chart.line_chart(beds_df)
doctors_chart.line_chart(doctors_df)
nurses_chart.line_chart(nurses_df)
ventilators_chart.line_chart(ventilators_df)
icu_beds_chart.line_chart(icu_beds_df)
surgical_suites_chart.line_chart(surgical_suites_df)
emergency_room_beds_chart.line_chart(emergency_room_beds_df)
pharmacy_staff_chart.line_chart(pharmacy_staff_df)
lab_staff_chart.line_chart(lab_staff_df)
radiology_staff_chart.line_chart(radiology_staff_df)
# Log resource usage for each patient
log.append(f"Hour {i}: Beds Available - {beds_df.iloc[i, 0]}, Beds Occupied - {beds_df.iloc[i, 1]}, Doctors Available - {doctors_df.iloc[i, 0]}, Doctors Busy - {doctors_df.iloc[i, 1]}, Nurses Available - {nurses_df.iloc[i, 0]}, Nurses Busy - {nurses_df.iloc[i, 1]}, Ventilators Available - {ventilators_df.iloc[i, 0]}, Ventilators In Use - {ventilators_df.iloc[i, 1]}, ICU Beds Available - {icu_beds_df.iloc[i, 0]}, ICU Beds Occupied - {icu_beds_df.iloc[i, 1]}, Surgical Suites Available - {surgical_suites_df.iloc[i, 0]}, Surgical Suites In Use - {surgical_suites_df.iloc[i, 1]}, Emergency Room Beds Available - {emergency_room_beds_df.iloc[i, 0]}, Emergency Room Beds Occupied - {emergency_room_beds_df.iloc[i, 1]}, Pharmacy Staff Available - {pharmacy_staff_df.iloc[i, 0]}, Pharmacy Staff Busy - {pharmacy_staff_df.iloc[i, 1]}, Lab Staff Available - {lab_staff_df.iloc[i, 0]}, Lab Staff Busy - {lab_staff_df.iloc[i, 1]}, Radiology Staff Available - {radiology_staff_df.iloc[i, 0]}, Radiology Staff Busy - {radiology_staff_df.iloc[i, 1]}")
# Wait for 1 second before updating the simulation
time.sleep(1)
# Display the resource usage log
st.subheader("Resource Usage Log")
for entry in log:
st.write(entry)