Coverage for separarSalasCompostasEHorarios.py: 94%

106 statements  

« 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 

3 

4def adicionarLinhasPorHorarioComSalasSeparadas(dataframe): 

5# funcao que chama os metodos que separam os horarios por credito e as salas compostas em salas simples 

6 

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']) 

9 

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) 

15 

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 

22 

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 

44 

45 return dfTempLinhasNovas 

46# fim metodo adicionarLinhasPorHorario 

47 

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'] 

56 

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}') 

114 

115 return horariosSeparados 

116# fim metodo separarHorario 

117 

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) 

121 

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']) 

138 

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) 

141 

142 encontrouNomePadraoSala = False 

143 

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 

150 

151 if encontrouNomePadraoSala == False: 

152 locaisContemSala[indiceQtdeSalas] = 'sala nao padronizada na matriz de comparacao - ' + locaisContemSala[indiceQtdeSalas] 

153 

154 return locaisContemSala 

155# fim metodo separarSala 

156 

157''' 

158if __name__ == '__main__': 

159# main - para testes isolados de cada metodo 

160  

161 dfTurmasColetadasFGA = pd.read_csv('./testesUnitarios/csvTurmasColetadasFGA.csv', encoding="utf-8", sep=';')  

162  

163 dfTurmasColetadasFGA = adicionarLinhasPorHorarioComSalasSeparadas(dfTurmasColetadasFGA) 

164  

165 dfTurmasColetadasFGA.to_csv('./testesUnitarios/csvTesteSalasHorariosSeparadas.csv', encoding="utf-8", sep=';', index = False) 

166# fim main 

167'''