import pandas as pd import streamlit as st import csv import io import matplotlib.pyplot as plt import numpy as np from second import double_main from pre import preprocess_csv, load_data, fill_missing_data def single_main(uploaded_file): # st.title('Single CSV Analyzer') # uploaded_file = st.file_uploader("Upload CSV file", type="csv") if uploaded_file is not None: # Process the csv files with header filet = uploaded_file.read() processed_output = preprocess_csv(filet) processed_file = io.StringIO(processed_output.getvalue()) data = load_data(processed_file) data = fill_missing_data(data, 4, 0) data['Start datetime'] = pd.to_datetime(data['Start datetime'], errors='coerce') data['End datetime'] = pd.to_datetime(data['End datetime'], errors='coerce') data['Time spent'] = (data['End datetime'] - data['Start datetime']).dt.total_seconds() # st.write(data) # Display scenarios with status "failed" grouped by functional area failed_scenarios = data[data['Status'] == 'FAILED'] passed_scenarios = data[data['Status'] == 'PASSED'] # selected_status = st.selectbox("Select a status", ['Failed', 'Passed']) # Use radio buttons for selecting status selected_status = st.radio("Select a status", ['Failed', 'Passed']) # Determine which scenarios to display based on selected status if selected_status == 'Failed': unique_areas = np.append(failed_scenarios['Functional area'].unique(), "All") selected_scenarios = failed_scenarios selected_functional_area = st.selectbox("Select a functional area", unique_areas, index=len(unique_areas)-1) elif selected_status == 'Passed': unique_areas = np.append(passed_scenarios['Functional area'].unique(), "All") selected_scenarios = passed_scenarios selected_functional_area = st.selectbox("Select a functional area", unique_areas, index=len(unique_areas)-1) else: selected_scenarios = None if selected_scenarios is not None: # st.write(f"Scenarios with status '{selected_status}' grouped by functional area:") st.markdown(f"### Scenarios with status '{selected_status}' grouped by functional area:") # Handle the "All" option # Filter scenarios based on selected functional area if selected_functional_area != "All": filtered_scenarios = selected_scenarios[selected_scenarios['Functional area'] == selected_functional_area] else: filtered_scenarios = selected_scenarios # Calculate the average time spent for each functional area average_time_spent_seconds = filtered_scenarios.groupby('Functional area')['Time spent'].mean().reset_index() # Convert average time spent from seconds to minutes and seconds format average_time_spent_seconds['Time spent'] = pd.to_datetime(average_time_spent_seconds['Time spent'], unit='s').dt.strftime('%M:%S') # Group by functional area and get the start datetime for sorting start_datetime_group = filtered_scenarios.groupby('Functional area')['Start datetime'].min().reset_index() # Merge average_time_spent_seconds and start_datetime_group average_time_spent_seconds = average_time_spent_seconds.merge(start_datetime_group, on='Functional area') # Filter scenarios based on selected functional area grouped_filtered_failed_scenarios = filtered_scenarios.groupby('Functional area')[['Scenario name', 'Error message']].apply(lambda x: x.reset_index(drop=True)) st.dataframe(grouped_filtered_failed_scenarios) # Display total count of failures fail_count = len(failed_scenarios) st.write(f"Failing scenarios Count: {fail_count}") # Display total count of Passing pass_count = len(passed_scenarios) st.write(f"Passing scenarios Count: {pass_count}") # Sort the average time spent table by start datetime average_time_spent_seconds = average_time_spent_seconds.sort_values(by='Start datetime') # Display average time spent on each functional area in a table st.markdown("### Average Time Spent on Each Functional Area") st.dataframe(average_time_spent_seconds) # Create and display bar graph of errors by functional area st.write("### Bar graph showing number of failures in each functional area:") error_counts = failed_scenarios['Functional area'].value_counts() plt.figure(figsize=(10, 6)) plt.bar(error_counts.index, error_counts.values) plt.xlabel('Functional Area') plt.ylabel('Number of Errors') plt.title('Number of Errors by Functional Area') plt.xticks(rotation=45, ha='right') plt.tight_layout() # Add this line to adjust layout st.pyplot(plt) else: st.write("### No scenarios with status 'failed' found.") pass def main(): st.title('Batch Run CSV Analyser') # Initially we are in single file processing mode if "mode" not in st.session_state: st.session_state["mode"] = "single" mode_display = f'## Current mode: {st.session_state["mode"].title()} mode' st.sidebar.markdown(mode_display) # Add a button to switch between modes btn_label = "Switch to Compare mode" if st.session_state["mode"] == "single" else "Switch to Single mode" if st.sidebar.button(btn_label): if st.session_state["mode"] == "single": st.session_state["mode"] = "compare" else: st.session_state["mode"] = "single" # Only show the second file uploader in compare mode if st.session_state["mode"] == "single": uploaded_file_1 = st.sidebar.file_uploader("Upload CSV file", type="csv") if uploaded_file_1 is not None: single_main(uploaded_file_1) else: uploaded_file_1 = st.sidebar.file_uploader("Upload CSV file 1", type="csv") uploaded_file_2 = st.sidebar.file_uploader("Upload CSV file 2", type="csv") if uploaded_file_1 is not None and uploaded_file_2 is not None: double_main(uploaded_file_1, uploaded_file_2) if __name__ == "__main__": main()