Coverage for separarSalasCompostasEHorarios.py: 94%
106 statements
« prev ^ index » next coverage.py v7.1.0, created at 2023-02-02 11:17 -0300
« prev ^ index » next coverage.py v7.1.0, created at 2023-02-02 11:17 -0300
1import pandas as pd # biblioteca utilizada para dataframe
2import re # biblioteca utilizada para expressoes regulares
4def adicionarLinhasPorHorarioComSalasSeparadas(dataframe):
5# funcao que chama os metodos que separam os horarios por credito e as salas compostas em salas simples
7 dfTempLinhasNovas = pd.DataFrame()
8 dfTempLinhasNovas = pd.DataFrame(columns=['codigNomeMateria', 'codigoTurma', 'ano', 'semestre', 'professor', 'cargahoraria', 'horario', 'vagasOfertadas', 'vagasOcupadas', 'local','salaSeparada', 'predio','lotacao', 'horarioSeparado', 'percDisciplina', 'percOcupacaoReal','percOcupacaoTotal'])
10 for indiceDataframe, linhaDataframe in dataframe.iterrows():
11 horariosSeparados = separarHorarios(linhaDataframe["horario"])
12 locaisSeparados = separarSalas(linhaDataframe["local"])
13 qtdeSalasOcupadas = len(locaisSeparados)
14 qtdeHorariosSeparados = len(horariosSeparados)
16 if qtdeSalasOcupadas == 1:
17 for horario in horariosSeparados:
18 linhaDfCopia = linhaDataframe.copy()
19 linhaDfCopia["horarioSeparado"] = horario
20 linhaDfCopia["salaSeparada"] = locaisSeparados[0]
21 dfTempLinhasNovas.loc[len(dfTempLinhasNovas)] = linhaDfCopia
23 # para turmas com duas salas e 4 creditos, pressupoe-se que as salas
24 # estejam na ordem dos dias da semana do horario
25 # exemplo: 24T23 - I9 e S7 -> 2T2 e 2T3 na I9 e
26 # 4T2 e 4T3 na S7
27 if qtdeSalasOcupadas == 2 and qtdeHorariosSeparados == 4:
28 linhaDfCopia = linhaDataframe.copy()
29 linhaDfCopia["horarioSeparado"] = horariosSeparados[0]
30 linhaDfCopia["salaSeparada"] = locaisSeparados[0]
31 dfTempLinhasNovas.loc[len(dfTempLinhasNovas)] = linhaDfCopia
32 linhaDfCopia = linhaDataframe.copy()
33 linhaDfCopia["horarioSeparado"] = horariosSeparados[1]
34 linhaDfCopia["salaSeparada"] = locaisSeparados[0]
35 dfTempLinhasNovas.loc[len(dfTempLinhasNovas)] = linhaDfCopia
36 linhaDfCopia = linhaDataframe.copy()
37 linhaDfCopia["horarioSeparado"] = horariosSeparados[2]
38 linhaDfCopia["salaSeparada"] = locaisSeparados[1]
39 dfTempLinhasNovas.loc[len(dfTempLinhasNovas)] = linhaDfCopia
40 linhaDfCopia = linhaDataframe.copy()
41 linhaDfCopia["horarioSeparado"] = horariosSeparados[3]
42 linhaDfCopia["salaSeparada"] = locaisSeparados[1]
43 dfTempLinhasNovas.loc[len(dfTempLinhasNovas)] = linhaDfCopia
45 return dfTempLinhasNovas
46# fim metodo adicionarLinhasPorHorario
48def separarHorarios(horario):
49# Dado uma string horario no padrao [DIAS_DA_SEMANA][PERIODO][HORARIOS]
50# é retornado uma lista do horario separado por hora
51# [DIAS_DA_SEMANA] 2-7
52# [PERIODO] manha = M, tarde = T, e noite = N
53# [HORARIO] 1 a 5
54# exemplo horario = 26T23
55# retorno = ['2T2 - Segunda 14h', '2T3 - Segunda 15h', '6T2 - Sexta 14h', '6T3 - Sexta 15h']
57 horariosDecompostos = horario.split()
58 horariosSeparados = []
59 for indiceH in horariosDecompostos:
60 horarioContemTurno = re.search("^(\d+)([M|T|N])(\d+)", indiceH) # encontra o M ou T ou N
61 if horarioContemTurno:
62 dias = [int(horarioContemTurno) for horarioContemTurno in horarioContemTurno.group(1)]
63 turno = horarioContemTurno.group(2)
64 horas = [int(horarioContemTurno) for horarioContemTurno in horarioContemTurno.group(3)]
65 for cadaDia in dias:
66 if cadaDia == 2:
67 cadaDiaTraduzido = 'Segunda'
68 elif cadaDia == 3:
69 cadaDiaTraduzido = 'Terça'
70 elif cadaDia == 4:
71 cadaDiaTraduzido = 'Quarta'
72 elif cadaDia == 5:
73 cadaDiaTraduzido = 'Quinta'
74 elif cadaDia == 6:
75 cadaDiaTraduzido = 'Sexta'
76 elif cadaDia == 7:
77 cadaDiaTraduzido = 'Sábado'
78 else:
79 cadaDiaTraduzido = 'dia'
80 for cadaHora in horas:
81 if (turno == 'M' and cadaHora == 1):
82 cadaHoraTraduzida = '08h'
83 elif (turno == 'M' and cadaHora == 2):
84 cadaHoraTraduzida = '09h'
85 elif (turno == 'M' and cadaHora == 3):
86 cadaHoraTraduzida = '10h'
87 elif (turno == 'M' and cadaHora == 4):
88 cadaHoraTraduzida = '11h'
89 elif (turno == 'M' and cadaHora == 5):
90 cadaHoraTraduzida = '12h'
91 elif (turno == 'T' and cadaHora == 1):
92 cadaHoraTraduzida = '13h'
93 elif (turno == 'T' and cadaHora == 2):
94 cadaHoraTraduzida = '14h'
95 elif (turno == 'T' and cadaHora == 3):
96 cadaHoraTraduzida = '15h'
97 elif (turno == 'T' and cadaHora == 4):
98 cadaHoraTraduzida = '16h'
99 elif (turno == 'T' and cadaHora == 5):
100 cadaHoraTraduzida = '17h'
101 elif (turno == 'T' and cadaHora == 6):
102 cadaHoraTraduzida = '18h'
103 elif (turno == 'N' and cadaHora == 1):
104 cadaHoraTraduzida = '19h'
105 elif (turno == 'N' and cadaHora == 2):
106 cadaHoraTraduzida = '20h'
107 elif (turno == 'N' and cadaHora == 3):
108 cadaHoraTraduzida = '21h'
109 elif (turno == 'N' and cadaHora == 4):
110 cadaHoraTraduzida = '22h'
111 else:
112 cadaHoraTraduzida = 'hora'
113 horariosSeparados.append(f'{cadaDia}{turno}{cadaHora} - {cadaDiaTraduzido} {cadaHoraTraduzida}')
115 return horariosSeparados
116# fim metodo separarHorario
118def separarSalas(local):
119# funcao que troca o nome da sala coletado pelo nome tabelado (padronizado) e
120# separa as salas quando houver mais de uma sala na mesma turma (salas compostas)
122 matrizDeEquivalenciaNomeSalaPadronizado = (
123 ['I-2','I01'], ['I-2','I02'], ['I-3','I03'], ['I-4','I04'], ['I-5','I05'], ['I-6','I06'], ['I-7','I07'], ['I-8','I08'], ['I-9','I09'], ['I-10','I10'],
124 ['I1','I01'], ['I2','I02'], ['I3','I03'], ['I4','I04'], ['I5','I05'], ['I6','I06'], ['I7','I07'], ['I8','I08'], ['I9','I09'], ['I10','I10'],
125 ['I01','I01'], ['I02','I02'], ['I03','I03'], ['I04','I04'], ['I05','I05'], ['I06','I06'], ['I07','I07'], ['I08','I08'], ['I09','I09'], ['I010','I10'],
126 ['I-01','I01'], ['I-02','I02'], ['I-03','I03'], ['I-04','I04'], ['I-05','I05'], ['I-06','I06'], ['I-07','I07'], ['I-08','I08'], ['I-09','I09'], ['I-010','I10'],
127 ['S-1','S01'], ['S-2','S02'], ['S-3','S03'], ['S-4','S04'], ['S-5','S05'], ['S-6','S06'], ['S-7','S07'], ['S-8','S08'], ['S-9','S09'], ['S-10','S10'],
128 ['S1','S01'], ['S2','S02'], ['S3','S03'], ['S4','S04'], ['S5','S05'], ['S6','S06'], ['S7','S07'], ['S8','S08'], ['S9','S09'], ['S10','S10'],
129 ['S01','S01'], ['S02','S02'], ['S03','S03'], ['S04','S04'], ['S05','S05'], ['S06','S06'], ['S07','S07'], ['S08','S08'], ['S09','S09'], ['S010','S10'],
130 ['S-01','S01'], ['S-02','S02'], ['S-03','S03'], ['S-04','S04'], ['S-05','S05'], ['S-06','S06'], ['S-07','S07'], ['S-08','S08'], ['S-09','S09'], ['S-010','S10'],
131 ['ANFITEATRO','Anfiteatro'], ['ANTE SALA I10','Ante I-10'], ['MULTIUSO','Multi.'], ['LAB NEI 2','Lab.NEI-2'], ['LAB NEI','Lab.NEI-1'],
132 ['LAB QUI','Lab.Quim.'], ['LAB QUIM','Lab.Quim.'], ['LAB QUIMICA','Lab.Quim.'],
133 ['LAB SS','Lab.SS'], ['Lab SS','Lab.SS'], ['LAB FIS','Lab.Fis-1'], ['LAB FISICA','Lab.Fis-1'], ['LAB OND','Lab.Ond'], ['LAB ELET','Lab.Eletr.'],
134 ['LAB ELETR','Lab.Eletr.'], ['LAB MAT','Lab.Mater.'], ['MOCAP','Mocap'], ['LAB TERMOFLUIDOS','Lab.Termoflui.'],
135 ['LAB TERMODINÂMICA','Lab.Termodin.'], ['LAB LDS','Lab.LDS'], ['CONTEINER 4','Cont-4'], ['CONTEINER 04','Cont-4'],
136 ['LAB SHP','Cont-8-SHP'], ['CONTAINER Nº 17','Cont-17'], ['LDTEA SALA 2','LD.Sala-2'], ['SALA 2','LD.Sala-2'],
137 ['LDTEA SALA 3','LD.Sala-3'], ['SALA 3','LD.Sala-3'])
139 locaisContemSala = re.findall('[SI]\d+|[SI]-\d+|[SI]0\d+|[SI]-0\d+|TESTE|ANTE SALA I10|LAB NEI 2|LAB NEI|LAB SS|Lab SS|LAB MAT|LAB SHP|LAB ELETR|LAB ELET|MOCAP|LAB OND|LAB FISICA|LAB QUI|LAB QUIMICA|LAB TERMOFLUIDOS|LAB TERMODI\w+|ANFITEATRO|MULTIUSO|CONTEINER \d+\d+|CONTAINER \d+\d+|CONTEINER Nº \d+\d+|CONTAINER Nº \d+\d+|SALA \d+',local)
140 qtdeSalasOcupadas = len(locaisContemSala)
142 encontrouNomePadraoSala = False
144 for indiceQtdeSalas in range(qtdeSalasOcupadas):
145 for indiceLinhaMatriz in range(len(matrizDeEquivalenciaNomeSalaPadronizado)):
146 if locaisContemSala[indiceQtdeSalas] == matrizDeEquivalenciaNomeSalaPadronizado[indiceLinhaMatriz][0]:
147 locaisContemSala[indiceQtdeSalas] = matrizDeEquivalenciaNomeSalaPadronizado[indiceLinhaMatriz][1]
148 encontrouNomePadraoSala = True
149 break
151 if encontrouNomePadraoSala == False:
152 locaisContemSala[indiceQtdeSalas] = 'sala nao padronizada na matriz de comparacao - ' + locaisContemSala[indiceQtdeSalas]
154 return locaisContemSala
155# fim metodo separarSala
157'''
158if __name__ == '__main__':
159# main - para testes isolados de cada metodo
161 dfTurmasColetadasFGA = pd.read_csv('./testesUnitarios/csvTurmasColetadasFGA.csv', encoding="utf-8", sep=';')
163 dfTurmasColetadasFGA = adicionarLinhasPorHorarioComSalasSeparadas(dfTurmasColetadasFGA)
165 dfTurmasColetadasFGA.to_csv('./testesUnitarios/csvTesteSalasHorariosSeparadas.csv', encoding="utf-8", sep=';', index = False)
166# fim main
167'''