import streamlit as st from platform import python_version import os import pandas as pd from datetime import datetime import openpyxl from openpyxl.styles import PatternFill, Border, Side from openpyxl.utils.dataframe import dataframe_to_rows from openpyxl import Workbook # [theme] # primaryColor = "#E694FF" # backgroundColor = "#00172B" # secondaryBackgroundColor = "#0083B8" # textColor = "#C6CDD4" # font = "sans-serif" # add_selectbox = st.sidebar.selectbox( # "How would you like to be contacted?", # ("Email", "Home phone", "Mobile phone") # ) # Using "with" notation # with st.sidebar: # add_radio = st.radio( # "Choose a shipping method", # ("Standard (5-15 days)", "Express (2-5 days)") # ) def tut4(of): u = of['U'] # assigning a list to columns of input file v = of['V'] w = of['W'] t = of['T'] # calculating the avg value sum() returns summation and len() return length avgu = [sum(u) / len(u)] avgv = [sum(v) / len(v)] avgw = [sum(w) / len(w)] au = sum(u) / len(u) av = sum(v) / len(v) aw = sum(w) / len(w) u_ = [] v_ = [] w_ = [] for i in u: u_.append(i - au) # pushing the element at back of list for i in v: v_.append(i - av) for i in w: w_.append(i - aw) # filling the remaining spaces in the column with blank space using extend function avgu.extend([''] * (len(u) - 1)) avgv.extend([''] * (len(u) - 1)) avgw.extend([''] * (len(u) - 1)) octs = [1, -1, 2, -2, 3, -3, 4, -4] lenc = {} # dictionary to store longest subsequence length for each octant for i in octs: lenc[i] = 0 octants = [] # list to store octants for each case col2 = [] # column to store longest subsequence length for each octant col4 = [] # column to store octants and time row col5 = [] # column to store start time col6 = [] # column to store end time # loop to determine the octant and to store the octants # and update the length of subsequence with maxmimum length each time c = 1 p = 1 for i in range(len(u_)): oc = 1 if (u_[i] > 0) and (v_[i] > 0) and (w_[i] > 0): oc = 1 elif (u_[i]) < 0 and (v_[i]) > 0 and (w_[i]) > 0: oc = 2 elif (u_[i]) < 0 and (v_[i]) < 0 and (w_[i]) > 0: oc = 3 elif (u_[i]) > 0 and (v_[i]) < 0 and (w_[i]) > 0: oc = 4 elif (u_[i]) > 0 and (v_[i]) > 0 and (w_[i]) < 0: oc = -1 elif (u_[i]) < 0 and (v_[i]) > 0 and (w_[i]) < 0: oc = -2 elif (u_[i]) < 0 and (v_[i]) < 0 and (w_[i]) < 0: oc = -3 elif (u_[i]) > 0 and (v_[i]) < 0 and (w_[i]) < 0: oc = -4 octants.append(oc) if i > 0: if oc == p: c += 1 else: c = 1 p = oc lenc[oc] = max(lenc[oc], c) octants.extend([''] * (len(u_) - len(octants))) of[' '] = '' col1 = [] # column to store the octant values for i in octs: col1.append(i) col1.extend([''] * (len(u_) - len(col1))) of['Octant ##'] = col1 # column to store the longest subsequence length for each octant value for i in lenc.values(): col2.append(i) col2.extend([''] * (len(u_) - len(col2))) of['Longest Subsequence Length'] = col2 col3 = [] # column to store count of longest subsequence for each octant value maxc = {} # dictionary to store count of longest subsequence for each octant value maxl = {} # dictionary to store start and end time for each octant's longest subsequence for i in octs: maxc[i] = 0 maxl[i] = [] p = 0 c = 1 time = t[0] f = 0 j = 0 # loop performing required operations to store count of longest subsequence for each octant value # and start and end time for each longest subsequence of individual octant for i in octants: if f == 0: time = t[j] f = 1 oc = i if oc == p: c += 1 else: c = 1 time = t[j] if c == lenc[oc]: maxc[oc] += 1 maxl[oc].append([time, t[j]]) f = 0 p = oc j = j + 1 for i in maxc.values(): col3.append(i) col3.extend([''] * (len(u_) - len(col3))) of['Count '] = col3 of[' '] = '' # forming the required output columns accordingly from this tut's output for i in octs: col4.append(i) col5.append(lenc[i]) col6.append(maxc[i]) col4.append('Time') col5.append('From') col6.append('To') for j in maxl[i]: col5.append(j[0]) col6.append(j[1]) col4.extend([''] * (len(col6) - len(col4))) cnt = len(col6) col4.extend([''] * (len(u_) - len(col4))) col5.extend([''] * (len(u_) - len(col5))) col6.extend([''] * (len(u_) - len(col6))) of['Octant ###'] = col4 of[' Longest Subsequence Length'] = col5 of['Count '] = col6 return cnt def tut2(of, mod=5000): u = of['U'] # assigning list to columns of input file v = of['V'] w = of['W'] # calculating the avg value sum() returns summation and len() return length avgu = [sum(u) / len(u)] avgv = [sum(v) / len(v)] avgw = [sum(w) / len(w)] au = sum(u) / len(u) av = sum(v) / len(v) aw = sum(w) / len(w) u_ = [] v_ = [] w_ = [] for i in u: u_.append(i - au) # pushing the element at back of list for i in v: v_.append(i - av) for i in w: w_.append(i - aw) # filling the remaining spaces in the column with blank space avgu.extend([''] * (len(u) - 1)) avgv.extend([''] * (len(u) - 1)) avgw.extend([''] * (len(u) - 1)) col = ['', 'User Input'] col.extend([''] * (len(u_) - 2)) ranges = (len(u_) + mod - 1) // mod oc_id = ['Overall Count', 'Mod ' + str(mod)] # loop for creating the mod range's column for i in range(ranges): if i == ranges - 1: oc_id.append(str(i * mod) + '-' + str(min((i + 1) * mod - 1, len(u) - 1))) else: oc_id.append(str(i * mod) + '-' + str((i + 1) * mod - 1)) octs = [1, -1, 2, -2, 3, -3, 4, -4] values = {} xx = {} ran = 2 + int(len(u_) / mod) + bool(len(u_) // mod) + 14 * \ (1 + int(len(u_) / mod) + bool(len(u_) // mod)) num = 2 + int(len(u_) / mod) + bool(len(u_) // mod) # initializing the dictionary with value equal to 0 and blank spaces as per requirements for i in octs: values[i] = [0] * (ran) values[i][1] = '' for k in range(num - 1): for j in range(5): values[i][j + 14 * k + num] = '' values[i][num + 5] = i xx[i] = 0 octants = [] # dictionary to store position of octant in columns inds = {} inds[1] = num + 6 col[inds[1]] = "From" for i in range(len(octs)): if i > 0: inds[octs[i]] = inds[octs[i - 1]] + 1 # loop to determine the octant and to store the counts of octants # and to store the total transition count p = 1 for i in range(len(u_)): oc = 1 if (u_[i] > 0) and (v_[i] > 0) and (w_[i] > 0): oc = 1 elif (u_[i]) < 0 and (v_[i]) > 0 and (w_[i]) > 0: oc = 2 elif (u_[i]) < 0 and (v_[i]) < 0 and (w_[i]) > 0: oc = 3 elif (u_[i]) > 0 and (v_[i]) < 0 and (w_[i]) > 0: oc = 4 elif (u_[i]) > 0 and (v_[i]) > 0 and (w_[i]) < 0: oc = -1 elif (u_[i]) < 0 and (v_[i]) > 0 and (w_[i]) < 0: oc = -2 elif (u_[i]) < 0 and (v_[i]) < 0 and (w_[i]) < 0: oc = -3 elif (u_[i]) > 0 and (v_[i]) < 0 and (w_[i]) < 0: oc = -4 octants.append(oc) values[oc][0] += 1 values[oc][2 + i // mod] += 1 if i > 0: values[oc][inds[p]] += 1 p = oc # formation and adjustment of octant id column for i in range(3): oc_id.append('') oc_id.append('Overall Transition Count') oc_id.append('') oc_id.append('Count') values[1][num + 4] = "To" for i in range(len(octs)): oc_id.append(octs[i]) p = octants[0] # loop for individual mod range's transition count and table formation for i in range(num - 2): for j in range(3): oc_id.append('') oc_id.append('Mod Transition Count') if i == num - 3: oc_id.append(str(i * mod) + '-' + str(min((i + 1) * mod - 1, len(u) - 1))) else: oc_id.append(str(i * mod) + '-' + str((i + 1) * mod - 1)) values[1][inds[1] + 14 - 2] = "To" col[inds[1] + 14] = "From" oc_id.append("Octant #") for j in octs: oc_id.append(j) for j in octs: values[j][inds[1] + 14 - 1] = j for j in range(mod * (i) + 1, min(mod * (i + 1), len(u_) - 1) + 1): oc = octants[j] if j > 0: values[oc][inds[p] + 14] += 1 p = oc for j in octs: inds[j] += 14 oc_id.extend([''] * (len(u_) - len(oc_id))) # forming the columns required from this tut's output for i in octs: values[i].extend([''] * (len(u_) - len(values[i]))) req1 = [] req2 = [] req3 = {} for i in octs: req3[i] = [] for i in range(len(oc_id)): if i >= num + 4: req1.append(col[i]) req2.append(oc_id[i]) for j in octs: req3[j].append(values[j][i]) blank = [''] * (len(u_)) of['ok1'] = blank req1.extend([''] * (len(u_) - len(req1))) req2.extend([''] * (len(u_) - len(req2))) of['ok2' + col[num + 3]] = req1 of[oc_id[num + 3]] = req2 i = 3 for j in octs: req3[j].extend([''] * (len(u_) - len(req3[j]))) of['ok' + str(i) + values[j][num + 3]] = req3[j] i = i + 1 cols = {} cols[1] = 23 cols[-1] = 24 cols[2] = 25 cols[-2] = 26 cols[3] = 27 cols[-3] = 28 cols[4] = 29 cols[-4] = 30 def tut5(of, f, poss, mod=5000): # try: octant_name_id_mapping = {"1": "Internal outward interaction", "-1": "External outward interaction", "2": "External Ejection", "-2": "Internal Ejection", "3": "External inward interaction", "-3": "Internal inward interaction", "4": "Internal sweep", "-4": "External sweep"} u = of['U'] # assigning a list to columns of input file v = of['V'] w = of['W'] # calculating the avg value sum() returns summation and len() returns length avgu = [round(sum(u) / len(u), 3)] avgv = [round(sum(v) / len(v), 3)] avgw = [round(sum(w) / len(w), 3)] au = round(sum(u) / len(u), 3) av = round(sum(v) / len(v), 3) aw = round(sum(w) / len(w), 3) u_ = [] v_ = [] w_ = [] for i in u: u_.append(round(i - au, 3)) # pushing the element at the end of list using append for i in v: v_.append(round(i - av, 3)) for i in w: w_.append(round(i - aw, 3)) # filling the remaining spaces in the column with blank space using extend avgu.extend([''] * (len(u) - 1)) avgv.extend([''] * (len(u) - 1)) avgw.extend([''] * (len(u) - 1)) try: of["U Avg"] = avgu # creating a column in output file of["V Avg"] = avgv of["W Avg"] = avgw of["U'=U-U avg"] = u_ of["V'=V-V avg"] = v_ of["W'=W-W avg"] = w_ except: print('Error encountered : Mismatch in length of columns') emp = [''] * (len(u_)) col = ['', 'Mod ' + str(mod)] col.extend([''] * (len(u_) - 2)) ranges = (len(u_) + mod - 1) // mod oc_id = ['Overall Count'] # loop for creating the mod range's column for i in range(ranges): if i == ranges - 1: oc_id.append(str(i * mod) + '-' + str(min((i + 1) * mod - 1, len(u) - 1))) else: oc_id.append(str(i * mod) + '-' + str((i + 1) * mod - 1)) octs = [1, -1, 2, -2, 3, -3, 4, -4] values = {} # columns before ranking starts ranks = {} # columns containing ranks rank = [] rank.extend([''] * (len(u_))) name = [] name.extend([''] * (len(u_))) ran = 2 + int(len(u_) / mod) + bool(len(u_) // mod) + 14 * \ (1 + int(len(u_) / mod) + bool(len(u_) // mod)) num = 1 + int(len(u_) / mod) + bool(len(u_) // mod) # initializing the dictionary with value equal to 0 and blank spaces as per requirements for i in octs: values[i] = [''] * (len(u_)) values[i] = [0] * (num) ranks[i] = [''] * (len(u_)) ranks[i] = [0] * (num) octants = [] # loop to determine the octant and to store the counts of octants # and to store the total transition count for i in range(len(u_)): oc = 1 if (u_[i] > 0) and (v_[i] > 0) and (w_[i] > 0): oc = 1 elif (u_[i]) < 0 and (v_[i]) > 0 and (w_[i]) > 0: oc = 2 elif (u_[i]) < 0 and (v_[i]) < 0 and (w_[i]) > 0: oc = 3 elif (u_[i]) > 0 and (v_[i]) < 0 and (w_[i]) > 0: oc = 4 elif (u_[i]) > 0 and (v_[i]) > 0 and (w_[i]) < 0: oc = -1 elif (u_[i]) < 0 and (v_[i]) > 0 and (w_[i]) < 0: oc = -2 elif (u_[i]) < 0 and (v_[i]) < 0 and (w_[i]) < 0: oc = -3 elif (u_[i]) > 0 and (v_[i]) < 0 and (w_[i]) < 0: oc = -4 octants.append(oc) values[oc][0] += 1 values[oc][1 + i // mod] += 1 # formation and adjustment of octant id column for i in range(3): oc_id.append('') try: of['Octant'] = octants of[' '] = emp of[''] = col # forming a column in output file except: print('Error encountered : Mismatch in length of columns') oc_id.extend([''] * (len(u_) - len(oc_id))) of['Octant ID'] = oc_id cnt = {} for i in octs: cnt[i] = 0 #loop to calculate rank of each octant for each mod range and assignment of the values for i in range(num): seq = [] for j in octs: seq.append([values[j][i], j]) seq.sort() for j in range(len(seq)): ranks[seq[j][1]][i] = 8 - j rank[i] = seq[len(seq) - 1][1] poss.append([rank[i], i]) name[i] = octant_name_id_mapping[str(rank[i])] if i != 0: cnt[rank[i]] = cnt[rank[i]] + 1 for i in range(1): ranks[4].append('') ranks[-4].append('') ranks[4].append('Octant ID') ranks[-4].append('Octant Name') rank[num + 1] = 'Count of Rank 1 Mod values' # representation of name of each octant and count of rank 1 value j = num + 2 for i in octs: ranks[4].append(str(i)) ranks[-4].append(octant_name_id_mapping[str(i)]) rank[j] = cnt[i] j = j + 1 #count of each octant in each mod range for i in octs: values[i].extend([''] * (len(u_) - len(values[i]))) of[str(i)] = values[i] #rank columns of each octant for i in octs: ranks[i].extend([''] * (len(u_) - len(ranks[i]))) of['Rank Octant ' + str(i)] = ranks[i] #forming the output columns of['Rank1 Octant ID'] = rank of['Rank1 Octant Name'] = name opdir = 'output' def tut7(f): # forming the output directory if not present if not os.path.exists(opdir): os.makedirs(opdir) # for f in files: # if ('input/' + f)[-4:] == 'xlsx': # reading the input file df = pd.read_excel(f) of = df u = of['U'] num = 2 + int(len(u) / mod) + bool(len(u) // mod) # calling the required functions poss = [] tut5(of, f, poss, mod) tut2(of, mod) cnt = int(tut4(of)) heads = [] c = 33 while c <= 43: if c != 35: heads.append(c) c = c+1 # forming a dataframe in openpyxl from pandas dataframes wb = Workbook() sheet = wb.active for r in dataframe_to_rows(df, index=False, header=True): sheet.append(r) yellow = "00FFFF00" # coloring and bordering the required cells using openpxyl's # patternfill and border function for i in range(len(poss)): c = cols[poss[i][0]] r = int(poss[i][1]+2) sheet.cell(row=r, column=c).fill = PatternFill( patternType="solid", fgColor=yellow) for i in range(len(heads)): sheet.cell(row=1, column=heads[i]).value = ' ' c = 14 borcol = [] while c <= 32: borcol.append(c) c = c+1 black = '000000' thin_border = Border(left=Side(style='thin', color=black), right=Side(style='thin', color=black), top=Side(style='thin', color=black), bottom=Side(style='thin', color=black)) for i in range(len(borcol)): for j in range(num): sheet.cell(row=j+1, column=borcol[i]).border = thin_border for i in range(9): sheet.cell(row=num + 2 + i, column=29).border = thin_border sheet.cell(row=num + i + 2, column=30).border = thin_border sheet.cell(row=num + i + 2, column=31).border = thin_border borcol = [] c = 35 while c <= 43: borcol.append(c) c = c+1 ran = int(len(u)/mod)+bool(len(u) % mod)+1 row = 0 for k in range(ran): row = row+2 for i in range(len(borcol)): for j in range(9): sheet.cell( row=row+1+j, column=borcol[i]).border = thin_border row = row+12 c = 44 while c <= 46: c = c+1 for i in range(9): sheet.cell(row=i + 1, column=c).border = thin_border for i in range(cnt+1): sheet.cell(row=1 + i, column=49).border = thin_border sheet.cell(row=i+1, column=50).border = thin_border sheet.cell(row=i+1, column=51).border = thin_border # forming the required output file by saving openpyxl dataframe wb.save(os.path.join( opdir, f.name[0:-4] + '_octant_analysis_mod_' + str(mod) + '.xlsx')) st.title('Get output file of CS384-2022 tut-7 for free') f=[] f = st.sidebar.file_uploader('Upload your input file in xlsx format', accept_multiple_files=True ) # f = st.file_uploader('Upload your input file in xlsx format', accept_multiple_files=True) from zipfile import ZipFile mod=0 if f is not None: mod=int(st.number_input('Please enter mod value')) if mod!=0: if st.button('Compute'): cnt=100/len(f) num=0 bar=st.progress(num) for files in f: num+=cnt bar.progress(int(num)) # print(files.name) tut7(files) else: st.warning('Mod cannot be zero') st.title('') st.write('Output files ready for download👇') opdir="output" for files in os.listdir(opdir): # print(files) st.download_button("Download "+(files), os.path.join(opdir,files), file_name=files) st.title('') st.write("Thank us later✌") # with ZipFile('my_python_files.zip','w') as zip: # # writing each file one by one # opdir="output" # for file in opdir: # zip.write(file) # print('All files zipped successfully!') # pipreqs opdir