|
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): |
|
|
|
|
|
|
|
|
|
if uploaded_file is not None: |
|
|
|
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() |
|
|
|
|
|
|
|
|
|
failed_scenarios = data[data['Status'] == 'FAILED'] |
|
passed_scenarios = data[data['Status'] == 'PASSED'] |
|
|
|
|
|
selected_status = st.radio("Select a status", ['Failed', 'Passed']) |
|
|
|
|
|
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.markdown(f"### Scenarios with status '{selected_status}' grouped by functional area:") |
|
|
|
|
|
|
|
if selected_functional_area != "All": |
|
filtered_scenarios = selected_scenarios[selected_scenarios['Functional area'] == selected_functional_area] |
|
else: |
|
filtered_scenarios = selected_scenarios |
|
|
|
|
|
average_time_spent_seconds = filtered_scenarios.groupby('Functional area')['Time spent'].mean().reset_index() |
|
|
|
|
|
average_time_spent_seconds['Time spent'] = pd.to_datetime(average_time_spent_seconds['Time spent'], unit='s').dt.strftime('%M:%S') |
|
|
|
|
|
start_datetime_group = filtered_scenarios.groupby('Functional area')['Start datetime'].min().reset_index() |
|
|
|
|
|
average_time_spent_seconds = average_time_spent_seconds.merge(start_datetime_group, on='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) |
|
|
|
|
|
|
|
fail_count = len(failed_scenarios) |
|
st.write(f"Failing scenarios Count: {fail_count}") |
|
|
|
pass_count = len(passed_scenarios) |
|
st.write(f"Passing scenarios Count: {pass_count}") |
|
|
|
|
|
average_time_spent_seconds = average_time_spent_seconds.sort_values(by='Start datetime') |
|
|
|
|
|
st.markdown("### Average Time Spent on Each Functional Area") |
|
st.dataframe(average_time_spent_seconds) |
|
|
|
|
|
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() |
|
st.pyplot(plt) |
|
|
|
else: |
|
st.write("### No scenarios with status 'failed' found.") |
|
pass |
|
|
|
def main(): |
|
st.title('Batch Run CSV Analyser') |
|
|
|
|
|
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) |
|
|
|
|
|
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" |
|
|
|
|
|
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() |
|
|