diff --git a/script/analysis/course_analysis.py b/script/analysis/course_analysis.py index f1de206ce680a6d141afbf1a498de718d0b377f2..9fc482ca42f5ebf76978e3da78e8b88bce4bb026 100644 --- a/script/analysis/course_analysis.py +++ b/script/analysis/course_analysis.py @@ -2,112 +2,251 @@ import pandas as pd import json import numpy as np -from utils.situations import * -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) - # print_analise(matr_semes) +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 """ diff --git a/script/analysis/student_analysis.py b/script/analysis/student_analysis.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..326e5bc3e459a503860d12da43699e3a773cde85 100644 --- a/script/analysis/student_analysis.py +++ b/script/analysis/student_analysis.py @@ -0,0 +1,63 @@ +import pandas as pd +from utils.situations import * + +def average_ira(d): + temp = d.dropna(subset=['MEDIA_FINAL']) + temp = temp[temp['MEDIA_FINAL'] <= 100] + if not temp.empty: + #print(temp[['MEDIA_FINAL', 'CH_TOTAL']]) + aux = np.sum(temp['MEDIA_FINAL']*temp['CH_TOTAL']) + ch_total = np.sum(temp['CH_TOTAL']) * 100 + print(aux/ch_total) + +def aluno_turmas(df): + students = {} + df = df.dropna(subset=['MEDIA_FINAL']) + total_students = len(df["MATR_ALUNO"]) + for i in range(total_students): + matr = (df["MATR_ALUNO"][i]) + if(not (matr in students)): + students[matr] = [] + + for s in Situation.SITUATIONS: + if(s[0] == df["SITUACAO"][i]): + situacao = s[1] + break + ano = (df["ANO"][i]) + codigo = (df["COD_ATIV_CURRIC"][i]) + nome = (df["NOME_ATIV_CURRIC"][i]) + nota = (df["MEDIA_FINAL"][i]) + semestre = (df["PERIODO"][i]) + + students[matr].append({ + "ano": ano, + "codigo": codigo, + "nome": nome, + "nota": nota, + "semestre": semestre, + "situacao": situacao + }) + print(students) + #~ lines = (df[["MATR_ALUNO","ANO","COD_ATIV_CURRIC","NOME_ATIV_CURRIC","MEDIA_FINAL","PERIODO","SITUACAO"]]) + #~ for st in (df.groupby("MATR_ALUNO")): + #~ print(st[1]["MATR_ALUNO"]) + #~ print(st[1]["ANO"]) + #~ print(st[1]["COD_ATIV_CURRIC"]) + #~ print(st[1]["NOME_ATIV_CURRIC"]) + #~ print(st[1]["MEDIA_FINAL"]) + #~ print(st[1]["PERIODO"]) + #~ print(st[1]["SITUACAO"]) + #~ print("") + #~ total_student = df['MATR_ALUNO'].drop_duplicates() + #~ for st in total_student: + #~ students[st] = [] + #~ hist = df[df["MATR_ALUNO"]==st] + #~ for matr in hist: + #~ print(hist["ANO"]) + #~ print(hist[matr]["COD_ATIV_CURRIC"]) + #~ print(hist[matr]["NOME_ATIV_CURRIC"]) + #~ print(hist[matr]["MEDIA_FINAL"]) + #~ print(hist[matr]["PERIODO"]) + #~ print(hist[matr]["SITUACAO"]) + #~ print(hist[matr]) + #~ print("") diff --git a/script/base/dataframe_base.py b/script/base/dataframe_base.py index a0a179e40f4a775f0926ee946c9edde56e7bdd34..39c056fd523bf04ff37447381ab190e8c58725ee 100644 --- a/script/base/dataframe_base.py +++ b/script/base/dataframe_base.py @@ -2,15 +2,22 @@ import re import os import sys import pandas as pd - +import numpy as np from glob import glob from json import load as json_load from utils.situations import * +class DataframeHolder: + def __init__(self, dataframe): + self.students = dataframe.groupby('MATR_ALUNO') + self.courses = dataframe.groupby('COD_ATIV_CURRIC') + self.admission = dataframe.groupby(['ANO_INGRESSO', 'SEMESTRE_INGRESSO']) + + def load_dataframes(cwd='.'): dataframes = [] - for path, dirs, files in os.walk(cwd): + for path, dirs, files in os.walk(cwd): for f in files: file_path = path + '/' + f dh = {'name': f, 'dataframe': None} @@ -23,6 +30,9 @@ def load_dataframes(cwd='.'): dataframes.append(dh) dataframe = fix_dataframes(dataframes) + dh = DataframeHolder(dataframe) + #~ dh.students.aggregate(teste) +# print(dh.students['MEDIA_FINAL'].aggregate(teste)) return dataframe @@ -84,6 +94,12 @@ def fix_admission(df): def fix_evasion(df): - # for evasion in EvasionForm.EVASION_FORM: - # df.loc[df.FORMA_EVASAO.str.contains(evasion[1]).fillna(False), 'FORMA_EVASAO'] = evasion[0] - pass + for evasion in EvasionForm.EVASION_FORM: + #~ df.loc[df.FORMA_EVASAO.str.contains(evasion[1]).fillna(1.0), 'FORMA_EVASAO'] = evasion[0] + df.loc[df.FORMA_EVASAO == evasion[1], 'FORMA_EVASAO'] = evasion[0] + #~ if(evasion[0] == 100): + #~ for x in df.FORMA_EVASAO.str.contains(evasion[1]).fillna(False): + #~ if(x != 0.0): + #~ print(x) + #~ print(df.FORMA_EVASAO.str.contains(evasion[1]).fillna(5)) + #~ print(df[['MATR_ALUNO','FORMA_EVASAO']]) diff --git a/script/build_cache.py b/script/build_cache.py index 4ceae5a030c3d99e8092bc9e6e1d45adc6930613..4f358398d27a9e83577f65bcf34b1a9fe680103c 100644 --- a/script/build_cache.py +++ b/script/build_cache.py @@ -7,12 +7,14 @@ from datetime import timedelta from pathlib import Path from utils.utils import build_path from analysis.degree_analysis import * +from analysis.student_analysis import * try: to_unicode = unicode except NameError: to_unicode = str + def build_cache(dataframe): # os.chdir("../src") path = "cache" @@ -20,13 +22,13 @@ def build_cache(dataframe): path += "/curso" build_path(path) - generate_degree_data(path, dataframe) - generate_student_data(path) - generate_student_list(path) - generate_admission_data(path) - generate_admission_list(path) - generate_course_data(path) - generate_course_general_data(path) +# generate_degree_data(path, dataframe) + generate_student_data(path,dataframe) +# generate_student_list(path) +# generate_admission_data(path) +# generate_admission_list(path) +# generate_course_data(path) +# generate_course_general_data(path) def generate_degree_data(path, dataframe): average_graduation(dataframe) @@ -34,7 +36,8 @@ def generate_degree_data(path, dataframe): general_ira(dataframe) pass -def generate_student_data(path): +def generate_student_data(path,dataframe): + aluno_turmas(dataframe) pass def generate_student_list(path):