diff --git a/script/analysis/course_analysis.py b/script/analysis/course_analysis.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..dc73bd9f0bc35993472b640d6a64895e029d3190 100644 --- a/script/analysis/course_analysis.py +++ b/script/analysis/course_analysis.py @@ -0,0 +1,252 @@ +# -*- coding: utf-8 -*- +import pandas as pd +import json +import numpy as np +from utils.situations import Situation as sit +#funcoes +# +# make_taxas -- parametros df e ultima turma ingresso +# *qtd_alunos +# *qtd_trancamento +# *taxa_reprovacao_absoluta +# *taxa_reprovacao_frequencia +# *taxa_reprovacao_ultimo_absoluto +# *taxa_reprovacao_ultimo_frequencia +# *taxa_trancamento +##listas_disciplinas é dicionario com todas as disciplinas +#def taxas_gerais(df,ultima_turma_ingresso,lista_disciplina): +# df_quantidade = df.groupby(['COD_ATIV_CURRIC', 'SITUACAO'] +# ).size().reset_index(name='Quantidades') +# for disciplina in lista_disciplina.keys: +# quantidades = df_quantidade.loc[df_quantidade.COD_ATIV_CURRIC == disciplina] +# +# qtd_trancamento_df =quantidades.loc[quantidades.SITUACAO == +# (sit.SIT_CANCELADO || sit.SIT_TRANCAMENTO_ADMINISTRATIVO || +# sit.SIT_TRANCAMENTO_TOTAL) ] +# qtd_trancamento = qtd_trancamento_df.sum +# +# qtd_conhecimento_aprov = quantidades.loc[quantidades.SITUACAO == +# sit.SIT_CONHECIMENTO_APROVADO].Quantidade +# qtd_conhecimento_reprov = quantidades.loc[quantidades.SITUACAO == +# sit.SIT_CONHECIMENTO_REPROVADO].Quantidade +# lista_disciplina[disciplina][qtd_conhecimento] = qtd_conhecimento_aprov +# + qtd_conhecimento_reprov +# if qtd_conhecimento: +# taxa_conhecimento = qtd_conhecimento_aprov / listas_disciplinas[disciplina][qtd_conhecimento] +# else: +# taxa_conhecimento = -1 +# +#def print_analise(d): +# '''imprime todo o dataframe, por default o pandas so imprime as +# 10 linhas inicias a 10 finais, com essa funcao o pandas imprime +# as linhas ''' +# with pd.option_context('display.max_rows', None, 'display.max_columns', 27): +# print(d) +# +## calcula as taxas +#def func(x, matr): +# ''' esta funcao recebe como parametro uma linha do dataframe e a +#quantidade de matriculas ''' +# c = matr[x['COD_ATIV_CURRIC']].values[0] +# return (x['Quantidade'] / c) +# +## quantidade de matriculas +#def counts_matr(df): +# return df.groupby(['COD_ATIV_CURRIC']).size() +# +## taxas e quantidades semetrais +#def analysis(df): +# qnt_matr = counts_matr(df) # quantidade de matriculas disciplina +# ''' conta quantas vezes os valores de 'SITUACAO' se repete para +# cada disciplina''' +# disciplinas = df.groupby(['COD_ATIV_CURRIC', 'SITUACAO'] +# ).size().reset_index(name='Quantidade') +# ''' adiciona mais uma coluna ao df disciplina com as taxas de cada valor +# de 'SITUACAO' ''' +# disciplina = disciplinas.groupby(['COD_ATIV_CURRIC', 'SITUACAO', 'Quantidade']).apply( +# lambda x: func(x, qnt_matr)).reset_index(name='Taxas gerais') +# disciplina = disciplina.drop('level_3',1) # retira coluna duplicada do index +# # codigo que transforma o dataframe em um dicionario +# dict_disciplina = {} +# for dis in qnt_matr.keys(): +# # separa o dataframe em disciplina +# disc = disciplina.loc[disciplina['COD_ATIV_CURRIC']==dis] +# disc = disc.drop('COD_ATIV_CURRIC',1) # elimina a coluna codigo +# # seta a coluna SITUACAO como index +# disc = disc.set_index('SITUACAO').to_dict() +# # para caso uma discipl. nao tenha um campo, coloca o campo com valor 0 +# for i in Situation.SITUATIONS: +# if not(i[0] in disc['Quantidade'].keys()): +# disc['Quantidade'][i[0]] = 0 +# disc['Taxas gerais'][i[0]] = 0 +# dict_disciplina[dis] = disc +# return dict_disciplina +# +## quantidade de vezes cursadas ate obter a aprovacao +#def qnt_aprov(df): +# qnt = df.groupby(['MATR_ALUNO', 'COD_ATIV_CURRIC'] +# ).size().reset_index(name='qnt_aprov') +# return qnt +## transforma o dataframe geral em json, # TODO: fazer o mesmo com o semestral +#def df_to_json(disciplina,qnt_matr): +# # cria o json +# with open(dis+'.json','w') as f: +# json.dump(disc,f,indent=4) +# +#def matr_semestre(df): +# return df.groupby(['COD_ATIV_CURRIC', 'PERIODO', 'ANO']).size() +# +# +#def func_semestre(x, matr): +# # print (matr) +# ano = int(x['ANO']) +# # print(ano) +# periodo = x['PERIODO'].values[0] +# disciplina = x['COD_ATIV_CURRIC'].values[0] +# c = matr[disciplina,periodo,ano] +# return (x['counts_semestre'] / c) +# +# +#def analysis_semestre(df): +# qnt_matr_semestre = matr_semestre(df) +# discipline_semestre = df.groupby(['COD_ATIV_CURRIC', 'PERIODO', 'ANO', 'SITUACAO']) +# discipline_semestre = discipline_semestre.size() +# +# discipline_semestre = discipline_semestre.reset_index(name='counts_semestre') +# +# discipline_semestre = discipline_semestre.groupby(['COD_ATIV_CURRIC', 'PERIODO', 'ANO', 'SITUACAO']) +# +# discipline_semestre = discipline_semestre.apply(lambda x: func_semestre(x, qnt_matr_semestre)) +# +# discipline_semestre = discipline_semestre.reset_index(name='taxas_semetrais') +# for dis in qnt_matr_semestre.keys(): +# dis = ['CI055'] +# disc = discipline_semestre.loc[discipline_semestre['COD_ATIV_CURRIC']==dis[0]].drop('COD_ATIV_CURRIC',1) # elimina a coluna codigo +# disc = disc.drop('level_4',1) +# print(dis[0]) +# print(disc.set_index('ANO')) +# # seta a coluna SITUACAO como index +# disc = disc.set_index('ANO').to_dict('index') +# # with open(dis+'.json','w') as f: +# # json.dump(disc,f,indent=4) +# print("--------------------------------------------------------------------------------") +# +# break +# return discipline_semestre +# +# +# +#def Main(df): +# +# # Analysis = analysis(df) +# Analysis_semestre = analysis_semestre(df) +# # matr = counts_matr(df) +# # df_to_json(Analysis,matr) +# # matr_semes = matr_semestre(df) +# # pprint_analise(matr_semes) +# +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'] = disciplinas[disciplina] + disciplina_dict['disciplina_codigo'] = disciplina + disciplina_dict['disciplina_nome'] = \ + disciplina_df.NOME_ATIV_CURRIC.values[0] + lista_disciplinas[disciplina] = disciplina_dict +# -nome da disciplina +# -codigo da disciplina +# -lista de disciplina +# -quantidade de matriculas +# -retorna um dicionario de disciplina, cada disciplina com quantidade de +# matriculas +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'] = total_conheci + + if (total_conheci !=0) and (not conheci_aprov.empty): + disciplina_dict['taxa_conhecimento'] = 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'] = qtd_tranc + disciplina_dict['taxa_trancamento'] = qtd_tranc / qtd_matr if qtd_matr else 0.0 + + +def reprovacao(qtd,disciplina,qtd_matr,taxa_reprov_absoluta,taxa_reprov_freq): + '''existe as analises reprovacao absoluta, reprovacao por frequencia e + reprovacao absoluta, reprovacao por frequencia da ultima vez que a + disciplina foi ofertada, a logica da analise eh a mesma so muda os valores + do dataframe qtd e o nomes das chaves do dicionario.Eh possivel reaproveitar + o mesmo codigo para fazer analise geral e da ultima vez que foi ofertado, + para isso so eh preciso enviar outro dataframe qtd e enviar como string o + indice do dicionario para ser atribuido de forma correta''' + 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: + disciplina[taxa_reprov_absoluta] = 0.0 \ + if np.isnan(qtd_reprov_abso) else qtd_reprov_abso / qtd_matr + disciplina[taxa_reprov_freq] = 0.0 \ + if qtd_reprov_freq.empty else qtd_reprov_freq.qtd.values[0] / qtd_matr + else: + disciplina[taxa_reprov_absoluta] = 0.0 + disciplina[taxa_reprov_freq] = 0.0 + + +def analises_gerais(df,lista_disciplinas): + qtd_geral= df.groupby(['COD_ATIV_CURRIC','SITUACAO']).size().reset_index(name='qtd' ) + print(df.columns) + for disciplina in lista_disciplinas.keys(): + disciplina_dict = {} + disciplina_df = df.loc[df.COD_ATIV_CURRIC == disciplina] + #quantidade de alunos + qtd_matriculas = lista_disciplinas[disciplina]['qtd_alunos'] + #qtd eh 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) + #print(disciplina_dict) + print("\n" ) +# -qtd_conhecimento +# -qtd_trancamento +# -taxa_conhecimento +# -taxa_reprovacao_absoluta +# -taxa_reprovacao_frequencia +# *taxa_reprovacao_ultimo_absoluto +# *taxa_reprovacao_ultimo_frequencia +# -taxa_trancamento +# *nota geral desvio padrao geral +# *nota ultima vez ofertado e desvio padrao +#def analises_semestrais() +# *taxa aprovacao semestral +# *quantidade de matricula por semestre +def analises_disciplinas (df): + lista_disciplinas = {} + informacoes_gerais(df,lista_disciplinas) + analises_gerais(df,lista_disciplinas) +# analises_semestrais(df,listas_disciplinas) +# """tranformar para json """