Spaces:
Runtime error
Runtime error
initial test
Browse files
app.py
CHANGED
@@ -50,43 +50,231 @@ uploaded_files = st.file_uploader("Upload multiple files", accept_multiple_files
|
|
50 |
if uploaded_files is not None:
|
51 |
|
52 |
# with st.spinner('Generating report...'):
|
53 |
-
|
54 |
for uploaded_file in uploaded_files:
|
55 |
if uploaded_file.name == 'Flip_accum.xlsx':
|
56 |
flip_accum1 = pd.read_excel(uploaded_file, skiprows=8, nrows=11, usecols="A:D")
|
57 |
flip_accum2 = pd.read_excel(uploaded_file, skiprows=24, nrows=5, usecols="A:N")
|
58 |
-
st.write('flip_accum1: ' + str(flip_accum1.shape))
|
59 |
|
60 |
elif uploaded_file.name == 'Fold_accum.xlsx':
|
61 |
fold_accum1 = pd.read_excel(uploaded_file, skiprows=8, nrows=11, usecols="A:D")
|
62 |
fold_accum2 = pd.read_excel(uploaded_file, skiprows=24, nrows=5, usecols="A:N")
|
63 |
-
|
64 |
|
65 |
elif uploaded_file.name == 'Flip_today.xlsx':
|
66 |
flip_today1 = pd.read_excel(uploaded_file, skiprows=8, nrows=11, usecols="A:D")
|
67 |
flip_today2 = pd.read_excel(uploaded_file, skiprows=24, nrows=5, usecols="A:M")
|
68 |
-
st.write('flip_today1: ' + str(flip_today1.shape))
|
69 |
|
70 |
elif uploaded_file.name == 'Fold_today.xlsx':
|
71 |
fold_today1 = pd.read_excel(uploaded_file, skiprows=8, nrows=11, usecols="A:D")
|
72 |
fold_today2 = pd.read_excel(uploaded_file, skiprows=24, nrows=5, usecols="A:M")
|
73 |
-
st.write('fold_today1: ' + str(fold_today1.shape))
|
74 |
|
75 |
elif uploaded_file.name == 'FlipFold4_accum.xlsx':
|
76 |
flipfold_accum = pd.read_excel(uploaded_file, skiprows=8, nrows=11, usecols="A:D")
|
77 |
flipfold_accum2 = pd.read_excel(uploaded_file, skiprows=24, nrows=5, usecols="A:N")
|
78 |
-
st.write('flipfold_accum: ' + str(flipfold_accum.shape))
|
79 |
|
80 |
elif uploaded_file.name == 'FlipFold4_analysis.xlsx':
|
81 |
flipfold = pd.read_excel(uploaded_file, skiprows=9)
|
82 |
-
st.write('flipfold: ' + str(flipfold.shape))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
83 |
|
|
|
|
|
|
|
|
|
84 |
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
91 |
|
92 |
|
|
|
50 |
if uploaded_files is not None:
|
51 |
|
52 |
# with st.spinner('Generating report...'):
|
53 |
+
|
54 |
for uploaded_file in uploaded_files:
|
55 |
if uploaded_file.name == 'Flip_accum.xlsx':
|
56 |
flip_accum1 = pd.read_excel(uploaded_file, skiprows=8, nrows=11, usecols="A:D")
|
57 |
flip_accum2 = pd.read_excel(uploaded_file, skiprows=24, nrows=5, usecols="A:N")
|
58 |
+
#st.write('flip_accum1: ' + str(flip_accum1.shape))
|
59 |
|
60 |
elif uploaded_file.name == 'Fold_accum.xlsx':
|
61 |
fold_accum1 = pd.read_excel(uploaded_file, skiprows=8, nrows=11, usecols="A:D")
|
62 |
fold_accum2 = pd.read_excel(uploaded_file, skiprows=24, nrows=5, usecols="A:N")
|
63 |
+
#st.write('fold_accum1: ' + str(fold_accum1.shape))
|
64 |
|
65 |
elif uploaded_file.name == 'Flip_today.xlsx':
|
66 |
flip_today1 = pd.read_excel(uploaded_file, skiprows=8, nrows=11, usecols="A:D")
|
67 |
flip_today2 = pd.read_excel(uploaded_file, skiprows=24, nrows=5, usecols="A:M")
|
68 |
+
#st.write('flip_today1: ' + str(flip_today1.shape))
|
69 |
|
70 |
elif uploaded_file.name == 'Fold_today.xlsx':
|
71 |
fold_today1 = pd.read_excel(uploaded_file, skiprows=8, nrows=11, usecols="A:D")
|
72 |
fold_today2 = pd.read_excel(uploaded_file, skiprows=24, nrows=5, usecols="A:M")
|
73 |
+
#st.write('fold_today1: ' + str(fold_today1.shape))
|
74 |
|
75 |
elif uploaded_file.name == 'FlipFold4_accum.xlsx':
|
76 |
flipfold_accum = pd.read_excel(uploaded_file, skiprows=8, nrows=11, usecols="A:D")
|
77 |
flipfold_accum2 = pd.read_excel(uploaded_file, skiprows=24, nrows=5, usecols="A:N")
|
78 |
+
#st.write('flipfold_accum: ' + str(flipfold_accum.shape))
|
79 |
|
80 |
elif uploaded_file.name == 'FlipFold4_analysis.xlsx':
|
81 |
flipfold = pd.read_excel(uploaded_file, skiprows=9)
|
82 |
+
#st.write('flipfold: ' + str(flipfold.shape))
|
83 |
+
|
84 |
+
elif uploaded_file.name == 'flipfold4_report_template.docx':
|
85 |
+
doc = DocxTemplate(uploaded_file)
|
86 |
+
|
87 |
+
if datetime.datetime.now().day == 1:
|
88 |
+
day_suffix = "st"
|
89 |
+
elif datetime.datetime.now().day == 2:
|
90 |
+
day_suffix = "nd"
|
91 |
+
elif datetime.datetime.now().day == 3:
|
92 |
+
day_suffix = "rd"
|
93 |
+
else:
|
94 |
+
day_suffix = "th"
|
95 |
|
96 |
+
if round(((flipfold_accum2.iloc[2, 4] - flipfold_accum2.iloc[2, 13])/flipfold_accum2.iloc[2, 13]) * 100) < 0:
|
97 |
+
increase_decrease = "Decrease"
|
98 |
+
else:
|
99 |
+
increase_decrease = "Increase"
|
100 |
|
101 |
+
flipfold = flipfold[['Symptom\nGroup 1', 'Subsidiary', 'Marketing Name']]
|
102 |
+
flipfold.columns = ['symptom', 'subsidiary', 'Marketing Name']
|
103 |
+
|
104 |
+
display = ['Display', 'Touch', 'OCTA/Backglass Broken', 'Sensor']
|
105 |
+
quick_discharge = ['Quick Discharge', 'Charging', 'Discharging']
|
106 |
+
appearance = ['Appearance', 'Case', 'Button']
|
107 |
+
others = ['In Process', 'WIFI', 'Connection', 'S pen', 'Fault Operation', 'Bluetooth']
|
108 |
+
|
109 |
+
flipfold['symptom'] = flipfold['symptom'].apply(lambda x:
|
110 |
+
'Display' if x in display else
|
111 |
+
'Quick Discharge' if x in quick_discharge else
|
112 |
+
'Appearance' if x in appearance else
|
113 |
+
'Others' if x in others else
|
114 |
+
'Sound/Call Audio' if x == 'Sound/Call audio' else
|
115 |
+
x
|
116 |
+
)
|
117 |
+
|
118 |
+
template = pd.DataFrame({
|
119 |
+
'symptom': ['Total', 'Heat', 'Display', 'Camera', 'Quick Discharge', 'Power', 'Rebooting', 'App/SW', 'Sound/Call Audio', 'Appearance', 'Others'],
|
120 |
+
'SEAO Total': [0]*11,
|
121 |
+
'SAVINA': [0]*11,
|
122 |
+
'SEAU': [0]*11,
|
123 |
+
'SEIN': [0]*11,
|
124 |
+
'SENZ': [0]*11,
|
125 |
+
'SEPCO': [0]*11,
|
126 |
+
'SESP': [0]*11,
|
127 |
+
'SME': [0]*11,
|
128 |
+
'TSE': [0]*11
|
129 |
+
}).set_index('symptom')
|
130 |
+
|
131 |
+
flip4 = flipfold[flipfold['Marketing Name'] == 'Galaxy Z Flip4']
|
132 |
+
|
133 |
+
flip4_groupby = pd.DataFrame(flip4.groupby(['symptom', 'subsidiary'])['subsidiary'].count())
|
134 |
+
flip4_groupby.columns=['count']
|
135 |
+
flip4_groupby.reset_index(inplace=True)
|
136 |
+
flip4_groupby = flip4_groupby.pivot(index='symptom', columns='subsidiary', values='count').fillna(0)
|
137 |
+
|
138 |
+
fold4 = flipfold[flipfold['Marketing Name'] == 'Galaxy Z Fold4']
|
139 |
+
|
140 |
+
fold4_groupby = pd.DataFrame(fold4.groupby(['symptom', 'subsidiary'])['subsidiary'].count())
|
141 |
+
fold4_groupby.columns=['count']
|
142 |
+
fold4_groupby.reset_index(inplace=True)
|
143 |
+
fold4_groupby = fold4_groupby.pivot(index='symptom', columns='subsidiary', values='count').fillna(0)
|
144 |
+
|
145 |
+
template_flip4 = template.copy()
|
146 |
+
template_fold4 = template.copy()
|
147 |
+
|
148 |
+
for col in template.columns:
|
149 |
+
for row in template.index:
|
150 |
+
try:
|
151 |
+
template_flip4.loc[row, col] = flip4_groupby.loc[row, col]
|
152 |
+
except:
|
153 |
+
continue
|
154 |
+
|
155 |
+
for col in template.columns:
|
156 |
+
for row in template.index:
|
157 |
+
try:
|
158 |
+
template_fold4.loc[row, col] = fold4_groupby.loc[row, col]
|
159 |
+
except:
|
160 |
+
continue
|
161 |
+
|
162 |
+
# Account for SEPCO data entry error
|
163 |
+
template_flip4.loc['Display', 'SEPCO'] = template_flip4.loc['Display', 'SEPCO'] - 4
|
164 |
+
template_flip4.loc['App/SW', 'SEPCO'] = template_flip4.loc['App/SW', 'SEPCO'] - 2
|
165 |
+
template_flip4.loc['Others', 'SEPCO'] = template_flip4.loc['Others', 'SEPCO'] + 6
|
166 |
+
|
167 |
+
# Account for SEVT into SAVINA count
|
168 |
+
template_fold4.loc['Display', 'SAVINA'] = template_fold4.loc['Display', 'SAVINA'] + 5
|
169 |
+
template_fold4.loc['Others', 'SAVINA'] = template_fold4.loc['Others', 'SAVINA'] + 2
|
170 |
+
template_fold4.loc['Rebooting', 'SAVINA'] = template_fold4.loc['Rebooting', 'SAVINA'] + 1
|
171 |
+
template_fold4.loc['Appearance', 'SAVINA'] = template_fold4.loc['Appearance', 'SAVINA'] + 1
|
172 |
+
|
173 |
+
template_flip4.loc['Appearance', 'SAVINA'] = template_flip4.loc['Appearance', 'SAVINA'] + 1
|
174 |
+
template_flip4.loc['Others', 'SAVINA'] = template_flip4.loc['Others', 'SAVINA'] + 2
|
175 |
+
|
176 |
+
template_flip4['SEAO Total'] = template_flip4[['SAVINA', 'SEAU', 'SEIN', 'SENZ', 'SEPCO', 'SESP', 'SME', 'TSE']].sum(axis=1)
|
177 |
+
template_flip4.loc['Total'] = template_flip4[['SEAO Total', 'SAVINA', 'SEAU', 'SEIN', 'SENZ', 'SEPCO', 'SESP', 'SME', 'TSE']].sum(axis=0)
|
178 |
+
template_flip4 = template_flip4.astype(int)
|
179 |
+
|
180 |
+
template_fold4['SEAO Total'] = template_fold4[['SEAO Total', 'SAVINA', 'SEAU', 'SEIN', 'SENZ', 'SEPCO', 'SESP', 'SME', 'TSE']].sum(axis=1)
|
181 |
+
template_fold4.loc['Total'] = template_fold4[['SEAO Total', 'SAVINA', 'SEAU', 'SEIN', 'SENZ', 'SEPCO', 'SESP', 'SME', 'TSE']].sum(axis=0)
|
182 |
+
template_fold4 = template_fold4.astype(int)
|
183 |
+
|
184 |
+
flip4_dict = {'a' + str(i): template_flip4.values.flatten()[i-1] for i in range(1,100)}
|
185 |
+
fold4_dict = {'b' + str(i): template_fold4.values.flatten()[i-1] for i in range(1,100)}
|
186 |
+
|
187 |
+
context = {
|
188 |
+
|
189 |
+
#"topleft": topleft,
|
190 |
+
#"topright": topright,
|
191 |
+
#"bottomleft": bottomleft,
|
192 |
+
#"bottomright": bottomright,
|
193 |
+
|
194 |
+
"date0" : int((datetime.date.today() - date(2022, 9, 2))/ timedelta(days=1) + 1),
|
195 |
+
"date1" : datetime.datetime.now().strftime("%#d.%#m.%Y"),
|
196 |
+
"date2" : (datetime.datetime.now() - timedelta(days=1)).strftime("%#d/%#m"),
|
197 |
+
"date3": datetime.datetime.now().strftime("%b.%#d"),
|
198 |
+
"day_suffix": day_suffix,
|
199 |
+
"v2": "{:>6}".format(f'{flip_today1.iloc[5, 2] + fold_today1.iloc[5, 2]:,}'),
|
200 |
+
"v3": f'{int(flip_accum1.iloc[3, 2]):,}',
|
201 |
+
"v4": f'{int(flip_accum1.iloc[5, 2]):,}',
|
202 |
+
"v5": f'{int(flip_accum1.iloc[7, 2]):,}',
|
203 |
+
|
204 |
+
"v6": f'{int(flip_accum2.iloc[1, 12]):,}',
|
205 |
+
"v7": f'{int(flip_accum2.iloc[1, 5]):,}',
|
206 |
+
"v8": f'{int(flip_accum2.iloc[1, 6]):,}',
|
207 |
+
|
208 |
+
"v9": f'{int(fold_accum1.iloc[3, 2]):,}',
|
209 |
+
"v10": f'{int(fold_accum1.iloc[5, 2]):,}',
|
210 |
+
"v11": f'{int(fold_accum1.iloc[7, 2]):,}',
|
211 |
+
|
212 |
+
"v12": f'{int(fold_accum2.iloc[1, 12]):,}',
|
213 |
+
"v13": f'{int(fold_accum2.iloc[1, 5]):,}',
|
214 |
+
"v14": f'{int(fold_accum2.iloc[1, 6]):,}',
|
215 |
+
|
216 |
+
# "v21": f'{int(flip_today1.iloc[3, 2]):,}', # changed on 5 Sep 2022
|
217 |
+
# "v22": f'{int(flip_today1.iloc[5, 2]):,}',
|
218 |
+
# "v23": f'{int(flip_today1.iloc[7, 2]):,}',
|
219 |
+
|
220 |
+
"v21": f'{int(flip_today2.iloc[1, 12]):,}',
|
221 |
+
"v22": f'{int(flip_today2.iloc[1, 5]):,}',
|
222 |
+
"v23": f'{int(flip_today2.iloc[1, 6]):,}',
|
223 |
+
|
224 |
+
"v24": f'{int(fold_today2.iloc[1, 12]):,}',
|
225 |
+
"v25": f'{int(fold_today2.iloc[1, 5]):,}',
|
226 |
+
"v26": f'{int(fold_today2.iloc[1, 6]):,}',
|
227 |
+
|
228 |
+
# Table 1 Subtotals
|
229 |
+
"v16": f'{int(flip_accum1.iloc[7, 2] + fold_accum1.iloc[7, 2]):,}',
|
230 |
+
"v17": f'{int(flip_accum1.iloc[3, 2] + fold_accum1.iloc[3, 2]):,}',
|
231 |
+
"v18": f'{int(flip_accum2.iloc[1, 12] + fold_accum2.iloc[1, 12]):,}',
|
232 |
+
"v19": f'{int(flip_accum2.iloc[1, 5] + fold_accum2.iloc[1, 5]):,}',
|
233 |
+
"v20": f'{int(flip_accum2.iloc[1, 6] + fold_accum2.iloc[1, 6]):,}',
|
234 |
+
"v27": f'{int(flip_today2.iloc[1, 12]) + int(fold_today2.iloc[1, 12]):,}',
|
235 |
+
"v28": f'{int(flip_today2.iloc[1, 5]) + int(fold_today2.iloc[1, 5]):,}',
|
236 |
+
"v29": f'{int(flip_today2.iloc[1, 6]) + int(fold_today2.iloc[1, 6]):,}',
|
237 |
+
"v30": f'{int(flip_today2.iloc[1, 4]):,}',
|
238 |
+
"v31": f'{int(fold_today2.iloc[1, 4]):,}',
|
239 |
+
"v15": f'{int(flip_today2.iloc[1, 4]) + int(fold_today2.iloc[1, 4]):,}',
|
240 |
+
"v1": f'{int(flip_accum1.iloc[5, 2] + fold_accum1.iloc[5, 2]):,}',
|
241 |
+
|
242 |
+
"v32": f'{int(flipfold_accum2.iloc[2, 4]):,}',
|
243 |
+
"v33": f'{int(flip_accum2.iloc[2, 4]):,}',
|
244 |
+
"v34": f'{int(fold_accum2.iloc[2, 4]):,}',
|
245 |
+
|
246 |
+
"v35": f'{int(flipfold_accum2.iloc[2, 13]):,}',
|
247 |
+
"v36": f'{int(fold_accum2.iloc[2, 13]):,}',
|
248 |
+
"v37": f'{int(flip_accum2.iloc[2, 13]):,}',
|
249 |
+
"v38": abs(round(((flipfold_accum2.iloc[2, 4] - flipfold_accum2.iloc[2, 13])/flipfold_accum2.iloc[2, 13]) * 100)),
|
250 |
+
"increase_decrease": increase_decrease,
|
251 |
+
|
252 |
+
"c12": int(template_flip4.loc[['Heat', 'Quick Discharge', 'Power', 'Rebooting'], 'SEAO Total'].sum()),
|
253 |
+
"c19": int(template_fold4.loc[['Heat', 'Quick Discharge', 'Power', 'Rebooting'], 'SEAO Total'].sum()),
|
254 |
+
"c14": int(template_flip4.loc[['Camera', 'Others'], 'SEAO Total'].sum()),
|
255 |
+
"c21": int(template_fold4.loc[['Camera', 'Others'], 'SEAO Total'].sum()),
|
256 |
+
"c1": int(flip4_dict["a1"] + fold4_dict["b1"]),
|
257 |
+
"c2": int(flip4_dict["a19"] + fold4_dict["b19"]),
|
258 |
+
"c3": int(flip4_dict["a64"] + fold4_dict["b64"]),
|
259 |
+
"c4": int(flip4_dict["a82"] + fold4_dict["b82"]),
|
260 |
+
"c5": int(template_flip4.loc[['Heat', 'Quick Discharge', 'Power', 'Rebooting'], 'SEAO Total'].sum() + template_fold4.loc[['Heat', 'Quick Discharge', 'Power', 'Rebooting'], 'SEAO Total'].sum()),
|
261 |
+
"c6": int(flip4_dict["a73"] + fold4_dict["b73"]),
|
262 |
+
"c7": int(template_flip4.loc[['Camera', 'Others'], 'SEAO Total'].sum() + template_fold4.loc[['Camera', 'Others'], 'SEAO Total'].sum()),
|
263 |
+
|
264 |
+
"d1": round(100*(flip4_dict["a19"] + fold4_dict["b19"])/(flip4_dict["a1"] + fold4_dict["b1"])),
|
265 |
+
"d2": round(100*(flip4_dict["a64"] + fold4_dict["b64"])/(flip4_dict["a1"] + fold4_dict["b1"])),
|
266 |
+
"d3": round(100*(template_flip4.loc[['Heat', 'Quick Discharge', 'Power', 'Rebooting'], 'SEAO Total'].sum() + template_fold4.loc[['Heat', 'Quick Discharge', 'Power', 'Rebooting'], 'SEAO Total'].sum())/(flip4_dict["a1"] + fold4_dict["b1"]))
|
267 |
+
}
|
268 |
+
|
269 |
+
context2 = {**context, **flip4_dict, **fold4_dict}
|
270 |
+
doc.render(context2)
|
271 |
+
results = doc.save()
|
272 |
+
|
273 |
+
st.download_button(
|
274 |
+
label="Download report here",
|
275 |
+
data=results,
|
276 |
+
file_name="SEAO Fold 4_Flip 4 Quality Monitoring (" + datetime.datetime.now().strftime("%#d %b") + ").docx",
|
277 |
+
mime='application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
278 |
+
)
|
279 |
|
280 |
|