Commit b1b667b8 authored by msrr18's avatar msrr18 😑

Merge branch 'issue/141' into 'development'

Update "Criar informações das análises"

See merge request !99
parents dbf97ddd 027d8432
Pipeline #20962 passed with stage
in 2 minutes and 27 seconds
......@@ -6,7 +6,28 @@
{% block content %}
<div class="row">
<div class="col-md-12">
<h1>Informações Gerais - Turma Ingresso</h1>
<h1>
Informações Gerais - Turma Ingresso
<a tabindex="0" class="fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Para o cálculo do IRA, somente as situações consideradas como <b>Aprovação</b> ou <b>Reprovação</b> são consideradas.<br>
Também, alguns casos como o cálculo do índice de reprovação utilizam o conceito de disciplians cursadas.
<br>
Situações consideradas como <b>Aprovação:</b><br>
{% for x in situations_pass %}
{{x}}<br>
{% endfor %}
<br>
Situações consideradas como <b>Reprovação:</b><br>
{% for x in situations_fail %}
{{x}}<br>
{% endfor %}
<br>
Situações consideradas como <b>Cursada:</b><br>
{% for x in situations_coursed %}
{{x}}<br>
{% endfor %}
"></a>
</h1>
<table class="table">
<tr>
<td>Ano/Semestre</td>
......@@ -15,22 +36,42 @@
<tr>
<td>Quantidade de alunos</td>
<td> {{admission_info.quantidade_alunos}} </td>
<td>
<a tabindex="0" class=" fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Quantidade de alunos que possuem ano e semestre de matrícula referente a esta turma ingresso."></a>
</td>
</tr>
<tr>
<td>IRA Médio</td>
<td> {{admission_info.ira|floatformat:2}} &plusmn {{admission_info.std|floatformat:2}} </td>
<td>
<a tabindex="0" class=" fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="IRA médio e desvio padrão dos alunos desta turma. São apenas consideradas as disciplinas cujas situações são classificadas como <b>Reprovação</b> ou <b>Aprovação</b>."></a>
</td>
</tr>
<tr>
<td>Tempo médio de formatura em anos <b>atual</b></td>
<td> {{admission_info.formatura_media}} </td>
<td>
<a tabindex="0" class=" fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Tempo médio de formatura em anos (dentre aqueles que se formaram)."></a>
</td>
</tr>
<tr>
<td>Índice de Reprovação</td>
<td> {{admission_info.taxa_reprovacao|to_percent}} </td>
<td>
<a tabindex="0" class=" fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Valor que representa a taxa de reprovação de disciplinas cursadas pelos alunos desta turma. É calculado a partir da razão entre disciplinas consideradas como <b>Reprovação</b> e disciplinas consideradas como <b>Cursada</b>."></a>
</td>
</tr>
<tr>
<td>Indice de Evasão</td>
<td> {{admission_info.taxa_evasao|to_percent}} </td>
<td>
<a tabindex="0" class=" fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Valor que representa a taxa de de evasão desta turma. É calculado a partir da razão entre alunos ativos e a quantidade total de alunos da turma."></a>
</td>
</tr>
<tr>
<td>Quantidade de Evadidos</td>
......@@ -83,11 +124,23 @@
<div id="graficos">
<div class="row">
<div class="col-md-12">
<h3>IRA/Semestre</h3>
<h3>
IRA por Semestre
<a tabindex="0" class="fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Média e desvio padrão do IRA semestral dos alunos desta turma em diferentes períodos. O valor do IRA é calculado individualmente
para cada semestre, ou seja, os valores das notas não são acumulados.
São apenas consideradas as disciplinas cujas situações são classificadas como
<b>Reprovação</b> ou <b>Aprovação</b>."></a>
</h3>
<div id="ira_semestral"></div>
</div>
<div class="col-md-12">
<h3>Quantidade de alunos/Semestre</h3>
<h3>
Quantidade de alunos por Semestre
<a tabindex="0" class="fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Calcula, para cada período, o número de alunos desta turma que realizaram ao menos uma matrícula em alguma disciplina.">
</a>
</h3>
<div id="students_per_semester"></div>
</div>
</div>
......
......@@ -8,12 +8,27 @@
<div class="row">
<div class="col-md-12">
<h2>Turmas de Ingresso</h2>
<h2>
Turmas de Ingresso
<a tabindex="0" class="fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Para o cálculo do IRA, somente as situações consideradas como <b>Aprovação</b> ou <b>Reprovação</b> são consideradas.<br>
<br>
Situações consideradas como <b>Aprovação:</b><br>
{% for x in situations_pass %}
{{x}}<br>
{% endfor %}
<br>
Situações consideradas como <b>Reprovação:</b><br>
{% for x in situations_fail %}
{{x}}<br>
{% endfor %}">
</a>
</h2>
<table class="table table-striped table-bordered" id="admission_table">
<thead>
<tr>
<th>Ano/Semestre</th>
<th>Ira médio</th>
<th>IRA médio</th>
<th>Quantidade Ingresso</th>
<th>Alunos Evadidos</th>
<th>Alunos Formados</th>
......
......@@ -8,14 +8,22 @@ from report_api.views import get_list_admission, get_admission_detail
from submission.models import Submission
from guardian.decorators import permission_required_or_403
from submission.analysis.utils.situations import Situation
situations_pass = Situation.SITUATION_PASS
situations_pass = [Situation.code_to_str(c) for c in situations_pass]
situations_fail = Situation.SITUATION_FAIL
situations_fail = [Situation.code_to_str(c) for c in situations_fail]
situations_coursed = Situation.SITUATION_COURSED
situations_coursed = [Situation.code_to_str(c) for c in situations_coursed]
@permission_required_or_403('view_admission', (Submission, 'id', 'submission_id'))
def detail(request, submission_id, ano, semestre):
submission_id = int(submission_id)
submission = Submission.objects.get(id=submission_id)
degree = submission.degree
for admission in get_list_admission(request.session, degree, submission_id):
if(admission["ano"] == ano and admission["semestre"] == semestre):
......@@ -35,11 +43,16 @@ def detail(request, submission_id, ano, semestre):
if(admission_info["formatura_media"] == -1):
admission_info["formatura_media"] = "Não há alunos formados nesta turma"
else:
admission_info["formatura_media"] = str(admission_info["formatura_media"]) + " anos"
return render(request, 'admission/detail.html',{
"degree": degree,
"admission_info": admission_info,
"submission": submission
"submission": submission,
"situations_pass": situations_pass,
"situations_fail": situations_fail,
"situations_coursed": situations_coursed,
})
......@@ -54,8 +67,10 @@ def index(request, submission_id):
"listage_admissions": get_list_admission(
request.session,
degree,
submission_id
submission_id,
),
"situations_pass": situations_pass,
"situations_fail": situations_fail,
"degree": degree,
"submission": submission
})
......@@ -126,7 +126,11 @@
<div id="aprovacao_semestre"></div>
</div>
<div class="col-md-12">
<!-- <h3>Quantidade de Alunos/Vezes Cursadas</h3> -->
<h3>
Reincidência de matrículas
<a tabindex="0" class="fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Contagem de alunos que cursaram a disciplina X vezes."></a>
</h3>
<div id="qtd_cursada_aprov"></div>
</div>
</div>
......
......@@ -8,7 +8,9 @@
<div class="row">
<div class="col-md-12">
<h2>Disciplinas</h2>
<h2>
Listagem de Disciplinas
</h2>
<table id="course_table" class="table table-striped table-bordered">
<thead>
<tr>
......
......@@ -116,32 +116,29 @@
<div id="graficos container">
<div class="row">
<div class="col-md-11">
<!-- <h3>Quantidade alunos/IRA</h3> -->
<div class="col-md-12">
<h3>Distribuição de alunos por faixas de IRA
<a tabindex="0" class="fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Distribuição dos IRA dos alunos do curso. O
gráfico mostra a distribuição de todos os alunos que fizeram ao menos uma disciplina, dos
alunos que estão no curso e dos alunos que já se formaram.<br>
<br>
<b>Atenção:</b> Alunos que possuem data de evasão indeterminada são desconsiderados."></a>
</h3>
<div id="ira_semestral"></div>
</div>
<div class="col-md-1">
<a tabindex="0" class="fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Distribuição dos IRA dos alunos do curso. O
gráfico mostra a distribuição de todos os alunos que fizeram ao menos uma disciplina, dos
alunos que estão no curso e dos alunos que já se formaram.<br>
<br>
<b>Atenção:</b> Alunos que possuem data de evasão indeterminada são desconsiderados."></a>
</div>
</div>
<div class="row">
<div class="col-md-11">
<!-- <h3>Quantidade evasão/período</h3> -->
<div class="col-md-12">
<h3>Histórico de evasão
<a tabindex="0" class="fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Gráfico com a quantidade de evasão de cada
semestre e cada ano desde o inicio do curso.<br>
No gráfico, para cada quantidade de evasão é mostrada sua respectiva razão entre seu valor e a quantidade total de evasão."></a>
</h3>
<div id="evasao_semestre"></div>
</div>
<div class="col-md-1">
<a tabindex="0" class="fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Gráfico com a quantidade de evasão de cada
semestre e cada ano desde o inicio do curso.<br>
No gráfico, para cada quantidade de evasão é mostrada sua respectiva razão entre seu valor e a quantidade total de evasão."></a>
</div>
<!--
<div class="col-md-6">
<h3>Nota Média/Periodo</h3>
......
......@@ -185,28 +185,76 @@
<div id="graficos">
<div class="row">
<h3>Relação entre IRA e a quantidade de disciplinas por semestre
<a tabindex="0" class="fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="IRA médio do estudante e quantidade de disciplinas cursadas em cada semestre. O valor do IRA é calculado individualmente
para cada semestre, ou seja, os valores apresentados não são acumulados.
São apenas consideradas as disciplinas cujas situações são classificadas como
<b>Reprovação</b> ou <b>Aprovação</b>."></a>
</h3>
<div class="col-md-11">
<div id="ira_disciplinas_semestre"></div>
</div>
</div>
<br>
<!-- <div class="row">
<h3>IRA/Semestre</h3>
<div class="col-md-12">
<div class="col-md-11">
<div id="ira_semestral"></div>
</div>
<div class="col-md-12">
<h3>Índice de aprovação/Semestre</h3>
<div class="col-md-1">
<a tabindex="0" class="fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="IRA médio do estudante em cada semestre. O valor é calculado individualmente
para cada semestre, logo os valores apresentados não são acumulados.
São apenas consideradas as disciplinas cujas situações são classificadas como
<b>Reprovação</b> ou <b>Aprovação</b>."></a>
</div>
</div>
<br> -->
<div class="row">
<div class="col-md-11">
<h3>Índice de aprovação por Semestre
<a tabindex="0" class="fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Quantidade de disciplinas cursadas e aprovadas em cada semestre.
São apenas consideradas as disciplinas cujas situações são classificadas como
<b>Reprovação</b> ou <b>Aprovação</b>."></a>
</h3>
<div id="aprovacao_semestral"></div>
</div>
</div>
<br>
<div class="row">
<div class="col-md-12">
<h3>Posição do aluno em relação a turma de ingresso/Semestre(%)</h3>
<div class="col-md-11">
<h3>Posição do aluno em relação a Turma de Ingresso por Semestre
<a tabindex="0" class="fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Posição do aluno em relação à própria turma de ingresso em cada semestre.
A posição é calculada considerando o IRA médio em cada semestre de forma individual.
Portanto, o IRA não é acumulado.<br><br>
O valor máximo é 1 quando o aluno obteve o melhor IRA dentre os alunos de sua turma que
cursaram ao menos uma disciplina em um determinado semestre, e 0 quando o aluno obteve o pior
desempenho. O valor é calculado de forma que se o aluno obteve a N-esima melhor
média de nota (IRA semestral) em um semestre, sua posição neste semestre é (1+N)/TOTAL,
onde TOTAL representa o total de alunos de sua turma que cursaram ao menos uma disciplina
no semestre em questão.<br><br>
São apenas consideradas as disciplinas cujas situações são classificadas como
<b>Reprovação</b> ou <b>Aprovação</b>."></a>
</h3>
<div id="posicao_turma_ingresso_semestral"></div>
</div>
<div class="col-md-12">
<h3>Relação entre IRA e a quantidade de disciplinas por semestre</h3>
<div id="ira_disciplinas_semestre"></div>
</div>
</div>
<br>
<div class="row">
<div class="col-md-12">
<h3>Aprovações Acumuladas</h3>
<h3>Aprovações Acumuladas
<a tabindex="0" class="fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Acumulo de aprovações (azul) e total de disciplinas cursadas (laranja) em cada período.
São apenas consideradas as disciplinas cujas situações são classificadas como
<b>Reprovação</b> ou <b>Aprovação</b>."></a>
</h3>
<div id="aprovacao_acumulada"></div>
</div>
</div>
......@@ -222,15 +270,15 @@
{% block js-foot %}
<script>
var chart1 = new AdegaChart({
data: {{analysis_result.ira_semestral|safe}},
div_target: "ira_semestral",
//type: "bar",
title: "Relação entre IRA e período",
legend: "IRA semestral",
xaxis_title: "Período",
yaxis_title: "IRA semestral",
});
// var chart1 = new AdegaChart({
// data: {{analysis_result.ira_semestral|safe}},
// div_target: "ira_semestral",
// //type: "bar",
// title: "Relação entre IRA e período",
// legend: "IRA semestral",
// xaxis_title: "Período",
// yaxis_title: "IRA semestral",
// });
var chart2 = new AdegaChart({
data: {{analysis_result.indice_aprovacao_semestral|safe}},
......
......@@ -20,6 +20,7 @@ class Admission(object):
self.__dataframes["df_filted"] = df.drop_duplicates(["MATR_ALUNO"])
self.__groupbys["groupby_original"] = df.groupby(['ANO_INGRESSO_y', 'SEMESTRE_INGRESSO'])
self.__groupbys["groupby_filted"] = self.__dataframes["df_filted"].groupby(['ANO_INGRESSO_y', 'SEMESTRE_INGRESSO'])
def count_evasion_form(self, g, evasion_form):
return g.apply(lambda x: x.loc[(x.FORMA_EVASAO == evasion_form)].shape[0])
......@@ -41,7 +42,7 @@ class Admission(object):
("qtd_abandono", ef.EF_ABANDONO),
("qtd_formatura", ef.EF_FORMATURA),
("qtd_ativos", ef.EF_ATIVO)
]
]
# calcula a quantidade de alunos qtd_ativos, qtd_abandono e qtd_formatura
for i in evasions:
self.analysis[i[0]] = self.count_evasion_form(self.__groupbys["groupby_filted"], i[1])
......@@ -85,6 +86,7 @@ class Admission(object):
media_formatura = admission_g.apply(lambda x:\
((x.ANO_EVASAO.astype(float)+x.SEMESTRE_EVASAO.astype(float))-\
(x.ANO_INGRESSO_y.astype(float)+x.SEMESTRE_INGRESSO.astype(float))).mean())
self.analysis["media_formatura"] = media_formatura.rename({0.0: '1', 0.5:'2'})
def taxa_reprovacao(self):
......@@ -119,7 +121,6 @@ class Admission(object):
def admission_list(self):
self.analysis["admission_list"] = list(self.__groupbys["groupby_filted"].groups.keys())
def build_analysis(self):
self.counts()
self.admission_list()
......@@ -292,28 +293,35 @@ def desvio_padrao_turma_ingresso(df, student_analysis):
def evasion_per_semester(df):
# filtra a planilha, deixando apenas 1 linha por estudante por periodo que ele passou desde que entrou no curso
turmas_ingresso = df.drop_duplicates(['ANO_INGRESSO_y','SEMESTRE_INGRESSO', 'ANO','PERIODO', 'MATR_ALUNO'], keep='last')
# agrupa as linhas do dataframe resultante da filtragem pela tupla (ano de entrada, periodo de entrada, ano, periodo)
t_i_semestral_size = turmas_ingresso.groupby(['ANO_INGRESSO_y','SEMESTRE_INGRESSO', 'ANO','PERIODO'])['MATR_ALUNO']
# filtra o dataframe, deixando apenas 1 linha por estudante que evadiu
t_i_evasions = turmas_ingresso.loc[(turmas_ingresso.FORMA_EVASAO != EvasionForm.EF_ATIVO) & (turmas_ingresso.FORMA_EVASAO != EvasionForm.EF_FORMATURA) & (turmas_ingresso.FORMA_EVASAO != EvasionForm.EF_REINTEGRACAO)]
# agrupa as linhas do dataframe de evadidos indexados pela tupla (ano de entrada, periodo de entrada, ano, periodo), conta o numero de linhas e transforma isso em um dicionario
t_i_evasions_semestral_size = t_i_evasions.groupby(['ANO_INGRESSO_y','SEMESTRE_INGRESSO', 'ANO_EVASAO','SEMESTRE_EVASAO'])['MATR_ALUNO'].nunique().to_dict()
dict_evasion = {}
aux = {}
# transforma o groupby em um dicionario que contem a evasao dividida pelo numero de linhas de cada grupo do agrupamento, indexado pela tupla de tuplas ((ano de entrada, periodo de entrada), (ano, periodo))
for t_i_s in t_i_semestral_size:
# trata os campos 2 e 3 da tupla (ano de entrada, periodo de entrada, ano, periodo) para que fique no mesmo formato que as chaves do dicionario t_i_evasions_semestral_size
t_i_s_aux = (t_i_s[0][0], t_i_s[0][1], str(t_i_s[0][2]), t_i_s[0][3].split("o")[0])
# pega o numero de evasoes de acordo com a tupla (ano de entrada, periodo de entrada, ano, periodo)
if t_i_s_aux in t_i_evasions_semestral_size:
evasions = t_i_evasions_semestral_size[t_i_s_aux]
else:
evasions = 0
aux.update({((t_i_s[0][0], t_i_s[0][1]), (t_i_s[0][2], t_i_s[0][3])):(evasions/t_i_s[1].size)})
# transforma o dicionario anterior em um outro dicionario, indexado pela tupla (ano de entrada, periodo de entrada), tendo como elementos outros dicionarios.
# cada dicionario contido no dicionario e indexado pela tupla (ano, periodo) e contem a evasao dividida pelo numero de linhas de cada grupo do agrupamento
for t_i_s, value in aux.items():
dict_evasion.setdefault(t_i_s[0], {})[t_i_s[1]] = value
return dict_evasion
def students_per_semester(df):
......
......@@ -269,7 +269,7 @@ class Course(Analysis):
def coursed_count(self):
"""
Calcula a quandidade de vezes que cada aluno cursou a disciplina.
Calcula a quantidade de vezes que cada aluno cursou a disciplina.
"""
dict_name = "filted_course_student_groupby"
self.__data[dict_name] = self.__data["normal_dataframe"].groupby([
......
import numpy as np
# TODO:
# FAZER CACHE DE TUDO
# AO CHAMAR A FUNCAO VERIFICAR SE TEM ALGO NA CACHE
from submission.analysis.utils.situations import *
from submission.analysis.utils.utils import memoize
import pandas as pd
......@@ -163,15 +159,15 @@ class StudentAnalysis:
for semester in iras_by_semester[grr]:
student_admission = admissions[grr_to_admissions[grr]]
competition = [
matr for matr in student_admission if semester in iras_by_semester[matr]]
competition = [matr for matr in student_admission
if semester in iras_by_semester[matr]]
classifications = sorted(
competition,
key=lambda matr: iras_by_semester[matr][semester]
)
positions[grr][semester] = (
1+classifications.index(grr))/len(competition)
positions[grr][semester] = ((1+classifications.index(grr))/
len(competition))
return positions
......@@ -246,7 +242,7 @@ class StudentAnalysis:
if (situacao in Situation.SITUATION_AFFECT_IRA):
if not (ano + "/" + semestre in students[matr]):
students[matr][ano + "/" + semestre] = [0, 0, 0]
students[matr][ano + "/" + semestre][0] += nota*carga
students[matr][ano + "/" + semestre][1] += 1
students[matr][ano + "/" + semestre][2] += carga
......
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