Spaces:
Runtime error
Runtime error
import streamlit as st | |
import pandas as pd | |
from docxtpl import DocxTemplate, InlineImage | |
from docx.shared import Mm, Inches | |
import datetime | |
from datetime import timedelta, date | |
import io | |
# from utils import * | |
########## Title for the Web App ########## | |
st.title("Report Generator") | |
########## Create Input field ########## | |
# feedback = st.text_input('Type your text here', 'Customer suggested that the customer service needs to be improved and the response time needs to be improved.') | |
# if st.button('Click for predictions!'): | |
# with st.spinner('Generating predictions...'): | |
# topics_prob, sentiment_prob, touchpoint_prob = get_single_prediction(feedback) | |
# bar_topic = px.bar(topics_prob, x='probability', y='topic') | |
# bar_touchpoint = px.bar(touchpoint_prob, x='probability', y='touchpoint') | |
# pie = px.pie(sentiment_prob, | |
# values='probability', | |
# names='sentiment', | |
# color_discrete_map={'positive':'rgb(0, 204, 0)', | |
# 'negative':'rgb(215, 11, 11)' | |
# }, | |
# color='sentiment' | |
# ) | |
# st.plotly_chart(bar_topic, use_container_width=True) | |
# st.plotly_chart(bar_touchpoint, use_container_width=True) | |
# st.plotly_chart(pie, use_container_width=True) | |
# st.write("\n") | |
# st.subheader('Or... Upload a csv file if you have a file instead.') | |
# st.write("\n") | |
# st.download_button( | |
# label="Download sample file here", | |
# data=sample_file, | |
# file_name='sample_data.csv', | |
# mime='text/csv', | |
# ) | |
uploaded_files = st.file_uploader("Upload multiple files", accept_multiple_files=True) | |
if len(uploaded_files) > 0: | |
# with st.spinner('Generating report...'): | |
for uploaded_file in uploaded_files: | |
if uploaded_file.name == 'Flip_accum.xlsx': | |
flip_accum1 = pd.read_excel(uploaded_file, skiprows=8, nrows=11, usecols="A:D") | |
flip_accum2 = pd.read_excel(uploaded_file, skiprows=24, nrows=5, usecols="A:N") | |
#st.write('flip_accum1: ' + str(flip_accum1.shape)) | |
elif uploaded_file.name == 'Fold_accum.xlsx': | |
fold_accum1 = pd.read_excel(uploaded_file, skiprows=8, nrows=11, usecols="A:D") | |
fold_accum2 = pd.read_excel(uploaded_file, skiprows=24, nrows=5, usecols="A:N") | |
#st.write('fold_accum1: ' + str(fold_accum1.shape)) | |
elif uploaded_file.name == 'Flip_today.xlsx': | |
flip_today1 = pd.read_excel(uploaded_file, skiprows=8, nrows=11, usecols="A:D") | |
flip_today2 = pd.read_excel(uploaded_file, skiprows=24, nrows=5, usecols="A:M") | |
#st.write('flip_today1: ' + str(flip_today1.shape)) | |
elif uploaded_file.name == 'Fold_today.xlsx': | |
fold_today1 = pd.read_excel(uploaded_file, skiprows=8, nrows=11, usecols="A:D") | |
fold_today2 = pd.read_excel(uploaded_file, skiprows=24, nrows=5, usecols="A:M") | |
#st.write('fold_today1: ' + str(fold_today1.shape)) | |
elif uploaded_file.name == 'FlipFold4_accum.xlsx': | |
flipfold_accum = pd.read_excel(uploaded_file, skiprows=8, nrows=11, usecols="A:D") | |
flipfold_accum2 = pd.read_excel(uploaded_file, skiprows=24, nrows=5, usecols="A:N") | |
#st.write('flipfold_accum2: ' + str(flipfold_accum2.shape)) | |
elif uploaded_file.name == 'FlipFold4_analysis.xlsx': | |
flipfold = pd.read_excel(uploaded_file, skiprows=9) | |
#st.write('flipfold: ' + str(flipfold.shape)) | |
elif uploaded_file.name == 'flipfold4_report_template.docx': | |
doc = DocxTemplate(uploaded_file) | |
if datetime.datetime.now().day == 1: | |
day_suffix = "st" | |
elif datetime.datetime.now().day == 2: | |
day_suffix = "nd" | |
elif datetime.datetime.now().day == 3: | |
day_suffix = "rd" | |
else: | |
day_suffix = "th" | |
if round(((flipfold_accum2.iloc[2, 4] - flipfold_accum2.iloc[2, 13])/flipfold_accum2.iloc[2, 13]) * 100) < 0: | |
increase_decrease = "Decrease" | |
else: | |
increase_decrease = "Increase" | |
flipfold = flipfold[['Symptom\nGroup 1', 'Subsidiary', 'Marketing Name']] | |
flipfold.columns = ['symptom', 'subsidiary', 'Marketing Name'] | |
display = ['Display', 'Touch', 'OCTA/Backglass Broken', 'Sensor'] | |
quick_discharge = ['Quick Discharge', 'Charging', 'Discharging'] | |
appearance = ['Appearance', 'Case', 'Button'] | |
others = ['In Process', 'WIFI', 'Connection', 'S pen', 'Fault Operation', 'Bluetooth'] | |
flipfold['symptom'] = flipfold['symptom'].apply(lambda x: | |
'Display' if x in display else | |
'Quick Discharge' if x in quick_discharge else | |
'Appearance' if x in appearance else | |
'Others' if x in others else | |
'Sound/Call Audio' if x == 'Sound/Call audio' else | |
x | |
) | |
template = pd.DataFrame({ | |
'symptom': ['Total', 'Heat', 'Display', 'Camera', 'Quick Discharge', 'Power', 'Rebooting', 'App/SW', 'Sound/Call Audio', 'Appearance', 'Others'], | |
'SEAO Total': [0]*11, | |
'SAVINA': [0]*11, | |
'SEAU': [0]*11, | |
'SEIN': [0]*11, | |
'SENZ': [0]*11, | |
'SEPCO': [0]*11, | |
'SESP': [0]*11, | |
'SME': [0]*11, | |
'TSE': [0]*11 | |
}).set_index('symptom') | |
flip4 = flipfold[flipfold['Marketing Name'] == 'Galaxy Z Flip4'] | |
flip4_groupby = pd.DataFrame(flip4.groupby(['symptom', 'subsidiary'])['subsidiary'].count()) | |
flip4_groupby.columns=['count'] | |
flip4_groupby.reset_index(inplace=True) | |
flip4_groupby = flip4_groupby.pivot(index='symptom', columns='subsidiary', values='count').fillna(0) | |
fold4 = flipfold[flipfold['Marketing Name'] == 'Galaxy Z Fold4'] | |
fold4_groupby = pd.DataFrame(fold4.groupby(['symptom', 'subsidiary'])['subsidiary'].count()) | |
fold4_groupby.columns=['count'] | |
fold4_groupby.reset_index(inplace=True) | |
fold4_groupby = fold4_groupby.pivot(index='symptom', columns='subsidiary', values='count').fillna(0) | |
template_flip4 = template.copy() | |
template_fold4 = template.copy() | |
for col in template.columns: | |
for row in template.index: | |
try: | |
template_flip4.loc[row, col] = flip4_groupby.loc[row, col] | |
except: | |
continue | |
for col in template.columns: | |
for row in template.index: | |
try: | |
template_fold4.loc[row, col] = fold4_groupby.loc[row, col] | |
except: | |
continue | |
# Account for SEPCO data entry error | |
template_flip4.loc['Display', 'SEPCO'] = template_flip4.loc['Display', 'SEPCO'] - 4 | |
template_flip4.loc['App/SW', 'SEPCO'] = template_flip4.loc['App/SW', 'SEPCO'] - 2 | |
template_flip4.loc['Others', 'SEPCO'] = template_flip4.loc['Others', 'SEPCO'] + 6 | |
# Account for SEVT into SAVINA count | |
template_fold4.loc['Display', 'SAVINA'] = template_fold4.loc['Display', 'SAVINA'] + 5 | |
template_fold4.loc['Others', 'SAVINA'] = template_fold4.loc['Others', 'SAVINA'] + 2 | |
template_fold4.loc['Rebooting', 'SAVINA'] = template_fold4.loc['Rebooting', 'SAVINA'] + 1 | |
template_fold4.loc['Appearance', 'SAVINA'] = template_fold4.loc['Appearance', 'SAVINA'] + 1 | |
template_flip4.loc['Appearance', 'SAVINA'] = template_flip4.loc['Appearance', 'SAVINA'] + 1 | |
template_flip4.loc['Others', 'SAVINA'] = template_flip4.loc['Others', 'SAVINA'] + 2 | |
template_flip4['SEAO Total'] = template_flip4[['SAVINA', 'SEAU', 'SEIN', 'SENZ', 'SEPCO', 'SESP', 'SME', 'TSE']].sum(axis=1) | |
template_flip4.loc['Total'] = template_flip4[['SEAO Total', 'SAVINA', 'SEAU', 'SEIN', 'SENZ', 'SEPCO', 'SESP', 'SME', 'TSE']].sum(axis=0) | |
template_flip4 = template_flip4.astype(int) | |
template_fold4['SEAO Total'] = template_fold4[['SEAO Total', 'SAVINA', 'SEAU', 'SEIN', 'SENZ', 'SEPCO', 'SESP', 'SME', 'TSE']].sum(axis=1) | |
template_fold4.loc['Total'] = template_fold4[['SEAO Total', 'SAVINA', 'SEAU', 'SEIN', 'SENZ', 'SEPCO', 'SESP', 'SME', 'TSE']].sum(axis=0) | |
template_fold4 = template_fold4.astype(int) | |
flip4_dict = {'a' + str(i): template_flip4.values.flatten()[i-1] for i in range(1,100)} | |
fold4_dict = {'b' + str(i): template_fold4.values.flatten()[i-1] for i in range(1,100)} | |
context = { | |
#"topleft": topleft, | |
#"topright": topright, | |
#"bottomleft": bottomleft, | |
#"bottomright": bottomright, | |
"date0" : int((datetime.date.today() - date(2022, 9, 2))/ timedelta(days=1) + 1), | |
"date1" : datetime.datetime.now().strftime("%#d.%#m.%Y"), | |
"date2" : (datetime.datetime.now() - timedelta(days=1)).strftime("%#d/%#m"), | |
"date3": datetime.datetime.now().strftime("%b.%#d"), | |
"day_suffix": day_suffix, | |
"v2": "{:>6}".format(f'{flip_today1.iloc[5, 2] + fold_today1.iloc[5, 2]:,}'), | |
"v3": f'{int(flip_accum1.iloc[3, 2]):,}', | |
"v4": f'{int(flip_accum1.iloc[5, 2]):,}', | |
"v5": f'{int(flip_accum1.iloc[7, 2]):,}', | |
"v6": f'{int(flip_accum2.iloc[1, 12]):,}', | |
"v7": f'{int(flip_accum2.iloc[1, 5]):,}', | |
"v8": f'{int(flip_accum2.iloc[1, 6]):,}', | |
"v9": f'{int(fold_accum1.iloc[3, 2]):,}', | |
"v10": f'{int(fold_accum1.iloc[5, 2]):,}', | |
"v11": f'{int(fold_accum1.iloc[7, 2]):,}', | |
"v12": f'{int(fold_accum2.iloc[1, 12]):,}', | |
"v13": f'{int(fold_accum2.iloc[1, 5]):,}', | |
"v14": f'{int(fold_accum2.iloc[1, 6]):,}', | |
# "v21": f'{int(flip_today1.iloc[3, 2]):,}', # changed on 5 Sep 2022 | |
# "v22": f'{int(flip_today1.iloc[5, 2]):,}', | |
# "v23": f'{int(flip_today1.iloc[7, 2]):,}', | |
"v21": f'{int(flip_today2.iloc[1, 12]):,}', | |
"v22": f'{int(flip_today2.iloc[1, 5]):,}', | |
"v23": f'{int(flip_today2.iloc[1, 6]):,}', | |
"v24": f'{int(fold_today2.iloc[1, 12]):,}', | |
"v25": f'{int(fold_today2.iloc[1, 5]):,}', | |
"v26": f'{int(fold_today2.iloc[1, 6]):,}', | |
# Table 1 Subtotals | |
"v16": f'{int(flip_accum1.iloc[7, 2] + fold_accum1.iloc[7, 2]):,}', | |
"v17": f'{int(flip_accum1.iloc[3, 2] + fold_accum1.iloc[3, 2]):,}', | |
"v18": f'{int(flip_accum2.iloc[1, 12] + fold_accum2.iloc[1, 12]):,}', | |
"v19": f'{int(flip_accum2.iloc[1, 5] + fold_accum2.iloc[1, 5]):,}', | |
"v20": f'{int(flip_accum2.iloc[1, 6] + fold_accum2.iloc[1, 6]):,}', | |
"v27": f'{int(flip_today2.iloc[1, 12]) + int(fold_today2.iloc[1, 12]):,}', | |
"v28": f'{int(flip_today2.iloc[1, 5]) + int(fold_today2.iloc[1, 5]):,}', | |
"v29": f'{int(flip_today2.iloc[1, 6]) + int(fold_today2.iloc[1, 6]):,}', | |
"v30": f'{int(flip_today2.iloc[1, 4]):,}', | |
"v31": f'{int(fold_today2.iloc[1, 4]):,}', | |
"v15": f'{int(flip_today2.iloc[1, 4]) + int(fold_today2.iloc[1, 4]):,}', | |
"v1": f'{int(flip_accum1.iloc[5, 2] + fold_accum1.iloc[5, 2]):,}', | |
"v32": f'{int(flipfold_accum2.iloc[2, 4]):,}', | |
"v33": f'{int(flip_accum2.iloc[2, 4]):,}', | |
"v34": f'{int(fold_accum2.iloc[2, 4]):,}', | |
"v35": f'{int(flipfold_accum2.iloc[2, 13]):,}', | |
"v36": f'{int(fold_accum2.iloc[2, 13]):,}', | |
"v37": f'{int(flip_accum2.iloc[2, 13]):,}', | |
"v38": abs(round(((flipfold_accum2.iloc[2, 4] - flipfold_accum2.iloc[2, 13])/flipfold_accum2.iloc[2, 13]) * 100)), | |
"increase_decrease": increase_decrease, | |
"c12": int(template_flip4.loc[['Heat', 'Quick Discharge', 'Power', 'Rebooting'], 'SEAO Total'].sum()), | |
"c19": int(template_fold4.loc[['Heat', 'Quick Discharge', 'Power', 'Rebooting'], 'SEAO Total'].sum()), | |
"c14": int(template_flip4.loc[['Camera', 'Others'], 'SEAO Total'].sum()), | |
"c21": int(template_fold4.loc[['Camera', 'Others'], 'SEAO Total'].sum()), | |
"c1": int(flip4_dict["a1"] + fold4_dict["b1"]), | |
"c2": int(flip4_dict["a19"] + fold4_dict["b19"]), | |
"c3": int(flip4_dict["a64"] + fold4_dict["b64"]), | |
"c4": int(flip4_dict["a82"] + fold4_dict["b82"]), | |
"c5": int(template_flip4.loc[['Heat', 'Quick Discharge', 'Power', 'Rebooting'], 'SEAO Total'].sum() + template_fold4.loc[['Heat', 'Quick Discharge', 'Power', 'Rebooting'], 'SEAO Total'].sum()), | |
"c6": int(flip4_dict["a73"] + fold4_dict["b73"]), | |
"c7": int(template_flip4.loc[['Camera', 'Others'], 'SEAO Total'].sum() + template_fold4.loc[['Camera', 'Others'], 'SEAO Total'].sum()), | |
"d1": round(100*(flip4_dict["a19"] + fold4_dict["b19"])/(flip4_dict["a1"] + fold4_dict["b1"])), | |
"d2": round(100*(flip4_dict["a64"] + fold4_dict["b64"])/(flip4_dict["a1"] + fold4_dict["b1"])), | |
"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"])) | |
} | |
context2 = {**context, **flip4_dict, **fold4_dict} | |
doc.render(context2) | |
# Create in-memory buffer | |
file_stream = io.BytesIO() | |
# Save the .docx to the buffer | |
doc.save(file_stream) | |
# Reset the buffer's file-pointer to the beginning of the file | |
file_stream.seek(0) | |
#doc.save("SEAO Fold 4_Flip 4 Quality Monitoring (" + datetime.datetime.now().strftime("%#d %b") + ").docx") | |
st.download_button( | |
label="Download report here", | |
data=file_stream, | |
file_name="SEAO Fold 4_Flip 4 Quality Monitoring (" + datetime.datetime.now().strftime("%#d %b") + ").docx", | |
mime='application/vnd.openxmlformats-officedocument.wordprocessingml.document' | |
) | |