Skip to content
Snippets Groups Projects
course_analysis.py 11.9 KiB
Newer Older
bhm15's avatar
bhm15 committed
# -*- coding: utf-8 -*-
from datetime import datetime
import pprint
import pandas as pd
import json
import numpy as np
from script.utils.situations import Situation as sit
def grafico(df,lista_disciplinas): 
Odair Mario's avatar
Odair Mario committed
			for disciplina in lista_disciplinas.keys() :
				qtd_aluno = lista_disciplinas[disciplina]["qtd_alunos"] 
				dic = {"00-4.9":0.0 , "05-9.9":0.0 , "10-14.9":0.0 , "15-19.9":0.0 , "20-24.9":0.0 , "25-29.9":0.0 , "30-34.9":0.0 ,
					   "35-39.9":0.0 , "40-44.9":0.0 , "45-49.9":0.0 , "50-54.9":0.0 , "55-59.9":0.0 , "60-64.9":0.0 , "65-69.9":0.0 ,
					   "70-74.9":0.0 , "75-79.9":0.0 , "80-84.9":0.0 , "85-89.9":0.0 , "90-94.9":0.0 ,"95-100": 0.0}
				disciplina_df = df.loc[df.COD_ATIV_CURRIC == disciplina] 
				disci_lista = [] 
				for i in disciplina_df.iterrows():
					nota = 0.0 if i[1].MEDIA_FINAL > 100 else i[1].MEDIA_FINAL 
					for key in dic.keys():
						a = key.split('-') 
						value_min = float(a[0])  
						value_max = float(a[1])  
						if((nota >= value_min) and (nota <= value_max)): 
							dic[key] += float(nota)   
							break;
				for j in dic.keys():
					disci_lista.append([j, 0.0 if qtd_aluno == 0 else dic[j] / qtd_aluno])

				lista_disciplinas[disciplina]["compara_nota"]  = disci_lista
bhm15's avatar
bhm15 committed




def informacoes_gerais(df,lista_disciplinas):
Odair Mario's avatar
Odair Mario committed
	#quantidade de matriculas
	disciplinas = df.groupby(["COD_ATIV_CURRIC"]).size()  
	for disciplina in disciplinas.index:
		disciplina_dict = {} 
		disciplina_df = df.loc[df.COD_ATIV_CURRIC == disciplina] 
		disciplina_dict["qtd_alunos"] = int(disciplinas[disciplina])   
		disciplina_dict["disciplina_codigo"] = disciplina 
		disciplina_dict["disciplina_nome"] = \
		disciplina_df.NOME_ATIV_CURRIC.values[0]	
		lista_disciplinas[disciplina] = disciplina_dict 
bhm15's avatar
bhm15 committed
def conhecimento(qtd,disciplina_dict):
Odair Mario's avatar
Odair Mario committed
	conheci_df = qtd.loc[(qtd.SITUACAO == sit.SIT_CONHECIMENTO_APROVADO) |
			(qtd.SITUACAO == sit.SIT_CONHECIMENTO_REPROVADO)] 
	total_conheci = conheci_df.qtd.sum() 
	if np.isnan(total_conheci):
		total_conheci = 0
	conheci_aprov = conheci_df.loc[conheci_df.SITUACAO == \
			sit.SIT_CONHECIMENTO_APROVADO].set_index("COD_ATIV_CURRIC" ) 
	disciplina_dict["qtd_conhecimento"] = int(total_conheci)

	if (total_conheci !=0) and (not conheci_aprov.empty):
		disciplina_dict["taxa_conhecimento"] = float(conheci_aprov.qtd.values[0] /
				total_conheci)
	else:
		disciplina_dict["taxa_conhecimento"] = 0.0
bhm15's avatar
bhm15 committed

def trancamento(qtd,disciplina_dict,qtd_matr):
Odair Mario's avatar
Odair Mario committed
	trancamento_df = qtd.loc[(qtd.SITUACAO == sit.SIT_TRANCAMENTO_ADMINISTRATIVO) | 
						(qtd.SITUACAO == sit.SIT_TRANCAMENTO_TOTAL) | 
						(qtd.SITUACAO == sit.SIT_CANCELADO)] 
	qtd_tranc = trancamento_df.qtd.sum() 
	if np.isnan(qtd_tranc):
		qtd_tranc = 0
	disciplina_dict["qtd_trancamento"] = int(qtd_tranc) 
	disciplina_dict["taxa_trancamento"] = float(qtd_tranc / qtd_matr) if qtd_matr else 0.0
bhm15's avatar
bhm15 committed

 
def reprovacao(qtd,disciplina,qtd_matr,taxa_reprov_absoluta,taxa_reprov_freq): 
Odair Mario's avatar
Odair Mario committed
	"""existem as analises reprovacao absoluta, reprovacao por frequencia,	
	reprovacao absoluta, reprovacao por frequencia da ultima vez que a
	disciplina foi ofertada, a logica das analise sao a mesma so muda os valores
	do dataframe qtd e o nomes das chaves do dicionario,logo é possível reaproveitar
	o mesmo codigo para fazer analise geral e da ultima vez que foi ofertado.""" 
	sit_reprov = sit.SITUATION_FAIL + (sit.SIT_REPROVADO_SEM_NOTA,)
	reprov_df = qtd.loc[(qtd.SITUACAO == sit_reprov[0]) |
						(qtd.SITUACAO == sit_reprov[1]) |
						(qtd.SITUACAO == sit_reprov[2]) |
						(qtd.SITUACAO == sit_reprov[3]) ]
	qtd_reprov_abso = reprov_df.qtd.sum() #quantidade de reprovacao absoluta
	qtd_reprov_freq = reprov_df.loc[reprov_df.SITUACAO == sit_reprov[1]] 
	if qtd_matr != 0:
		if np.isnan(qtd_reprov_abso): 
			disciplina[taxa_reprov_absoluta] = 0.0
		else:
			disciplina[taxa_reprov_absoluta] = float(qtd_reprov_abso / qtd_matr)

		if qtd_reprov_freq.empty:
			disciplina[taxa_reprov_freq] = 0.0 
		else:
			disciplina[taxa_reprov_freq] = float(qtd_reprov_freq.qtd.values[0] / qtd_matr)

	else:
		disciplina[taxa_reprov_absoluta] = 0.0
		disciplina[taxa_reprov_freq] = 0.0 
bhm15's avatar
bhm15 committed

def nota(notas_df,disciplina,index):
Odair Mario's avatar
Odair Mario committed
	notas = [] 
	for i in notas_df.iterrows():
		if i[1].SITUACAO in sit.SITUATION_AFFECT_IRA:
			nota = 0 if np.isnan(i[1].MEDIA_FINAL) else i[1].MEDIA_FINAL	 
			#alguns valores de media_final não são confiaveis na tabela .33
			nota = 0 if nota > 100 else nota 
			notas.append(nota) 

	if len(notas) != 0: 
		notas_np = np.array(notas) 
		media_np = np.mean(notas_np) 
		desvio_np = np.std(notas_np) 
		media = 0.0 if np.isnan(media_np) else media_np 
		desvio = 0.0 if np.isnan(desvio_np) else desvio_np 
		disciplina[index] = [media,desvio]	
	else:
		disciplina[index] = [0.0,0.0]  
bhm15's avatar
bhm15 committed


def analises_gerais(df,lista_disciplinas):
Odair Mario's avatar
Odair Mario committed
	qtd_geral= df.groupby(["COD_ATIV_CURRIC","SITUACAO"]).size().reset_index(name="qtd" ) 
	qtd_ultimo_geral = \
	df.groupby(["COD_ATIV_CURRIC","SITUACAO","ANO"]).size().reset_index(name="qtd")  
	matr_por_semestre = \
	df.groupby(["COD_ATIV_CURRIC","ANO"]).size().reset_index(name="matr") 
	""" dataframe com a quantidade de matriculas por periodo e ano, por exemplo
	disciplina ci055 2010/1 teve x matriculas""" 
	"""Dataframes relacionado a notas.O campo qtd é inutil, o groupby pede se
	que se use um apply sobre o groupby, pois se não o grouby é tratado como
	objeto e não como um dataframe	""" 
	nota_geral_df = df.groupby(["COD_ATIV_CURRIC","MEDIA_FINAL", "SITUACAO",
			]).size().reset_index(name = "qtd" )  
	nota_semestral_df = df.groupby(["COD_ATIV_CURRIC","ANO", "MEDIA_FINAL", "SITUACAO",
			]).size().reset_index(name = "qtd" )  
	for disciplina in lista_disciplinas.keys():
		disciplina_dict = {} #facilitar os calculos 
bhm15's avatar
bhm15 committed

Odair Mario's avatar
Odair Mario committed
		qtd  = qtd_geral.loc[qtd_geral.COD_ATIV_CURRIC == disciplina] 
bhm15's avatar
bhm15 committed

Odair Mario's avatar
Odair Mario committed
		disciplina_semestral = qtd_ultimo_geral.loc[qtd_ultimo_geral.COD_ATIV_CURRIC == \
				disciplina] 
bhm15's avatar
bhm15 committed

Odair Mario's avatar
Odair Mario committed
		ano = datetime.now().year - 1
bhm15's avatar
bhm15 committed

Odair Mario's avatar
Odair Mario committed
		qtd_ultimo = disciplina_semestral.loc[disciplina_semestral.ANO == ano] 
bhm15's avatar
bhm15 committed


Odair Mario's avatar
Odair Mario committed
		#quantidade de alunos
		qtd_matriculas = lista_disciplinas[disciplina]["qtd_alunos"]  
bhm15's avatar
bhm15 committed


Odair Mario's avatar
Odair Mario committed
		#qtd é um dataframe que contem a ocorrencia de cada situacao
		qtd  = qtd_geral.loc[qtd_geral.COD_ATIV_CURRIC == disciplina] 
bhm15's avatar
bhm15 committed

Odair Mario's avatar
Odair Mario committed
		#faz analises relacionada ao conhecimento
		conhecimento(qtd,disciplina_dict) 
bhm15's avatar
bhm15 committed

Odair Mario's avatar
Odair Mario committed
		# faz analises relacionada ao trancamento
		trancamento(qtd,disciplina_dict,qtd_matriculas) 
bhm15's avatar
bhm15 committed

Odair Mario's avatar
Odair Mario committed
		# faz analises relacionada a reprovacoes
		reprovacao(qtd,disciplina_dict,qtd_matriculas,"taxa_reprovacao_absoluta","taxa_reprovacao_frequencia") 
		qtd_matr_ultimo = matr_por_semestre.loc[(matr_por_semestre.COD_ATIV_CURRIC \
			== disciplina) & matr_por_semestre.ANO == ano]
bhm15's avatar
bhm15 committed

Odair Mario's avatar
Odair Mario committed
		if qtd_matr_ultimo.empty: #caso a disciplina nao foi ofertada no ultimo ano
			disciplina_dict["taxa_reprovacao_ultimo_absoluta"] = -1  
			disciplina_dict["taxa_reprovacao_ultimo_frequencia"] = -1  
		else:
			reprovacao(qtd_ultimo,disciplina_dict,qtd_matriculas,"taxa_reprovacao_ultimo_absoluta",
					"taxa_reprovacao_ultimo_frequencia") 
bhm15's avatar
bhm15 committed

Odair Mario's avatar
Odair Mario committed
		#faz as analises relacionada a nota
		nota_df = nota_geral_df.loc[nota_geral_df.COD_ATIV_CURRIC == disciplina] 
		nota_por_semestre_df = nota_semestral_df.loc[nota_semestral_df.COD_ATIV_CURRIC == disciplina] 
		nota_ultimo = nota_por_semestre_df.loc[nota_por_semestre_df.ANO ==
				ano] 
bhm15's avatar
bhm15 committed

Odair Mario's avatar
Odair Mario committed
		nota(nota_df,disciplina_dict,"nota") 
		if nota_ultimo.empty:
			disciplina_dict["nota_ultimo_ano"] = -1 
		nota(nota_ultimo,disciplina_dict,"nota_ultimo_ano") 
bhm15's avatar
bhm15 committed


Odair Mario's avatar
Odair Mario committed
		lista_disciplinas[disciplina].update(disciplina_dict)
#	*cursada ate a aprovacao
bhm15's avatar
bhm15 committed
def analises_semestrais(df,lista_disciplinas):
Odair Mario's avatar
Odair Mario committed
	# [ ] -> nota media de aprovaçao 
	geral_df = \
	df.groupby(["COD_ATIV_CURRIC","ANO","PERIODO"]).size().reset_index(name
			= "matr" ) 
	df_semestral = df.groupby(["COD_ATIV_CURRIC", "ANO", "PERIODO" ,
	   "SITUACAO"]).size().reset_index(name = "qtds" ) 
	disciplinas = {} 
	for i in df_semestral.iterrows(): # percorre o dataframe
		disciplina = i[1].COD_ATIV_CURRIC #nome da disciplina
		if not(disciplina in disciplinas):
			disciplinas[disciplina] = {} 

		# para chave do dicionario ser do formato ano/periodo
		ano = str(int(i[1].ANO)) 
		periodo = str(i[1].PERIODO)   
		periodo_curso = ano+"/"+periodo # chave do dicionario

		situacao = i[1].SITUACAO 
		#verifica se a chave ano/periodo exitste no dicionario
		if not(periodo_curso in disciplinas[disciplina] ): 
			disciplinas[disciplina][periodo_curso]	= [0,0] #qtd aprovado,total
				
		# se a situacao for igual a aprovado entao qtd de aprovados em
		# ano/periodo +1
		if situacao in sit.SITUATION_PASS:
			disciplinas[disciplina][periodo_curso][0] += 1 # qtd de aprovados
		
		#quantidade total de matriculas no periodo ano/periodo
		disciplinas[disciplina][periodo_curso][1] += 1

	for disciplina in disciplinas.keys(): 
		for ano_periodo in disciplinas[disciplina].keys():	
			qtd_total = disciplinas[disciplina][ano_periodo][1]
			qtd_aprovados = disciplinas[disciplina][ano_periodo][0]
			#calcula a taxa de aprovacao por semestre, qtd_aprov/qtd_total 
			if qtd_total != 0:
				disciplinas[disciplina][ano_periodo][0] = qtd_aprovados / qtd_total
			else:
				disciplinas[disciplina][ano_periodo][0] = 0.0
				
		aprovacao_semestral = disciplinas[disciplina]	
		lista_disciplinas[disciplina]["aprovacao_semestral"] = aprovacao_semestral
bhm15's avatar
bhm15 committed
def transforma_json(lista_disciplinas):
Odair Mario's avatar
Odair Mario committed
	for disciplina in lista_disciplinas.keys():
		disciplina_dict =lista_disciplinas[disciplina] 
		with open('cache/'+disciplina+'.json','w') as f:
			f.write(json.dumps(lista_disciplinas[disciplina],indent=4))
bhm15's avatar
bhm15 committed
def listagem_disciplina(df,lista_disciplinas):
Odair Mario's avatar
Odair Mario committed
	listagem = {} 
	compara_aprov = {} 
	compara_nota = {} 
	cache = {} 
	disciplinas = {} 
	# nota media de todas as disciplinas
	trancamento = []
	reprovacao = []
	conhecimento = []
	nota= [] # lista que contem todas as notas medias de todas as disciplinas
	nota_desvio = [] # lista que contem todos os desvio padrao de todas as disciplinas 
	grafico(df,lista_disciplinas) 

	for disciplina in lista_disciplinas.keys(): 
		disciplina_dict = lista_disciplinas[disciplina] 
		cache[disciplina] = {
			"name": disciplina_dict["disciplina_nome"],
			"nota": disciplina_dict["nota"],
			"taxa_reprovacao_absoluta": disciplina_dict["taxa_reprovacao_absoluta"],
			"taxa_reprovacao_frequencia": disciplina_dict["taxa_reprovacao_frequencia"],
			"taxa_trancamento": disciplina_dict["taxa_trancamento"]
		}
Odair Mario's avatar
Odair Mario committed
		compara_disciplina = [] 
		compara_nota[disciplina]= lista_disciplinas[disciplina]["compara_nota"]  
		#calcula aprovacao semestral
		for ano in disciplina_dict["aprovacao_semestral"].keys():  
			aprov_por_ano = [ano,disciplina_dict["aprovacao_semestral"][ano][0]] 
			compara_disciplina.append(aprov_por_ano) 

		compara_aprov[disciplina] = compara_disciplina 
		disciplinas[disciplina] = disciplina_dict["disciplina_nome"]  

		# pega todas as taxas adiciona em uma lista, que depois será tranformada
		# em numpy array para poder uutilizar os metodos np.mean e np.std
		conhecimento.append(disciplina_dict["taxa_conhecimento"])
		trancamento.append(disciplina_dict["taxa_trancamento" ])
		reprovacao.append(disciplina_dict["taxa_reprovacao_absoluta" ])
		nota.append(disciplina_dict["nota"][0])  

	#nota
	nota_np = np.array(nota) 
	nota_media= np.mean(nota_np) 
	nota_desvio= np.std(nota_np) 
	#trancamento
	trancamento_np = np.array(trancamento) 
	trancamento_media = np.mean(trancamento_np) 
	trancamento_desvio = np.std(trancamento_np) 
	#conhecimento
	conhecimento_np = np.array(trancamento) 
	conhecimento_media = np.mean(trancamento_np) 
	conhecimento_desvio = np.std(trancamento_np) 
	#reprovacao
	reprovacao_np = np.array(trancamento) 
	reprovacao_media = np.mean(trancamento_np) 
	reprovacao_desvio = np.std(trancamento_np) 

	#verificar se o resultado final não é nan

	listagem = { "cache" : cache,
			"compara_aprov":  compara_aprov,
			"compara_nota": compara_nota, 
			"disciplinas": disciplinas,
			"taxa_conhecimento":[float(conhecimento_media),float(conhecimento_desvio)] ,
			"taxa_trancamento":[float(trancamento_media),float(trancamento_desvio)] ,
			"taxa_reprovacao":[float(reprovacao_media),float(reprovacao_desvio)] ,
			"nota": [float(nota_media),float(nota_desvio)] 
			} 
	return listagem