File size: 5,041 Bytes
bafdc7e
 
5af5671
86607a2
 
 
7e568f5
5af5671
c104620
86607a2
bfdd3c9
bafdc7e
 
 
 
 
 
 
 
 
 
 
 
 
86607a2
cf25467
86607a2
bafdc7e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5fd4442
3922c93
1635fe8
5fd4442
e63fda8
3922c93
ce70707
bafdc7e
3922c93
bafdc7e
 
 
069113a
bafdc7e
2563d2d
5af5671
 
 
 
 
 
18c89c6
5af5671
 
 
 
5d57412
 
 
 
 
5657e82
c104620
 
 
 
 
 
 
 
9602d77
e0d40a6
9602d77
 
 
5d57412
 
 
 
ce5d5ba
9602d77
e0d40a6
9602d77
 
 
1955778
 
 
8e2d7d0
bafdc7e
 
 
 
 
 
86607a2
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import os

import numpy as np
import streamlit as st
import pandas as pd
from io import StringIO
from util.evaluation import statistical_tests,calculate_correlations,calculate_divergences
from util.plot import create_score_plot,create_rank_plots,create_correlation_heatmaps,create_3d_plot,calculate_distances
import plotly.express as px


def check_password():
    def password_entered():
        if password_input == os.getenv('PASSWORD'):
            st.session_state['password_correct'] = True
        else:
            st.error("Incorrect Password, please try again.")

    password_input = st.text_input("Enter Password:", type="password")
    submit_button = st.button("Submit", on_click=password_entered)

    if submit_button and not st.session_state.get('password_correct', False):
        st.error("Please enter a valid password to access the demo.")

def app():
    st.title('Result Evaluation')

    if not st.session_state.get('password_correct', False):
        check_password()
    else:
        st.sidebar.success("Password Verified. Proceed with the demo.")

        # Allow users to upload a CSV file with processed results
        uploaded_file = st.file_uploader("Upload your processed CSV file", type="csv")
        if uploaded_file is not None:
            data = StringIO(uploaded_file.getvalue().decode('utf-8'))
            df = pd.read_csv(data)

            st.write('Uploaded Data:', df)

            if st.button('Evaluate Data'):
                with st.spinner('Evaluating data...'):
                    statistical_results = statistical_tests(df)
                    #correlation_results = calculate_correlations(df)
                    #divergence_results = calculate_divergences(df)

                    flat_statistical_results = {f"{key1}": value1 for key1, value1 in statistical_results.items()}
                    #flat_correlation_results = {f"Correlation_{key1}": value1 for key1, value1 in correlation_results.items()}
                    #flat_divergence_results = {f"Divergence_{key1}": value1 for key1, value1 in divergence_results.items()}

                    results_combined = {**flat_statistical_results} #,**flat_correlation_results}#, **flat_divergence_results}

                    results_df = pd.DataFrame(list(results_combined.items()), columns=['Metric', 'Value'])

                    st.write('Test Results:', results_df)

                    fig_3d = create_3d_plot(df)

                    st.plotly_chart(fig_3d)

                    # Calculate and display average distance
                    point_A = np.array([0, 0, 0])
                    point_B = np.array([10, 10, 10])
                    distances = calculate_distances(df, point_A, point_B)
                    average_distance = distances.mean()
                    st.write(f'Average distance to the ideal line: {average_distance}')


                    score_fig = create_score_plot(df)
                    st.plotly_chart(score_fig)

                    rank_fig = create_rank_plots(df)
                    st.plotly_chart(rank_fig)


                    hist_fig = px.histogram(df.melt(id_vars=['Role'],
                                                    value_vars=['Privilege_Avg_Score', 'Protect_Avg_Score',
                                                                'Neutral_Avg_Score']),
                                            x='value', color='variable', facet_col='variable',
                                            title='Distribution of Scores')
                    st.plotly_chart(hist_fig)

                    hist_rank_fig = px.histogram(
                        df.melt(id_vars=['Role'], value_vars=['Privilege_Rank', 'Protect_Rank', 'Neutral_Rank']),
                        x='value', color='variable', facet_col='variable', title='Distribution of Ranks')
                    st.plotly_chart(hist_rank_fig)

                    box_fig = px.box(df.melt(id_vars=['Role'], value_vars=['Privilege_Avg_Score', 'Protect_Avg_Score',
                                                                           'Neutral_Avg_Score']),
                                     x='variable', y='value', color='variable', title='Spread of Scores')
                    st.plotly_chart(box_fig)

                    box_rank_fig = px.box(
                        df.melt(id_vars=['Role'], value_vars=['Privilege_Rank', 'Protect_Rank', 'Neutral_Rank']),
                        x='variable', y='value', color='variable', title='Spread of Ranks')
                    st.plotly_chart(box_rank_fig)

                    heatmaps = create_correlation_heatmaps(df)
                    for title, fig in heatmaps.items():
                        st.plotly_chart(fig)

                    st.download_button(
                        label="Download Evaluation Results",
                        data=results_df.to_csv(index=False).encode('utf-8'),
                        file_name='evaluation_results.csv',
                        mime='text/csv',
                    )

if __name__ == "__main__":
    app()