Commit 500055cc authored by msrr18's avatar msrr18 😑

Merge branch 'issue/141' into 'development'

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

See merge request !69
parents 58361b0f a2ba507f
Pipeline #20342 failed with stage
in 2 minutes and 11 seconds
.fa{
color:#132940;
}
.popover{
max-width:30%;
}
html {
height: 100%;
......
......@@ -8,6 +8,7 @@
<!-- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"/> -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js">
<link rel="stylesheet" href="{% static 'bootstrap4/css/bootstrap.min.css' %}"/>
......@@ -106,7 +107,15 @@
$.fn.selectpicker.Constructor.BootstrapVersion = '4';
</script>
<script charset="utf-8">
$(function () {
$('.fa-info-circle').popover({
placement: 'top',
trigger: 'hover'
})
})
</script>
{% block js-foot %}
{% endblock js-foot %}
</html>
\ No newline at end of file
</html>
......@@ -4,18 +4,21 @@ register = template.Library()
@register.filter
def to_percent(value):
if type(value) == int or type(value) == float:
try:
return "{:.2f}".format(float(value)*100) + "%"
return ""
except:
return ""
@register.filter
def fix_2digit(value):
if type(value) == int or type(value) == float:
try:
return "{:.2f}".format(float(value))
return ""
except e:
return ""
@register.filter
def remove_spaces(value):
if type(value) == str:
try:
return value.replace(' ', '')
return value
\ No newline at end of file
except:
return value
\ No newline at end of file
......@@ -5,31 +5,66 @@
{% block content%}
<div class="row">
<div class="col-md-12">
<h1>Informações Gerais</h1>
<h1>
Informações Gerais
<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>
</h1>
<table class="table">
<tr>
<td>Quantidade de alunos ativos</td>
<td>{{degree_data.qtd_alunos_atuais}}</td>
<td>
<a tabindex="0" class=" fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Valor que representa o total de estudantes sem evasão."></a>
</td>
</tr>
<tr>
<td>IRA médio desde o inicio do curso</td>
<td>IRA médio desde o inicio do curso
</td>
<td>{{degree_data.ira_medio.0|floatformat:2}} &#177;
{{degree_data.ira_medio.1|floatformat:2}}</td>
<td>
<a tabindex="0" class=" fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Valores que representam o IRA médio (e desvio padrão) dos estudantes, levando em consideração todos os estudantes que ingressaram no curso."></a>
</td>
</tr>
<tr>
<td> IRA médio dos alunos atualmente no curso</td>
<td>{{degree_data.ira_atual.0|floatformat:2}} &#177; {{degree_data.ira_atual.1|floatformat:2}}</td>
<td>{{degree_data.ira_atual.0|floatformat:2}} &#177;
{{degree_data.ira_atual.1|floatformat:2}}</td>
<td>
<a tabindex="0" class=" fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Valores que representam o IRA médio (e desvio padrão) dos estudantes, levando em consideração apenas os estudantes que estão ativos no curso. 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>Taxa de reprovação desde o inicio do curso</td>
<td>{{ degree_data.taxa_reprovacao.0 | to_percent }}
&#177; {{degree_data.taxa_reprovacao.1 | to_percent }}</td>
<td>{{ degree_data.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 dos estudantes, levando em consideração todos os estudantes que ingressaram no curso. 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>Taxa de reprovação dos alunos atualmente no curso</td>
<td>{{ degree_data.taxa_reprovacao_atual.0|to_percent }}
&#177; {{degree_data.taxa_reprovacao_atual.1|to_percent}}</td>
<td>{{ degree_data.taxa_reprovacao_atual|to_percent }}</td>
<td>
<a tabindex="0" class=" fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Número que representa a taxa de reprovação dos estudantes, levando em consideração apenas os estudantes que estão ativos no curso."></a>
</td>
</tr>
<tr>
{% comment %}
......@@ -76,19 +111,37 @@
</div>
</div>
{% endcomment %}
<div id="graficos">
<br><br>
<div id="graficos container">
<div class="row">
<div class="col-md-12">
<div class="col-md-11">
<!-- <h3>Quantidade alunos/IRA</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-12">
<div class="row">
<div class="col-md-11">
<!-- <h3>Quantidade evasão/período</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>
......@@ -184,16 +237,16 @@
title: "Quantidade de evasão em cada período",
fill: "none",
type: ["bar","scatter"],
legend: ["Quantidade", "Taxa"],
legend: ["Quantidade", "Porcentagem"],
xaxis_title: "Período",
yaxis_title: "Quantidade de evasões",
yaxis2_title: "Taxa de evasão (em relação ao total)",
data_axis_y: ["y1","y2"]
yaxis2_title: "Porcentagem de evasão (em relação ao total)",
data_axis_y: ["y1","y2"],
marker: {
opacity:0.6,
size: 13
},
});
</script>
{% endblock js-foot %}
\ No newline at end of file
{% endblock js-foot %}
......@@ -7,6 +7,13 @@ from submission.models import Submission
import json
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]
@permission_required_or_403('view_degree', (Submission, 'id', 'submission_id'))
def index(request, submission_id):
submission_id = int(submission_id)
......@@ -15,11 +22,14 @@ def index(request, submission_id):
degree = submission.degree
degree_data = get_degree_information(request.session, degree, submission_id=submission_id)
return render(request, "degree/index.html", {
"submission": submission,
"degree": degree,
"degree_data": degree_data
"degree_data": degree_data,
"situations_pass": situations_pass,
"situations_fail": situations_fail,
})
......@@ -9,6 +9,19 @@
<div class="col-md-12">
<h1>{{ analysis_result.student.name }}
<small>{{ analysis_result.student.grr }}</small>
<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>
</h1>
<div>
<!-- Nav tabs -->
......@@ -89,6 +102,10 @@
<span class="data">{{ analysis_result.student.ano_evasao }}/{{analysis_result.student.semestre_evasao}}</span>
{% endif %}
</td>
<td>
<a tabindex="0" class=" fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Código especificado no relatório original. Representa a modalidade de evasão do aluno ou especifica se o aluno é ativo (Sem evasão)."></a>
</td>
</tr>
<tr>
......@@ -103,6 +120,10 @@
<td>
<span class="data">{{ analysis_result.indice_aprovacao|to_percent }}</span>
</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 do estudante. 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>
<!-- This analysis was not implemented yet -->
......
......@@ -9,7 +9,22 @@
<div class="row">
<div class="col-md-12">
<h1>Listagem dos Alunos</h1>
<h1>
Listagem dos Alunos
<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>
</h1>
<div class="nav nav-tabs" role="tablist">
<a class="nav-item nav-link active" href="#sem_evasao" aria-controls="sem_evasao" data-toggle="tab">Sem Evasão</a>
<a class="nav-item nav-link" href="#formados" aria-controls="formados" data-toggle="tab">Formados</a>
......
......@@ -13,6 +13,14 @@ from guardian.decorators import permission_required_or_403
from student.grid import DegreeGrid
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]
@permission_required_or_403('view_student', (Submission, 'id', 'submission_id'))
def detail(request, submission_id, grr):
submission_id = int(submission_id)
......@@ -31,6 +39,7 @@ def detail(request, submission_id, grr):
dg = DegreeGrid(DegreeGrid.bcc_grid_2011)
grid_info, grid_info_extra = dg.get_situation(hist)
analysis_result = {
'indice_aprovacao' : cache_j['taxa_aprovacao'],
'periodo_real': cache_j['periodo_real'],
......@@ -48,7 +57,9 @@ def detail(request, submission_id, grr):
return render(request, 'student/detail.html', {
'degree': degree,
'analysis_result': analysis_result,
"submission": submission
"submission": submission,
"situations_pass": situations_pass,
"situations_fail": situations_fail,
})
......@@ -99,6 +110,8 @@ def index(request, submission_id):
'abandono': abandono,
'desistencia': desistencia,
'outros': outros,
"submission": submission
"submission": submission,
"situations_pass": situations_pass,
"situations_fail": situations_fail,
})
......@@ -39,20 +39,21 @@ def general_failure(df):
affect_ira = df[df.SITUACAO.isin(Situation.SITUATION_AFFECT_IRA)]
failures = affect_ira[affect_ira.SITUACAO.isin(Situation.SITUATION_FAIL)]
# average = reprovados/
average = failures.shape[0] / affect_ira.shape[0]
student_courses = affect_ira.groupby(['MATR_ALUNO'], as_index=False)\
.aggregate({'SITUACAO': 'count'})
student_failures = failures.groupby(['MATR_ALUNO'], as_index=False)\
.aggregate({'SITUACAO': 'count'})
return average
# student_courses = affect_ira.groupby(['MATR_ALUNO'], as_index=False)\
# .aggregate({'SITUACAO': 'count'})
# student_failures = failures.groupby(['MATR_ALUNO'], as_index=False)\
# .aggregate({'SITUACAO': 'count'})
merged = pd.merge(student_courses, student_failures, on=['MATR_ALUNO'])
merged.columns = ['MART_ALUNO', 'FEITAS', 'REPROVADO']
variance = merged['REPROVADO'].div(merged['FEITAS']).sub(average)\
.pow(2).sum() / merged.shape[0]
standard_deviation = math.sqrt(variance)
return (average, standard_deviation)
# merged = pd.merge(student_courses, student_failures, on=['MATR_ALUNO'])
# merged.columns = ['MART_ALUNO', 'FEITAS', 'REPROVADO']
# variance = merged['REPROVADO'].div(merged['FEITAS']).sub(average)\
# .pow(2).sum() / merged.shape[0]
# standard_deviation = math.sqrt(variance)
# return (average, standard_deviation)
def current_students_failure(df):
......@@ -62,17 +63,18 @@ def current_students_failure(df):
average = failures.shape[0] / affect_ira.shape[0]
student_courses = affect_ira.groupby(['MATR_ALUNO'], as_index=False)\
.aggregate({'SITUACAO': 'count'})
student_failures = failures.groupby(['MATR_ALUNO'], as_index=False)\
.aggregate({'SITUACAO': 'count'})
merged = pd.merge(student_courses, student_failures, on=['MATR_ALUNO'])
merged.columns = ['MART_ALUNO', 'FEITAS', 'REPROVADO']
variance = merged['REPROVADO'].div(merged['FEITAS']).sub(average)\
.pow(2).sum() / merged.shape[0]
standard_deviation = math.sqrt(variance)
return (average, standard_deviation)
return average
# student_courses = affect_ira.groupby(['MATR_ALUNO'], as_index=False)\
# .aggregate({'SITUACAO': 'count'})
# student_failures = failures.groupby(['MATR_ALUNO'], as_index=False)\
# .aggregate({'SITUACAO': 'count'})
# merged = pd.merge(student_courses, student_failures, on=['MATR_ALUNO'])
# merged.columns = ['MART_ALUNO', 'FEITAS', 'REPROVADO']
# variance = merged['REPROVADO'].div(merged['FEITAS']).sub(average)\
# .pow(2).sum() / merged.shape[0]
# standard_deviation = math.sqrt(variance)
# return (average, standard_deviation)
def general_ira(student_analysis):
iras = np.array(list(student_analysis.ira_alunos().values()))
......
......@@ -109,7 +109,7 @@ class StudentAnalysis:
if(carga_total != 0):
ira_per_student[i] = ira_total/carga_total
else:
else: # There is no register of courses for this student
ira_per_student[i] = 0
return ira_per_student
......
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