# import streamlit as st # import pandas as pd # from app_config import AppConfig # Import the configurations class # from data_processor import DataProcessor # Import the data analysis class # from visualization import Visualization # Import the data viz class # from ai_analysis import AIAnalysis # Import the ai analysis class # from sidebar import Sidebar # Import the Sidebar class # from report import ReportGenerator # def main(): # # Initialize the app configuration # app_config = AppConfig() # # Initialize the session state # if 'ai_recommendations' not in st.session_state: # st.session_state.ai_recommendations = None # # Initialize the sidebar # sidebar = Sidebar() # sidebar.display() # # Initialize the data processor # data_processor = DataProcessor() # # Initialize the visualization handler # visualization = Visualization() # # Initialize the AI analysis handler # ai_analysis = AIAnalysis(data_processor.client) # st.title("Literacy Implementation Record Data Analysis") # # Add the descriptive text # st.markdown(""" # This tool summarizes implementation record data for student attendance, engagement, and intervention dosage to address hypothesis #1: Have Students Received Adequate Instruction? # """) # # Date selection option # date_option = st.radio( # "Select data range:", # ("All Data", "Date Range") # ) # # Initialize start and end date variables # start_date = None # end_date = None # if date_option == "Date Range": # # Prompt user to enter start and end dates # start_date = st.date_input("Start Date") # end_date = st.date_input("End Date") # # Ensure start date is before end date # if start_date > end_date: # st.error("Start date must be before end date.") # return # # File uploader # uploaded_file = st.file_uploader("Upload your Excel file", type=["xlsx"]) # if uploaded_file is not None: # try: # # Read the Excel file into a DataFrame # df = data_processor.read_excel(uploaded_file) # # Format the session data # df = data_processor.format_session_data(df) # # Replace student names with initials # df = data_processor.replace_student_names_with_initials(df) # # Filter data if date range is selected # if date_option == "Date Range": # # Convert start_date and end_date to datetime # start_date = pd.to_datetime(start_date).date() # end_date = pd.to_datetime(end_date).date() # # Identify the date column # date_column = next((col for col in df.columns if col in ["Date of Session", "Date"]), None) # if date_column: # # Filter the DataFrame based on the selected date range # df = df[(df[date_column] >= start_date) & (df[date_column] <= end_date)] # else: # st.error("Date column not found in the data.") # return # st.subheader("Uploaded Data") # st.write(df) # # Ensure the intervention column is determined # intervention_column = data_processor.get_intervention_column(df) # if intervention_column not in df.columns: # st.error(f"Expected column '{intervention_column}' not found.") # return # # Compute Intervention Session Statistics # intervention_stats = data_processor.compute_intervention_statistics(df) # st.subheader("Intervention Dosage") # st.write(intervention_stats) # # Plot and download intervention statistics: Two-column layout for the visualization and intervention frequency # col1, col2 = st.columns([3, 1]) # Set the column width ratio # with col1: # intervention_fig = visualization.plot_intervention_statistics(intervention_stats) # with col2: # intervention_frequency = intervention_stats['Intervention Dosage (%)'].values[0] # # Display the "Intervention Dosage (%)" text # st.markdown("

Intervention Dosage

", unsafe_allow_html=True) # # Display the frequency value below it # st.markdown(f"

{intervention_frequency}%

", unsafe_allow_html=True) # visualization.download_chart(intervention_fig, "intervention_statistics_chart.png") # # Compute Student Metrics # student_metrics_df = data_processor.compute_student_metrics(df) # st.subheader("Student Attendance and Engagement") # st.write(student_metrics_df) # # Compute Student Metric Averages # attendance_avg_stats, engagement_avg_stats = data_processor.compute_average_metrics(student_metrics_df) # # Plot and download student metrics # student_metrics_fig = visualization.plot_student_metrics(student_metrics_df, attendance_avg_stats, engagement_avg_stats) # visualization.download_chart(student_metrics_fig, "student_metrics_chart.png") # # Evaluate each student and build decision tree diagrams # student_metrics_df['Evaluation'] = student_metrics_df.apply( # lambda row: data_processor.evaluate_student(row), axis=1 # ) # st.subheader("Student Evaluations") # st.write(student_metrics_df[['Student', 'Evaluation']]) # # Build and display decision tree diagrams for each student # for index, row in student_metrics_df.iterrows(): # tree_diagram = visualization.build_tree_diagram(row) # # Get the student's name from the DataFrame # student_name = row['Student'] # # Use st.expander to wrap the graphviz chart with the student's name # with st.expander(f"{student_name} Decision Tree", expanded=False): # st.graphviz_chart(tree_diagram.source) # # Generate Notes and Recommendations using LLM # if st.session_state.ai_recommendations is None: # with st.spinner("Generating MTSS.ai Analysis..."): # llm_input = ai_analysis.prepare_llm_input(student_metrics_df) # # recommendations = ai_analysis.prompt_response_from_hf_llm(llm_input) # recommendations = ai_analysis.prompt_response_from_mistral_llm(llm_input) # st.session_state.ai_recommendations = recommendations # # Display the recommendations # st.subheader("MTSS.ai Analysis") # # st.markdown(recommendations) # st.markdown(st.session_state.ai_recommendations) # # Download AI output # # ai_analysis.download_llm_output(recommendations, "MTSSai_Report.txt") # ai_analysis.download_llm_output(st.session_state.ai_recommendations, "MTSSai_Report.txt") # # Generate the PDF Report using the stored recommendations # report_gen = ReportGenerator() # combined_pdf = report_gen.create_combined_pdf( # intervention_fig, # student_metrics_fig, # st.session_state.ai_recommendations # ) # # Add the download button for the PDF # st.download_button( # label="Download MTSS.ai Report (PDF)", # data=combined_pdf, # file_name="MTSSai_LIR_Report.pdf", # mime="application/pdf", # icon="📄", # use_container_width=True # ) # except Exception as e: # st.error(f"Error processing the file: {str(e)}") # if __name__ == '__main__': # main() import streamlit as st import pandas as pd from app_config import AppConfig # Import the configurations class from data_processor import DataProcessor # Import the data analysis class from visualization import Visualization # Import the data viz class from ai_analysis import AIAnalysis # Import the ai analysis class from sidebar import Sidebar # Import the Sidebar class from report import ReportGenerator def main(): # Initialize the app configuration app_config = AppConfig() # Initialize the session state if 'ai_recommendations' not in st.session_state: st.session_state.ai_recommendations = None # Initialize the sidebar sidebar = Sidebar() sidebar.display() # Initialize the data processor data_processor = DataProcessor() # Initialize the visualization handler visualization = Visualization() # Initialize the AI analysis handler ai_analysis = AIAnalysis(data_processor.client) st.title("Literacy Implementation Record Data Analysis") # Add the descriptive text st.markdown(""" This tool summarizes implementation record data for student attendance, engagement, and intervention dosage to address hypothesis #1: Have Students Received Adequate Instruction? """) # Date selection option date_option = st.radio( "Select data range:", ("All Data", "Date Range") ) # Initialize start and end date variables start_date = None end_date = None if date_option == "Date Range": # Prompt user to enter start and end dates start_date = st.date_input("Start Date") end_date = st.date_input("End Date") # Ensure start date is before end date if start_date > end_date: st.error("Start date must be before end date.") return # File uploader uploaded_file = st.file_uploader("Upload your Excel file", type=["xlsx"]) if uploaded_file is not None: try: # Read the Excel file into a DataFrame df = data_processor.read_excel(uploaded_file) # Format the session data df = data_processor.format_session_data(df) # Replace student names with initials df = data_processor.replace_student_names_with_initials(df) # Filter data if date range is selected if date_option == "Date Range": # Convert start_date and end_date to datetime start_date = pd.to_datetime(start_date).date() end_date = pd.to_datetime(end_date).date() # Identify the date column date_column = next((col for col in df.columns if col in ["Date of Session", "Date"]), None) if date_column: # Filter the DataFrame based on the selected date range df = df[(df[date_column] >= start_date) & (df[date_column] <= end_date)] else: st.error("Date column not found in the data.") return st.subheader("Uploaded Data") st.write(df) # Ensure the intervention column is determined intervention_column = data_processor.get_intervention_column(df) if intervention_column not in df.columns: st.error(f"Expected column '{intervention_column}' not found.") return # Compute Student Metrics student_metrics_df = data_processor.compute_student_metrics(df) st.subheader("Student Attendance and Engagement") st.write(student_metrics_df) # Compute Student Metric Averages attendance_avg_stats, engagement_avg_stats = data_processor.compute_average_metrics(student_metrics_df) # Plot and download student metrics student_metrics_fig = visualization.plot_student_metrics(student_metrics_df, attendance_avg_stats, engagement_avg_stats) visualization.download_chart(student_metrics_fig, "student_metrics_chart.png") # Compute Intervention Session Statistics intervention_stats = data_processor.compute_intervention_statistics(df) st.subheader("Intervention Dosage") st.write(intervention_stats) # Plot and download intervention statistics: Two-column layout for the visualization and intervention frequency col1, col2 = st.columns([3, 1]) # Set the column width ratio with col1: intervention_fig = visualization.plot_intervention_statistics(intervention_stats) with col2: intervention_frequency = intervention_stats['Intervention Dosage (%)'].values[0] # Display the "Intervention Dosage (%)" text st.markdown("

Intervention Dosage

", unsafe_allow_html=True) # Display the frequency value below it st.markdown(f"

{intervention_frequency}%

", unsafe_allow_html=True) visualization.download_chart(intervention_fig, "intervention_statistics_chart.png") # Evaluate each student and build decision tree diagrams student_metrics_df['Evaluation'] = student_metrics_df.apply( lambda row: data_processor.evaluate_student(row), axis=1 ) st.subheader("Student Evaluations") st.write(student_metrics_df[['Student', 'Evaluation']]) # Build and display decision tree diagrams for each student for index, row in student_metrics_df.iterrows(): tree_diagram = visualization.build_tree_diagram(row) # Get the student's name from the DataFrame student_name = row['Student'] # Use st.expander to wrap the graphviz chart with the student's name with st.expander(f"{student_name} Decision Tree", expanded=False): st.graphviz_chart(tree_diagram.source) # Generate Notes and Recommendations using LLM if st.session_state.ai_recommendations is None: with st.spinner("Generating MTSS.ai Analysis..."): llm_input = ai_analysis.prepare_llm_input(student_metrics_df) # recommendations = ai_analysis.prompt_response_from_hf_llm(llm_input) recommendations = ai_analysis.prompt_response_from_mistral_llm(llm_input) st.session_state.ai_recommendations = recommendations # Display the recommendations st.subheader("MTSS.ai Analysis") # st.markdown(recommendations) st.markdown(st.session_state.ai_recommendations) # Download AI output # ai_analysis.download_llm_output(recommendations, "MTSSai_Report.txt") ai_analysis.download_llm_output(st.session_state.ai_recommendations, "MTSSai_Report.txt") # Generate the PDF Report using the stored recommendations report_gen = ReportGenerator() combined_pdf = report_gen.create_combined_pdf( intervention_fig, student_metrics_fig, st.session_state.ai_recommendations ) # Add the download button for the PDF st.download_button( label="Download MTSS.ai Report (PDF)", data=combined_pdf, file_name="MTSSai_LIR_Report.pdf", mime="application/pdf", icon="📄", use_container_width=True ) except Exception as e: st.error(f"Error processing the file: {str(e)}") if __name__ == '__main__': main()