|
import pandas as pd |
|
import streamlit as st |
|
import plotly.graph_objects as go |
|
from pre import preprocess_uploaded_file |
|
|
|
def convert_df(df): |
|
return df.to_csv(index=False).encode('utf-8') |
|
|
|
def double_main(uploaded_file1, uploaded_file2): |
|
if uploaded_file1 is None or uploaded_file2 is None: |
|
st.warning("Please upload both CSV files for comparison.") |
|
return |
|
|
|
|
|
data_1 = preprocess_uploaded_file(uploaded_file1) |
|
data_2 = preprocess_uploaded_file(uploaded_file2) |
|
|
|
|
|
if data_1['Start datetime'].min() < data_2['Start datetime'].min(): |
|
older_df, newer_df = data_1, data_2 |
|
else: |
|
older_df, newer_df = data_2, data_1 |
|
|
|
|
|
older_df['Time spent'] = pd.to_datetime(older_df['Time spent'], unit='s').dt.strftime('%M:%S') |
|
newer_df['Time spent'] = pd.to_datetime(newer_df['Time spent'], unit='s').dt.strftime('%M:%S') |
|
|
|
|
|
older_datetime = older_df['Start datetime'].min() |
|
newer_datetime = newer_df['Start datetime'].min() |
|
|
|
|
|
st.write(f"The older csv started on {older_datetime}") |
|
st.write(f"The newer csv started on {newer_datetime}") |
|
|
|
|
|
merged_df = pd.merge(older_df, newer_df, on=['Functional area', 'Scenario name'], suffixes=('_old', '_new')) |
|
|
|
|
|
fail_to_fail_scenarios = merged_df[(merged_df['Status_old'] == 'FAILED') & (merged_df['Status_new'] == 'FAILED')] |
|
pass_to_fail_scenarios = merged_df[(merged_df['Status_old'] == 'PASSED') & (merged_df['Status_new'] == 'FAILED')] |
|
fail_to_pass_scenarios = merged_df[(merged_df['Status_old'] == 'FAILED') & (merged_df['Status_new'] == 'PASSED')] |
|
|
|
|
|
fail_count = len(fail_to_fail_scenarios) |
|
pass_fail_count = len(pass_to_fail_scenarios) |
|
pass_count = len(fail_to_pass_scenarios) |
|
|
|
|
|
status_counts = { |
|
'Consistent Failures': fail_count, |
|
'New Failures': pass_fail_count, |
|
'New Passes': pass_count |
|
} |
|
status_df = pd.DataFrame.from_dict(status_counts, orient='index', columns=['Count']) |
|
|
|
st.subheader("Summary of Scenario Status Changes") |
|
|
|
|
|
fig = go.Figure(data=[ |
|
go.Bar( |
|
x=status_df.index, |
|
y=status_df['Count'], |
|
text=status_df['Count'], |
|
textposition='outside', |
|
textfont=dict(size=14), |
|
marker_color=['#1f77b4', '#ff7f0e', '#2ca02c'], |
|
width=0.6 |
|
) |
|
]) |
|
|
|
|
|
fig.update_layout( |
|
yaxis=dict( |
|
title='Count', |
|
range=[0, max(status_df['Count']) * 1.1] |
|
), |
|
xaxis_title="Status", |
|
hoverlabel=dict(bgcolor="white", font_size=16), |
|
margin=dict(l=20, r=20, t=40, b=20), |
|
uniformtext_minsize=8, |
|
uniformtext_mode='hide' |
|
) |
|
|
|
|
|
fig.update_traces(marker_line_width=1, marker_line_color="black", selector=dict(type="bar")) |
|
|
|
|
|
fig.update_traces( |
|
hovertemplate="<b>%{x}</b><br>Count: %{y}<extra></extra>" |
|
) |
|
|
|
|
|
st.plotly_chart(fig, use_container_width=True) |
|
|
|
|
|
tab1, tab2, tab3 = st.tabs(["Consistent Failures", "New Failures", "New Passes"]) |
|
|
|
with tab1: |
|
st.write(f"Failing scenarios Count: {fail_count}") |
|
columns_to_display1 = ['Functional area', 'Scenario name', 'Error message_old', 'Error message_new'] |
|
st.dataframe(fail_to_fail_scenarios[columns_to_display1]) |
|
csv = convert_df(fail_to_fail_scenarios[columns_to_display1]) |
|
st.download_button("Download Consistent Failures as CSV", data=csv, file_name='consistent_failures.csv', mime='text/csv') |
|
|
|
with tab2: |
|
st.write(f"Failing scenarios Count: {pass_fail_count}") |
|
columns_to_display2 = ['Functional area', 'Scenario name', 'Error message_new', 'Time spent_old', 'Time spent_new'] |
|
st.dataframe(pass_to_fail_scenarios[columns_to_display2]) |
|
csv = convert_df(pass_to_fail_scenarios[columns_to_display2]) |
|
st.download_button("Download New Failures as CSV", data=csv, file_name='new_failures.csv', mime='text/csv') |
|
|
|
with tab3: |
|
st.write(f"Passing scenarios Count: {pass_count}") |
|
columns_to_display3 = ['Functional area', 'Scenario name', 'Error message_old', 'Time spent_old', 'Time spent_new'] |
|
st.dataframe(fail_to_pass_scenarios[columns_to_display3]) |
|
csv = convert_df(fail_to_pass_scenarios[columns_to_display3]) |
|
st.download_button("Download New Passes as CSV", data=csv, file_name='new_passes.csv', mime='text/csv') |
|
|
|
def main(): |
|
st.title("CSV Comparison Tool") |
|
|
|
st.markdown(""" |
|
This tool compares two CSV files and highlights the differences in the scenarios. |
|
Please upload the older and newer CSV files below. |
|
""") |
|
|
|
col1, col2 = st.columns(2) |
|
|
|
with col1: |
|
uploaded_file1 = st.file_uploader("Upload the older CSV file", type='csv', key='uploader1') |
|
|
|
with col2: |
|
uploaded_file2 = st.file_uploader("Upload the newer CSV file", type='csv', key='uploader2') |
|
|
|
if uploaded_file1 is not None and uploaded_file2 is not None: |
|
with st.spinner('Processing...'): |
|
double_main(uploaded_file1, uploaded_file2) |
|
st.success('Comparison Complete!') |
|
|
|
if __name__ == "__main__": |
|
main() |