Commit ff15cbc7 authored by odair mario's avatar odair mario
Browse files

Merge branch 'back-to-origins' into course

parents d891c295 ae16f7a8
......@@ -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 """
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("")
......@@ -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']])
......@@ -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):
......
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