# AUTOGENERATED! DO NOT EDIT! File to edit: ../../nbs/book/EventTracker/11_Andon.ipynb. # %% auto 0 __all__ = ['df', 'alerttypes', 'farms', 'selected_farms', 'skip_alerttypes', 'filter_df', 'generate_discrete_colors', 'get_discrete_colormap', 'get_summary', 'get_event_metrics', 'get_algo_performance', 'get_pie', 'get_data', 'get_farms', 'get_alerttypes', 'kpi'] # %% ../../nbs/book/EventTracker/11_Andon.ipynb 2 import streamlit as st import pandas as pd import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import plotly.express as px # %% ../../nbs/book/EventTracker/11_Andon.ipynb 6 st.set_page_config( page_title="Andon", layout='wide' ) # %% ../../nbs/book/EventTracker/11_Andon.ipynb 11 def generate_discrete_colors(n): colors = px.colors.qualitative.Plotly return [colors[i % len(colors)] for i in range(n)] generate_discrete_colors(5) # %% ../../nbs/book/EventTracker/11_Andon.ipynb 12 def get_discrete_colormap(classes): colors = generate_discrete_colors(len(classes)) color_discrete_map = dict(zip(classes, colors)) return color_discrete_map # %% ../../nbs/book/EventTracker/11_Andon.ipynb 13 def get_summary(df, col_a='Type of Alert', col_b='Ground Truth'): cal_df = df[[col_a, col_b]].groupby([col_a, col_b]).value_counts().reset_index() color_discrete_map = get_discrete_colormap(df[col_b].dropna().unique()) fig = px.bar(cal_df, y=col_a, x='count', color=col_b, color_discrete_map=color_discrete_map, orientation='h', title=f'Summary: {col_a}|{col_b}') fig.update_layout( margin=dict(l=10, r=10, t=40, b=40), yaxis=dict(automargin=True) ) return fig # %% ../../nbs/book/EventTracker/11_Andon.ipynb 16 def get_event_metrics(validated_df, event_type_cols=['Heat', 'Missed Heat'], event_type='Heat'): val_event_df = validated_df[validated_df['Type of Alert'].isin(event_type_cols)] a = val_event_df['Ground Truth'].value_counts() recall = a.get('TRUE', 0)*100/(a.get('TRUE', 0)+a.get('MISSED', np.finfo(float).eps)) precision = a.get('TRUE', 0)*100/(a.get('TRUE', 0)+a.get('FALSE', np.finfo(float).eps)) return { f'Validated_{event_type}_Recall': recall, f'Validated_{event_type}_Precision': precision, } # %% ../../nbs/book/EventTracker/11_Andon.ipynb 17 def get_algo_performance(df): confirmed_df = df[df['Ground Truth'].isin(['TRUE','FALSE', 'MISSED', 'EXCLUDE', 'OTHER'])] validated_df = df[df['Ground Truth'].isin(['TRUE','FALSE', 'MISSED'])] missed_df = df[df['Ground Truth'].isin(['MISSED'])] heat_metrics = get_event_metrics(validated_df, event_type_cols=['Heat', 'Missed Heat'], event_type='Heat') health_metrics = get_event_metrics(validated_df, event_type_cols=['Health', 'Missed Health'], event_type='Health') data_coverage_metrics = {'Total':len(df), 'Confirmed': len(confirmed_df), 'Validated': len(validated_df), 'Missed': len(missed_df), 'Confirmed_Percentage': len(confirmed_df)*100/(len(df)+np.finfo(float).eps), 'Validated_Percentage': len(validated_df)*100/(len(df)+np.finfo(float).eps), 'Val_On_Confirm_Percentage': len(validated_df)*100/(len(confirmed_df)+np.finfo(float).eps), 'Missed_On_Val_Percentage': len(missed_df)*100/(len(validated_df)+np.finfo(float).eps) } performance_metrics = {**data_coverage_metrics,**heat_metrics, **health_metrics} return performance_metrics # %% ../../nbs/book/EventTracker/11_Andon.ipynb 20 def get_pie(df, colname): df_dist = df[colname].value_counts().reset_index() fig = px.pie(df_dist, values='count', names=colname, title=f'{colname}', color = colname, color_discrete_map = get_discrete_colormap(df[colname].dropna().unique()) ) return fig # %% ../../nbs/book/EventTracker/11_Andon.ipynb 35 def get_data(url="https://docs.google.com/spreadsheets/d/1TbqmmSzXtY8DwolVo9rN7M1QdZxLG30nro2cqrvn2CA/export?format=csv&#gid=294763682"): df = pd.read_csv(url).dropna(how='all') df['Alert Date'] = df['Alert Date'].str.replace("//", "-") df = df.dropna(subset=['Alert Date']) df['Type of Alert'] = df['Type of Alert'].str.strip() return df # colors # %% ../../nbs/book/EventTracker/11_Andon.ipynb 36 def get_farms(df): return df['Dairy Farm'].dropna().unique().tolist() # %% ../../nbs/book/EventTracker/11_Andon.ipynb 37 def get_alerttypes(df): return df['Type of Alert'].dropna().unique().tolist() # %% ../../nbs/book/EventTracker/11_Andon.ipynb 40 def kpi(df, ncols = 7): metrics = get_algo_performance(df) dcols = st.columns(ncols) for (i, (k, v)) in enumerate(metrics.items()): with dcols[i%ncols]: st.metric(k, np.round(v, 2)) # %% ../../nbs/book/EventTracker/11_Andon.ipynb 41 #|eval: false df = get_data() alerttypes = get_alerttypes(df) farms = get_farms(df) selected_farms = st.sidebar.multiselect('Select farms', farms, max_selections=len(farms)) skip_alerttypes = st.sidebar.multiselect('Skip Alerttypes', alerttypes, max_selections=len(alerttypes)) filter_df = df if alerttypes: df = df[~df['Type of Alert'].isin(skip_alerttypes)] filter_df = df if selected_farms: str_farms = "|".join(selected_farms) st.write(f"Selected_farms: {str_farms}") filter_df = df[df['Dairy Farm'].isin(selected_farms)] else: st.write("Selected_farms: All") # st.write(farms) kpi(filter_df,ncols=4) st.plotly_chart(get_pie(filter_df, colname = 'Type of Alert')) st.plotly_chart(get_pie(filter_df, colname = 'Ground Truth')) st.plotly_chart(get_pie(filter_df, colname = 'Dairy Farm')) st.plotly_chart(get_summary(filter_df, col_a='Type of Alert', col_b='Ground Truth')) st.plotly_chart(get_summary(filter_df, col_b='Type of Alert', col_a='Dairy Farm')) st.plotly_chart(get_summary(filter_df, col_b='Ground Truth', col_a='Dairy Farm')) #