Commit d17e6f05 authored by Odair Mario's avatar Odair Mario
Browse files

Merge remote-tracking branch 'origin/course'

parents 72c42ec5 dc462c40
# -*- coding: utf-8 -*-
from datetime import datetime
import pprint
import pandas as pd
import json
import numpy as np
from utils.situations import Situation as sit
def grafico(df,lista_disciplinas):
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
def informacoes_gerais(df,lista_disciplinas):
#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
def conhecimento(qtd,disciplina_dict):
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
def trancamento(qtd,disciplina_dict,qtd_matr):
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
def reprovacao(qtd,disciplina,qtd_matr,taxa_reprov_absoluta,taxa_reprov_freq):
"""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
def nota(notas_df,disciplina,index):
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]
def analises_gerais(df,lista_disciplinas):
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
qtd = qtd_geral.loc[qtd_geral.COD_ATIV_CURRIC == disciplina]
disciplina_semestral = qtd_ultimo_geral.loc[qtd_ultimo_geral.COD_ATIV_CURRIC == \
disciplina]
ano = datetime.now().year - 1
qtd_ultimo = disciplina_semestral.loc[disciplina_semestral.ANO == ano]
#quantidade de alunos
qtd_matriculas = lista_disciplinas[disciplina]["qtd_alunos"]
#qtd é um dataframe que contem a ocorrencia de cada situacao
qtd = qtd_geral.loc[qtd_geral.COD_ATIV_CURRIC == disciplina]
#faz analises relacionada ao conhecimento
conhecimento(qtd,disciplina_dict)
# faz analises relacionada ao trancamento
trancamento(qtd,disciplina_dict,qtd_matriculas)
# 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]
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")
#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]
nota(nota_df,disciplina_dict,"nota")
if nota_ultimo.empty:
disciplina_dict["nota_ultimo_ano"] = -1
nota(nota_ultimo,disciplina_dict,"nota_ultimo_ano")
lista_disciplinas[disciplina].update(disciplina_dict)
# *cursada ate a aprovacao
def analises_semestrais(df,lista_disciplinas):
# [ ] -> 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
def transforma_json(lista_disciplinas):
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))
def listagem_disciplina(df,lista_disciplinas):
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] = {"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"] }
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)
#verifica 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)]
}
with open("cache/disciplinas.json",'w') as f:
f.write(json.dumps(listagem,indent=4))
# [ ] ->media_disc
# [ ] compara_aprov
def analises_disciplinas(df):
lista_disciplinas = {}
informacoes_gerais(df,lista_disciplinas)
analises_gerais(df,lista_disciplinas)
analises_semestrais(df,lista_disciplinas)
transforma_json(lista_disciplinas)
listagem_disciplina(df,lista_disciplinas)
......@@ -3,18 +3,23 @@ import time
from base.dataframe_base import load_dataframes
from build_cache import build_cache
from datetime import timedelta
<<<<<<< HEAD
from analysis.degree_analysis import *
=======
from utils.situations import *
from analysis.course_analysis import *
>>>>>>> origin/course
def main():
start_time = time.clock()
start_time_exec = time.time()
dataframe = load_dataframes(os.getcwd() + '/' + 'base')
build_cache(dataframe)
cpu_time = timedelta(seconds=round(time.clock() - start_time))
Main(dataframe)
run_time = timedelta(seconds=round(time.time() - start_time_exec))
print("--- Tempo de CPU: {} ---".format(cpu_time))
print("--- Tempo total: {} ---".format(run_time))
......
# -*- coding: utf-8 -*-
# == Admission Form == #
class AdmissionType:
AT_DESCONHECIDO = 0
......@@ -65,6 +66,14 @@ class EvasionForm:
)
# == Situation Courses == #
#note: os valores da coluna media_final não são confiavel, situation como
# reprovacao,reprovacao_freq,dispensa_com_nota aparecem em algumas linha como
# 9999, o valor 9999 é o valor definido pelo sie para ser o 'null' na tabela
# .33, na tabela .18 o 'null' é o zero e não ocorre problema de calculo de
# nota/ira
# orientaçao: verificar se media_final é maior que 100 se sim atribua 0 se nao
# atribua media_final
class Situation:
SIT_DESCONHECIDA = 0
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment