PythonProject / app.py
atriguha's picture
Update app.py
525ae00
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