rahuketu86 commited on
Commit
7b444b5
β€’
1 Parent(s): 3e0242b

Upload 6 files

Browse files

Added application

Files changed (6) hide show
  1. andon.py +118 -0
  2. app.py +27 -0
  3. floating.py +135 -0
  4. master.py +34 -0
  5. model.py +140 -0
  6. requirements.txt +4 -0
andon.py ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # AUTOGENERATED! DO NOT EDIT! File to edit: ../../nbs/book/LabellingTracker/11_Andon.ipynb.
2
+
3
+ # %% auto 0
4
+ __all__ = ['df', 'get_data', 'get_df_extra', 'kpi', 'get_floating_count', 'get_model_count']
5
+
6
+ # %% ../../nbs/book/LabellingTracker/11_Andon.ipynb 2
7
+ import streamlit as st
8
+ import pandas as pd
9
+ import numpy as np
10
+ import pandas as pd
11
+ import matplotlib.pyplot as plt
12
+ import seaborn as sns
13
+ import plotly.express as px
14
+
15
+ # %% ../../nbs/book/LabellingTracker/11_Andon.ipynb 6
16
+ st.set_page_config(
17
+ page_title="Andon",
18
+ layout='wide'
19
+ )
20
+
21
+ # %% ../../nbs/book/LabellingTracker/11_Andon.ipynb 9
22
+ def get_data(fname="Labelling_Tracking_v28.06.24.xlsx",
23
+ sheet_name='MASTER',
24
+ date_cols=['Recording_Date', 'Assignment_Date', 'Video_Reception_Date','Target_Date', 'Labelling_Received_Date', 'Verification_Date', 'Completion/Rejection_Date']):
25
+ df = pd.read_excel(fname, sheet_name=sheet_name,
26
+ parse_dates=date_cols)
27
+
28
+ df['Assigned']=df['Assigned'].str.split(".").str.join(" ").str.upper()
29
+ return df
30
+ # colors
31
+
32
+ # %% ../../nbs/book/LabellingTracker/11_Andon.ipynb 10
33
+ def get_df_extra(fname):
34
+ df = get_data(fname=fname,
35
+ sheet_name='MASTER',
36
+ date_cols=['Recording_Date', 'Assignment_Date', 'Video_Reception_Date','Target_Date', 'Labelling_Received_Date', 'Verification_Date', 'Completion/Rejection_Date'])
37
+
38
+
39
+ col_order= pd.read_excel(fname, sheet_name='STATUS')
40
+ col_order = col_order['STATUS STATES'].tolist()
41
+
42
+ colors = dict(zip(col_order, sns.color_palette("Set2", len(col_order))))
43
+ # col_order
44
+
45
+ colors2 = dict(zip(col_order, ['blue', 'red', 'green', 'yellow', 'cyan', 'violet', 'pink', 'magenta']))
46
+ return df, col_order, colors, colors2
47
+
48
+ # %% ../../nbs/book/LabellingTracker/11_Andon.ipynb 13
49
+ def kpi(df):
50
+ cattle_days = df.loc[df['TAG']=='FLOATING', ['CattleFolder/Frame', 'SubFolder']].groupby('CattleFolder/Frame').count().sum().values[0]
51
+ model_days = df.loc[df['TAG']=='MODEL', ['CattleFolder/Frame', 'SubFolder']].groupby('CattleFolder/Frame').count().sum().values[0]
52
+ cattle_floating = df.loc[df['TAG']=='FLOATING', ['CattleFolder/Frame']].nunique().values[0]
53
+ accounts_floating = df.loc[df['TAG']=='FLOATING', 'AccountNumber'].nunique()
54
+ frames_model = df.loc[df['TAG']=='MODEL', ['AccountNumber', 'CattleFolder/Frame']].groupby('AccountNumber').nunique().sum().values[0]
55
+ accounts_model = df.loc[df['TAG']=='MODEL', 'AccountNumber'].nunique()
56
+ count_user_floating = len(set(df.loc[df['TAG']=='FLOATING', 'Assigned'].dropna().str.split('/').sum()))
57
+ count_model_floating = len(set(df.loc[df['TAG']=='MODEL', 'Assigned'].dropna().str.split('/').sum()))
58
+ col1, col2, col3, col4 = st.columns(4)
59
+ col1.metric('Floating Days/Cattle', f'{cattle_days}/{cattle_floating}[{accounts_floating}]')
60
+ col2.metric('Labellers Floating', count_user_floating)
61
+ col3.metric('Model Days/Frame',f'{model_days}/{frames_model}[{accounts_model}]')
62
+ col4.metric('Labellers Model', count_model_floating)
63
+
64
+ # %% ../../nbs/book/LabellingTracker/11_Andon.ipynb 14
65
+ def get_floating_count(df, col_order, colors):
66
+ fig, ax = plt.subplots()
67
+ # df.loc[df['TAG']=='FLOATING', ['AccountNumber', 'AccountName','CattleFolder/Frame']].groupby(['AccountNumber', 'AccountName']).nunique().rename(columns={'CattleFolder/Frame':'Count'}).sort_values(by='Count').plot(kind='barh', ax=ax)
68
+ data = df.loc[df['TAG']=='FLOATING', ['AccountNumber', 'AccountName', 'Status', 'CattleFolder/Frame']].drop_duplicates()
69
+ o = data.groupby(['AccountNumber','AccountName', 'Status'])['CattleFolder/Frame'].count().unstack('Status').fillna(0).sort_values(by='AccountName')
70
+ sel_cols = [x for x in col_order if x in o.columns]
71
+ sel_colors = {k:colors[k] for k in sel_cols}
72
+ o[sel_cols].plot(kind='barh', stacked=True, ax=ax, color=sel_colors)
73
+ # ax.bar_label(ax.containers[-1])
74
+ return fig
75
+
76
+ # %% ../../nbs/book/LabellingTracker/11_Andon.ipynb 16
77
+ def get_model_count(df,col_order, colors):
78
+ fig, ax = plt.subplots()
79
+ # df.loc[df['TAG']=='MODEL', ['AccountNumber', 'AccountName','CattleFolder/Frame']].groupby(['AccountNumber', 'AccountName']).count().rename(columns={'CattleFolder/Frame':'Count'}).sort_values(by='Count').plot(kind='barh', ax=ax)
80
+ data = df.loc[df['TAG']=='MODEL', ['AccountNumber', 'AccountName', 'Status', 'CattleFolder/Frame', 'SubFolder']].drop_duplicates()
81
+ o = data.groupby(['AccountNumber','AccountName', 'Status'])['CattleFolder/Frame'].count().unstack('Status').fillna(0).sort_values(by='AccountName')
82
+ sel_cols = [x for x in col_order if x in o.columns]
83
+ sel_colors = {k:colors[k] for k in sel_cols}
84
+ o[sel_cols].plot(kind='barh', stacked=True, ax=ax, color=colors)
85
+ # ax.bar_label(ax.containers[0])
86
+ return fig
87
+
88
+ # %% ../../nbs/book/LabellingTracker/11_Andon.ipynb 18
89
+ df = None
90
+ st.write("# Labelling Andon Board")
91
+ if 'processed_df' not in st.session_state:
92
+ uploaded_file = st.file_uploader("Choose a file", type = 'xlsx')
93
+ if uploaded_file is not None:
94
+ df, col_order, colors, colors2=get_df_extra(uploaded_file)
95
+ st.session_state['processed_df'] = df
96
+ st.session_state['col_order'] = col_order
97
+ st.session_state['colors'] = colors
98
+ st.session_state['colors2'] = colors2
99
+ else:
100
+ df = st.session_state['processed_df']
101
+ col_order = st.session_state['col_order']
102
+ colors = st.session_state['colors']
103
+ colors2= st.session_state['colors2']
104
+
105
+ if df is not None:
106
+ kpi(df)
107
+
108
+ st.write("## Total Available")
109
+ col1, col2 = st.columns(2)
110
+ with col1:
111
+ st.markdown("Number of Cattles per Floating Account")
112
+ fig = get_floating_count(df, col_order, colors)
113
+ st.pyplot(fig)
114
+
115
+ with col2:
116
+ st.markdown("Frame-Dates per Model Account")
117
+ fig2 = get_model_count(df, col_order, colors)
118
+ st.pyplot(fig2)
app.py ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # AUTOGENERATED! DO NOT EDIT! File to edit: ../../nbs/book/LabellingTracker/10_App.ipynb.
2
+
3
+ # %% auto 0
4
+ __all__ = ['andon_page', 'floating_page', 'model_page', 'master_page']
5
+
6
+ # %% ../../nbs/book/LabellingTracker/10_App.ipynb 3
7
+ import streamlit as st
8
+
9
+ # %% ../../nbs/book/LabellingTracker/10_App.ipynb 5
10
+ # def menu():
11
+ # st.sidebar.page_link(st.Page("andon.py", default=True), label="Andon")
12
+ # st.sidebar.page_link(st.Page("floating.py", url_path=".."), label="Floating")
13
+ # st.sidebar.page_link(st.Page("model.py", url_path=".."), label="Model")
14
+ # st.sidebar.page_link(st.Page("master.py", url_path=".."), label="Master")
15
+ # # st.sidebar.page_link("pages/2_mapping_demo.py", label="Mapping Demo")
16
+ # # st.sidebar.page_link("pages/3_dataframe_demo.py", label="Dataframe Demo")
17
+
18
+
19
+ andon_page = st.Page("andon.py", default=True, title="Andon")
20
+ floating_page = st.Page("floating.py", title="Floating")
21
+ model_page = st.Page("model.py", title="Model")
22
+ master_page = st.Page("master.py", title="Master")
23
+
24
+ from fastcore.basics import in_notebook
25
+ if not in_notebook():
26
+ pg = st.navigation([andon_page, floating_page, model_page, master_page])
27
+ pg.run()
floating.py ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # AUTOGENERATED! DO NOT EDIT! File to edit: ../../nbs/book/LabellingTracker/13_Floating.ipynb.
2
+
3
+ # %% auto 0
4
+ __all__ = ['df', 'get_floating_grp_data', 'get_floating_summary', 'get_floating_hist', 'get_step_df', 'get_gantt']
5
+
6
+ # %% ../../nbs/book/LabellingTracker/13_Floating.ipynb 2
7
+ import streamlit as st
8
+ import pandas as pd
9
+
10
+ import numpy as np
11
+ import pandas as pd
12
+ import matplotlib.pyplot as plt
13
+ import plotly.express as px
14
+ import seaborn as sns
15
+
16
+ # %% ../../nbs/book/LabellingTracker/13_Floating.ipynb 6
17
+ st.set_page_config(
18
+ page_title="Floating",
19
+ page_icon="πŸ‘‹",
20
+ layout='wide'
21
+ )
22
+
23
+ # %% ../../nbs/book/LabellingTracker/13_Floating.ipynb 8
24
+ # st.sidebar.success("Select a demo above.")
25
+
26
+ # %% ../../nbs/book/LabellingTracker/13_Floating.ipynb 11
27
+ def get_floating_grp_data(df):
28
+ grp_df = df.loc[df['TAG']=='FLOATING', ['Trial_Num', 'AccountNumber', 'AccountName', 'CattleFolder/Frame', 'TAG', 'Assigned',
29
+ 'Recording_Date', 'Video_Reception_Date', 'Assignment_Date',
30
+ 'Target_Date', 'Labelling_Received_Date','Verification_Date', 'Completion/Rejection_Date']].groupby(['Trial_Num',
31
+ 'AccountNumber',
32
+ 'AccountName',
33
+ 'TAG',
34
+ 'CattleFolder/Frame',
35
+ ],
36
+ as_index=False).agg({'Recording_Date':['min','max'],
37
+ 'Video_Reception_Date':'max',
38
+ 'Assignment_Date':'min',
39
+ 'Target_Date':'max',
40
+ 'Labelling_Received_Date':'max',
41
+ 'Verification_Date':'max',
42
+ 'Completion/Rejection_Date':'max',
43
+ 'Assigned': 'sum'})
44
+
45
+ flat_cols = ["_".join(i).rstrip('_') for i in grp_df.columns];# flat_cols
46
+ grp_df.columns = flat_cols
47
+ grp_df['Recording'] = (grp_df['Recording_Date_max'] - grp_df['Recording_Date_min']).dt.days+1
48
+ grp_df['Waiting4Video'] = (grp_df['Video_Reception_Date_max'] - grp_df['Recording_Date_max']).dt.days
49
+ grp_df['Waiting4Assignment'] = (grp_df['Assignment_Date_min'] - grp_df['Video_Reception_Date_max']).dt.days
50
+ grp_df['Labelling'] = (grp_df['Target_Date_max'] - grp_df['Assignment_Date_min']).dt.days
51
+ grp_df['Waiting4Labels'] = (grp_df['Labelling_Received_Date_max'] - grp_df['Target_Date_max']).dt.days
52
+ grp_df['Waiting4Verification'] = (grp_df['Verification_Date_max'] - grp_df['Labelling_Received_Date_max']).dt.days
53
+ grp_df['Waiting4Completion'] = (grp_df['Completion/Rejection_Date_max'] - grp_df['Verification_Date_max']).dt.days
54
+ grp_df['Labelling_Duration'] = grp_df['Labelling'] + grp_df['Waiting4Labels'].fillna(0)
55
+ return grp_df
56
+
57
+ # %% ../../nbs/book/LabellingTracker/13_Floating.ipynb 13
58
+ def get_floating_summary(df):
59
+ fig, ax = plt.subplots()
60
+ grp_df = get_floating_grp_data(df)
61
+ states = ['Recording','Waiting4Video', 'Waiting4Assignment', 'Labelling', 'Waiting4Labels', 'Waiting4Verification','Waiting4Completion']
62
+ colors = dict(zip(states, ['blue', 'red', 'green', 'yellow', 'cyan', 'violet', 'pink']))
63
+ grp_df[['AccountNumber','Assigned_sum', 'AccountName', 'CattleFolder/Frame','Recording','Waiting4Video', 'Waiting4Assignment', 'Labelling', 'Waiting4Labels', 'Waiting4Verification','Waiting4Completion']].set_index(['AccountNumber', 'AccountName', 'CattleFolder/Frame']).plot(kind='barh', stacked=True, ax=ax, color=colors);
64
+ return fig
65
+
66
+ # %% ../../nbs/book/LabellingTracker/13_Floating.ipynb 14
67
+ def get_floating_hist(df, col):
68
+ grp_df = get_floating_grp_data(df)
69
+ fig, ax = plt.subplots()
70
+ grp_df[col].plot(kind='hist', ax=ax, legend=True)
71
+ avg = grp_df[col].mean()
72
+ count = grp_df[col].count()
73
+ ax.axvline(avg, color='red', label=f'mean={avg}')
74
+ ax.set_title(f'{col}[ mean={avg:.2f}, count={count:.2f} ]')
75
+ return fig
76
+ # get_floating_hist(df, 'Recording_Duration')
77
+
78
+ # %% ../../nbs/book/LabellingTracker/13_Floating.ipynb 15
79
+ def get_step_df(grp_df, start_step, end_step, step_name):
80
+ df_e = grp_df[['AccountNumber', 'AccountName','Assigned_sum', 'CattleFolder/Frame']].copy()
81
+ df_e['Start'] = grp_df[start_step]
82
+ df_e['End'] = grp_df[end_step]
83
+ df_e['Step'] = step_name
84
+ return df_e
85
+
86
+
87
+ # %% ../../nbs/book/LabellingTracker/13_Floating.ipynb 17
88
+ def get_gantt(df):
89
+ steps = [
90
+ {'start_step': 'Recording_Date_min', 'end_step' :'Recording_Date_max', 'step_name' : 'Recording'},
91
+ {'start_step': 'Recording_Date_max', 'end_step' :'Video_Reception_Date_max', 'step_name' : 'Waiting4Video'},
92
+ {'start_step': 'Video_Reception_Date_max', 'end_step' :'Assignment_Date_min', 'step_name' : 'Waiting4Assignment'},
93
+ {'start_step': 'Assignment_Date_min', 'end_step' :'Target_Date_max', 'step_name' : 'Labelling'},
94
+ {'start_step': 'Target_Date_max', 'end_step' :'Labelling_Received_Date_max', 'step_name' : 'Waiting4Labels'},
95
+ {'start_step': 'Labelling_Received_Date_max', 'end_step' :'Verification_Date_max', 'step_name' : 'Waiting4Verification'},
96
+ {'start_step': 'Verification_Date_max', 'end_step' :'Completion/Rejection_Date_max', 'step_name' : 'Waiting4Completion'},
97
+ ]
98
+ grp_df = get_floating_grp_data(df)
99
+ df_concat = pd.concat(get_step_df(grp_df, start_step=step['start_step'], end_step=step['end_step'], step_name=step['step_name']) for step in steps)
100
+ df_concat['label'] = df['AccountName'] +"_"+ df['CattleFolder/Frame']
101
+ df_concat.loc[df_concat['Step']=='Recording', 'Start'] = df_concat.loc[df_concat['Step']=='Recording', 'Start'] - pd.Timedelta(days=1)
102
+ # # df_concat
103
+
104
+ states = [s['step_name'] for s in steps]; # states
105
+ colors = dict(zip(states, ['blue', 'red', 'green', 'yellow', 'cyan', 'violet', 'pink']))
106
+
107
+ fig = px.timeline(data_frame=df_concat, x_start='Start', x_end='End', y='CattleFolder/Frame', color='Step', color_discrete_map=colors, hover_data=['Assigned_sum', 'AccountName', 'AccountNumber'])
108
+ # fig.update_layout(legend=dict(
109
+ # orientation="h",
110
+
111
+ # ))
112
+ return fig
113
+
114
+ # %% ../../nbs/book/LabellingTracker/13_Floating.ipynb 21
115
+ df = None
116
+ st.write("# Floating Details")
117
+ if 'processed_df' not in st.session_state:
118
+ st.write("Please go to andon page and upload data")
119
+ else:
120
+ df = st.session_state['processed_df']
121
+ col_order = st.session_state['col_order']
122
+ colors = st.session_state['colors']
123
+ colors2= st.session_state['colors2']
124
+ st.markdown("## Summary Floating Durations")
125
+ with st.container(border=True):
126
+ st.pyplot(get_floating_summary(df))
127
+ ncols = 3
128
+ dcols = st.columns(ncols)
129
+ for i, col in enumerate(['Recording','Waiting4Video', 'Waiting4Assignment', 'Labelling_Duration', 'Waiting4Verification', 'Waiting4Completion']):
130
+ with dcols[i%ncols]:
131
+ st.pyplot(get_floating_hist(df, col), use_container_width=True)
132
+
133
+ st.markdown("## Timeline")
134
+ with st.container(border=True):
135
+ st.plotly_chart(get_gantt(df), theme="streamlit", use_container_width=True)
master.py ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # AUTOGENERATED! DO NOT EDIT! File to edit: ../../nbs/book/LabellingTracker/12_MasterTable.ipynb.
2
+
3
+ # %% auto 0
4
+ __all__ = ['df']
5
+
6
+ # %% ../../nbs/book/LabellingTracker/12_MasterTable.ipynb 2
7
+ import streamlit as st
8
+ import pandas as pd
9
+ import numpy as np
10
+ import pandas as pd
11
+ import matplotlib.pyplot as plt
12
+
13
+
14
+ # %% ../../nbs/book/LabellingTracker/12_MasterTable.ipynb 6
15
+ st.set_page_config(
16
+ page_title="Master",
17
+ page_icon="πŸ‘‹",
18
+ layout='wide'
19
+ )
20
+
21
+ # %% ../../nbs/book/LabellingTracker/12_MasterTable.ipynb 8
22
+ # st.sidebar.success("Select a demo above.")
23
+
24
+ # %% ../../nbs/book/LabellingTracker/12_MasterTable.ipynb 10
25
+ df = None
26
+ st.write("# Master Table")
27
+ if 'processed_df' not in st.session_state:
28
+ st.write("Please go to andon page and upload data")
29
+ else:
30
+ df = st.session_state['processed_df']
31
+ col_order = st.session_state['col_order']
32
+ colors = st.session_state['colors']
33
+ colors2= st.session_state['colors2']
34
+ st.table(data=df)
model.py ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # AUTOGENERATED! DO NOT EDIT! File to edit: ../../nbs/book/LabellingTracker/14_Model.ipynb.
2
+
3
+ # %% auto 0
4
+ __all__ = ['df', 'get_model_grp_data', 'get_model_summary', 'get_model_hist', 'get_step_df', 'get_gantt']
5
+
6
+ # %% ../../nbs/book/LabellingTracker/14_Model.ipynb 2
7
+ import streamlit as st
8
+ import pandas as pd
9
+
10
+ import numpy as np
11
+ import pandas as pd
12
+ import matplotlib.pyplot as plt
13
+ import plotly.express as px
14
+ import seaborn as sns
15
+
16
+ # %% ../../nbs/book/LabellingTracker/14_Model.ipynb 6
17
+ st.set_page_config(
18
+ page_title="Model",
19
+ page_icon="πŸ‘‹",
20
+ layout='wide'
21
+ )
22
+
23
+ # %% ../../nbs/book/LabellingTracker/14_Model.ipynb 8
24
+ # st.sidebar.success("Select a demo above.")
25
+
26
+ # %% ../../nbs/book/LabellingTracker/14_Model.ipynb 11
27
+ def get_model_grp_data(df):
28
+ grp_df = df.loc[df['TAG']=='MODEL', ['Trial_Num', 'AccountNumber', 'AccountName', 'CattleFolder/Frame','SubFolder', 'TAG', 'Assigned',
29
+ 'Recording_Date', 'Video_Reception_Date', 'Assignment_Date',
30
+ 'Target_Date', 'Labelling_Received_Date','Verification_Date', 'Completion/Rejection_Date']].groupby(['Trial_Num',
31
+ 'AccountNumber',
32
+ 'AccountName',
33
+ 'TAG',
34
+ 'CattleFolder/Frame',
35
+ 'SubFolder'
36
+ ],
37
+ as_index=False).agg({'Recording_Date':['min','max'],
38
+ 'Video_Reception_Date':'max',
39
+ 'Assignment_Date':'min',
40
+ 'Target_Date':'max',
41
+ 'Labelling_Received_Date':'max',
42
+ 'Verification_Date':'max',
43
+ 'Completion/Rejection_Date':'max',
44
+ 'Assigned': 'sum'})
45
+
46
+ flat_cols = ["_".join(i).rstrip('_') for i in grp_df.columns];# flat_cols
47
+ grp_df.columns = flat_cols
48
+ grp_df['Recording'] = (grp_df['Recording_Date_max'] - grp_df['Recording_Date_min']).dt.days+1
49
+ grp_df['Waiting4Video'] = (grp_df['Video_Reception_Date_max'] - grp_df['Recording_Date_max']).dt.days
50
+ grp_df['Waiting4Assignment'] = (grp_df['Assignment_Date_min'] - grp_df['Video_Reception_Date_max']).dt.days
51
+ grp_df['Labelling'] = (grp_df['Target_Date_max'] - grp_df['Assignment_Date_min']).dt.days
52
+ grp_df['Waiting4Labels'] = (grp_df['Labelling_Received_Date_max'] - grp_df['Target_Date_max']).dt.days
53
+ grp_df['Waiting4Verification'] = (grp_df['Verification_Date_max'] - grp_df['Labelling_Received_Date_max']).dt.days
54
+ grp_df['Waiting4Completion'] = (grp_df['Completion/Rejection_Date_max'] - grp_df['Verification_Date_max']).dt.days
55
+ grp_df['Labelling_Duration'] = grp_df['Labelling'] + grp_df['Waiting4Labels'].fillna(0)
56
+ return grp_df
57
+
58
+ # %% ../../nbs/book/LabellingTracker/14_Model.ipynb 14
59
+ def get_model_summary(df, kind='sum'):
60
+ fig, ax = plt.subplots()
61
+ grp_df = get_model_grp_data(df)
62
+ states = ['Recording','Waiting4Video', 'Waiting4Assignment', 'Labelling', 'Waiting4Labels', 'Waiting4Verification','Waiting4Completion']
63
+ colors = dict(zip(states, ['blue', 'red', 'green', 'yellow', 'cyan', 'violet', 'pink']))
64
+ grp_df[['AccountNumber','AccountName', 'CattleFolder/Frame',
65
+ 'Recording','Waiting4Video', 'Waiting4Assignment', 'Labelling', 'Waiting4Labels', 'Waiting4Verification','Waiting4Completion']].groupby(['AccountNumber', 'AccountName', 'CattleFolder/Frame'], as_index=False).agg(kind).set_index(['AccountNumber', 'AccountName', 'CattleFolder/Frame']).plot(kind='barh', stacked=True, ax=ax, color=colors, legend=False);
66
+ fig.legend(loc='upper right')
67
+ return fig
68
+
69
+ # %% ../../nbs/book/LabellingTracker/14_Model.ipynb 16
70
+ def get_model_hist(df, col):
71
+ grp_df = get_model_grp_data(df)
72
+ fig, ax = plt.subplots()
73
+ grp_df[col].plot(kind='hist', ax=ax, legend=True)
74
+ avg = grp_df[col].mean()
75
+ count = grp_df[col].count()
76
+ ax.axvline(avg, color='red', label=f'mean={avg}')
77
+ ax.set_title(f'{col}[ mean={avg:.2f}, count={count:.2f} ]')
78
+ return fig
79
+ # get_floating_hist(df, 'Recording_Duration')
80
+
81
+ # %% ../../nbs/book/LabellingTracker/14_Model.ipynb 17
82
+ def get_step_df(grp_df, start_step, end_step, step_name):
83
+ df_e = grp_df[['AccountNumber', 'AccountName','Assigned_sum', 'CattleFolder/Frame', 'SubFolder']].copy()
84
+ df_e['Start'] = grp_df[start_step]
85
+ df_e['End'] = grp_df[end_step]
86
+ df_e['Step'] = step_name
87
+ return df_e
88
+
89
+
90
+ # %% ../../nbs/book/LabellingTracker/14_Model.ipynb 19
91
+ def get_gantt(df):
92
+ steps = [
93
+ {'start_step': 'Recording_Date_min', 'end_step' :'Recording_Date_max', 'step_name' : 'Recording'},
94
+ {'start_step': 'Recording_Date_max', 'end_step' :'Video_Reception_Date_max', 'step_name' : 'Waiting4Video'},
95
+ {'start_step': 'Video_Reception_Date_max', 'end_step' :'Assignment_Date_min', 'step_name' : 'Waiting4Assignment'},
96
+ {'start_step': 'Assignment_Date_min', 'end_step' :'Target_Date_max', 'step_name' : 'Labelling'},
97
+ {'start_step': 'Target_Date_max', 'end_step' :'Labelling_Received_Date_max', 'step_name' : 'Waiting4Labels'},
98
+ {'start_step': 'Labelling_Received_Date_max', 'end_step' :'Verification_Date_max', 'step_name' : 'Waiting4Verification'},
99
+ {'start_step': 'Verification_Date_max', 'end_step' :'Completion/Rejection_Date_max', 'step_name' : 'Waiting4Completion'},
100
+ ]
101
+ grp_df = get_model_grp_data(df)
102
+ df_concat = pd.concat(get_step_df(grp_df, start_step=step['start_step'], end_step=step['end_step'], step_name=step['step_name']) for step in steps)
103
+ df_concat['label'] = df_concat[['AccountNumber', 'AccountName', 'CattleFolder/Frame']].apply(lambda row: "_".join(row), axis=1)
104
+ df_concat.loc[df_concat['Step']=='Recording', 'Start'] = df_concat.loc[df_concat['Step']=='Recording', 'Start'] - pd.Timedelta(days=1)
105
+ # # df_concat
106
+
107
+ states = [s['step_name'] for s in steps]; # states
108
+ colors = dict(zip(states, ['blue', 'red', 'green', 'yellow', 'cyan', 'violet', 'pink']))
109
+
110
+ fig = px.timeline(data_frame=df_concat, x_start='Start', x_end='End', y='label', color='Step', color_discrete_map=colors, hover_data=['Assigned_sum', 'AccountName', 'AccountNumber'])
111
+ # fig.update_layout(legend=dict(
112
+ # orientation="h",
113
+
114
+ # ))
115
+ return fig
116
+
117
+ # %% ../../nbs/book/LabellingTracker/14_Model.ipynb 23
118
+ df = None
119
+ st.write("# Model Details")
120
+ if 'processed_df' not in st.session_state:
121
+ st.write("Please go to andon page and upload data")
122
+ else:
123
+ df = st.session_state['processed_df']
124
+ st.markdown("## Summary Model Durations")
125
+ st.markdown(" Below plot includes a summary of all the frames in different model farms. Process includes recording and sharing video everyday with non sequential sharing schedule")
126
+ with st.container(border=True):
127
+ tab_sum, tab_mean = st.tabs(['Sum', 'Mean'])
128
+ with tab_sum:
129
+ st.pyplot(get_model_summary(df))
130
+ with tab_mean:
131
+ st.pyplot(get_model_summary(df, kind='mean'))
132
+ ncols = 3
133
+ dcols = st.columns(ncols)
134
+ for i, col in enumerate(['Recording','Waiting4Video', 'Waiting4Assignment', 'Labelling_Duration', 'Waiting4Verification', 'Waiting4Completion']):
135
+ with dcols[i%ncols]:
136
+ st.pyplot(get_model_hist(df, col), use_container_width=True)
137
+
138
+ st.markdown("## Timeline")
139
+ with st.container(border=True):
140
+ st.plotly_chart(get_gantt(df), theme="streamlit", use_container_width=True)
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ fastcore
2
+ pandas
3
+ matplotlib
4
+ plotly