Spaces:
Sleeping
Sleeping
| 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 files for comparison.") | |
| return | |
| # Preprocess the uploaded files (CSV or XLSX) | |
| with st.spinner("Processing the first file..."): | |
| data_1 = preprocess_uploaded_file(uploaded_file1) | |
| with st.spinner("Processing the second file..."): | |
| data_2 = preprocess_uploaded_file(uploaded_file2) | |
| # Determine which file is older and newer | |
| 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 | |
| # Convert time columns to MM:SS format | |
| 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') | |
| # Get start datetime of each file | |
| older_datetime = older_df['Start datetime'].min() | |
| newer_datetime = newer_df['Start datetime'].min() | |
| # Display start datetime of each file | |
| st.write(f"The older file started on {older_datetime}") | |
| st.write(f"The newer file started on {newer_datetime}") | |
| # Merge dataframes on 'Scenario Name' | |
| merged_df = pd.merge(older_df, newer_df, on=['Functional area', 'Scenario Name'], suffixes=('_old', '_new')) | |
| # Filter scenarios | |
| 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')] | |
| # Get counts | |
| fail_count = len(fail_to_fail_scenarios) | |
| pass_fail_count = len(pass_to_fail_scenarios) | |
| pass_count = len(fail_to_pass_scenarios) | |
| # Display summary chart | |
| 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") | |
| # Create a bar chart using Plotly | |
| 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'], # Custom colors for each bar | |
| width=0.6 # Adjust bar width | |
| ) | |
| ]) | |
| # Customize the layout | |
| fig.update_layout( | |
| yaxis=dict( | |
| title='Count', | |
| range=[0, max(status_df['Count']) * 1.1] # Extend y-axis range by 10% to fit labels | |
| ), | |
| 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' | |
| ) | |
| # Ensure all bars are visible | |
| fig.update_traces(marker_line_width=1, marker_line_color="black", selector=dict(type="bar")) | |
| # Add hover text | |
| fig.update_traces( | |
| hovertemplate="<b>%{x}</b><br>Count: %{y}<extra></extra>" | |
| ) | |
| # Display the chart | |
| st.plotly_chart(fig, use_container_width=True) | |
| # Use tabs to display data | |
| 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("File Comparison Tool") | |
| st.markdown(""" | |
| This tool compares two files and highlights the differences in the scenarios. | |
| Please upload the older and newer files below. | |
| """) | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| uploaded_file1 = st.file_uploader("Upload the older file", type=['csv', 'xlsx'], key='uploader1') | |
| with col2: | |
| uploaded_file2 = st.file_uploader("Upload the newer file", type=['csv', 'xlsx'], 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() |