Commit 6ebb6bfc authored by bhmeyer's avatar bhmeyer

Merge branch '182-criar-grafico-de-evasao-por-periodo-1-8' into 'development'

Resolve "Criar gráfico de evasão por período (1-8)"

See merge request !106
parents e4bef89e 2109dd8d
Pipeline #21429 passed with stage
in 5 minutes
......@@ -113,62 +113,8 @@
{% endcomment %}
<br><br>
<div id="graficos container">
<div class="row">
<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>
<div class="row">
<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-6">
<h3>Nota Média/Periodo</h3>
<canvas id="nota_media_semestre"
data-data='{{ degree_data.media_disc|safe }}'></canvas>
</div> essa analise foi feita de uma maneira ruim no adega
antigo -->
<!-- analises sa02 -->
{% comment %}
<div class="col-md-6">
<h3>Alunos/Periodo</h3>
<canvas id="aluno_periodo"
data-data='{{ degree_data.aluno_periodo|safe }}'></canvas>
</div>
<br>
<div class="col-md-6">
<h3>Nota Média/Periodo</h3>
<canvas id="nota_media_periodo"
data-data='{{ degree_data.nota_media_periodo|safe }}'></canvas>
</div>
<br>
<div class="col-md-6">
<h3>Taxa Aprovação/Periodo</h3>
<canvas id="taxa_aprovacao_periodo"
data-data='{{ degree_data.taxa_aprovacao_periodo|safe }}'></canvas>
</div>
{% endcomment %}
<!-- fim analise sa02 -->
</div>
<br>
<!-- TODO: Add dynamic grid for each degree -->
<div class="col-md-12">
<h3>Grade curricular
......@@ -224,6 +170,74 @@
</div>
</div>
</div>
<br>
<div class="row py-3">
<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>
<div class="row py-3">
<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-6">
<h3>Nota Média/Periodo</h3>
<canvas id="nota_media_semestre"
data-data='{{ degree_data.media_disc|safe }}'></canvas>
</div> essa analise foi feita de uma maneira ruim no adega
antigo -->
<!-- analises sa02 -->
{% comment %}
<div class="col-md-6">
<h3>Alunos/Periodo</h3>
<canvas id="aluno_periodo"
data-data='{{ degree_data.aluno_periodo|safe }}'></canvas>
</div>
<br>
<div class="col-md-6">
<h3>Nota Média/Periodo</h3>
<canvas id="nota_media_periodo"
data-data='{{ degree_data.nota_media_periodo|safe }}'></canvas>
</div>
<br>
<div class="col-md-6">
<h3>Taxa Aprovação/Periodo</h3>
<canvas id="taxa_aprovacao_periodo"
data-data='{{ degree_data.taxa_aprovacao_periodo|safe }}'></canvas>
</div>
{% endcomment %}
<!-- fim analise sa02 -->
</div>
<!-- SÓ ESTA CONSIDERANDO AS PESSOAS QUE SEGUEM GRADE DE 2011. NÃO ESTÁ CALCULANDO EQUIVALENCIAS de mudança de grade. -->
<div class="row py-3">
<div class="col-md-12">
<h3> Período em que ocorrem as evasões
<a tabindex="0" class="fa fa-info-circle" data-toggler="popover" data-html="true"
data-content="Distribuição das evasões no curso.<br>
O gráfico mostra em que período os alunos evadiram do curso.
O período de evasão é definido como o primeiro a não ter todas as matérias cursadas."></a>
</h3>
<div id="evasao_periodo"></div>
</div>
</div>
</div>
</div>
......@@ -306,6 +320,7 @@
var evasao_semestre_data = convert_degree_chart_data(evasao_semestre,
y_keys_sorted);
var evasao_periodo_data = {{degree_data.evasao_grafico2|safe}};
// ira_semestral_data will be in format of:
// {"00-4.9": [10,20,30], "05-9.9": [11,21,31], ...}
......@@ -339,7 +354,20 @@
opacity:0.6,
size: 13
},
});
});
var chart3 = new AdegaChart({
data: evasao_periodo_data,
div_target: "evasao_periodo",
title: "Quantidade de evasão em cada período do curso",
type: "bar",
legend: "Alunos",
xaxis_title: "Período de evasão do curso",
yaxis_title: "Quantidade de evasões",
marker: {
opacity:0.6,
size: 13
},
});
</script>
{% endblock js-foot %}
......@@ -244,6 +244,12 @@ class DegreeGrid:
def get_situation(self, hist):
cgc = self.compute_cgc(hist)
return self.get_grid(cgc), self.get_repeated_course_info(cgc)
@staticmethod
def get_degree_grid(code):
if code == "21A":
return DegreeGrid.bcc_grid_2011
def get_degree_situation(self, courses_hist):
'''
......
......@@ -6,6 +6,7 @@ from submission.analysis.utils.situations import Situation, EvasionForm
from submission.analysis.utils.utils import IntervalCount, save_json
from submission.analysis.analysis.student_analysis import *
from submission.analysis.analysis.student_analysis import StudentAnalysis
def average_graduation(df):
......@@ -234,6 +235,56 @@ def period_evasion_graph(df):
for di in di_qtd:
qtd = di_qtd[di]
dic[di] = {'qtd': qtd, 'taxa': (float(qtd)/evasions_total)*100}
return dic
def evasion_per_period_graph(df):
"""
Build the dict for the graph that displays how many people evaded in each period of the grid
Filter df for evaded people and the needed columns
apply current_period() and counts how many times each period is returned
Returns
-------
dict of {int: int}
evasions_period = {
period: number of people evaded,
...
}
Examples
--------
{8: 3, 1: 69, 2: 48, 3: 21, 4: 14}
"""
rows = (df.FORMA_EVASAO != EvasionForm.EF_ATIVO) & (df.FORMA_EVASAO != EvasionForm.EF_FORMATURA) & (df.FORMA_EVASAO != EvasionForm.EF_REINTEGRACAO)
cols = ["MATR_ALUNO", "NUM_VERSAO_x", "COD_ATIV_CURRIC", "SITUACAO"]
evaded_students = df.loc[rows, cols]
periods = StudentAnalysis.current_period(evaded_students).values()
evasions_period = defaultdict(int)
for number in periods:
evasions_period[number] += 1
return evasions_period
def build_dict_ira_medio(alunos):
dic = {"00-4.9":0, "05-9.9":0, "10-14.9":0, "15-19.9":0, "20-24.9":0, "25-29.9":0, "30-34.9":0,
"35-39.9":0, "40-44.9":0, "45-49.9":0, "50-54.9":0, "55-59.9":0, "60-64.9":0, "65-69.9":0,
"70-74.9":0, "75-79.9":0, "80-84.9":0, "85-89.9":0, "90-94.9": 0,"95-100":0}
iras = []
for index, row in alunos.iterrows():
if(row['MEDIA_FINAL'] is not None):
iras.append(row['MEDIA_FINAL'])
for d in dic:
aux = d.split('-')
v1 = float(aux[0])
if (v1 == 0.0):
v1 += 0.01
v2 = float(aux[1])
dic[d] = sum((float(num) >= v1) and (float(num) < v2) for num in iras)
return dic
......@@ -328,6 +379,7 @@ def build_degree_json(path,df,student_analysis):
"taxa_reprovacao": general_failure(df),
"taxa_reprovacao_atual": current_students_failure(df),
"tempo_formatura": average_graduation_time(df),
"evasao_grafico2": evasion_per_period_graph(df),
}
save_json(path+"/degree.json", degree_json)
......
......@@ -4,6 +4,7 @@ from submission.analysis.utils.situations import *
from submission.analysis.utils.utils import memoize
import pandas as pd
from collections import defaultdict
from student.grid import DegreeGrid
......@@ -238,7 +239,87 @@ class StudentAnalysis:
students[x[0]] = None
return students
def current_period(df):
"""
Calculate someone's current period
Filter df for approved courses and group by student
For every student:
Attribute the followed grid
Checks if courses of period p are completed:
do this for obligatory and optatives
TO DO check for equivalents courses too
stops when a period is incompleted
(the current period is the first incompleted one)
Returns:
---------
dict of {string: int}
{"GRR": current period, "GRR": current period, ...}
"""
# filter for approved situtations and group df by student
df = df[df['SITUACAO'].isin(Situation.SITUATION_PASS)]
students_df = df.groupby("MATR_ALUNO")
student_period = {}
for student, dataframe in students_df:
# TO DO: grid recebe a grade que a pessoa segue (curso e ano)
if dataframe.iloc[0]["NUM_VERSAO_x"] == 2011:
# the academic grid is a list of lists from src/student/grid.py
grid = DegreeGrid.get_degree_grid("21A").grid
fake_codes = DegreeGrid.get_degree_grid("21A").fake_codes
opts_tgs = list(DegreeGrid.get_degree_grid("21A").equiv_codes)
else:
# print ('sem grade irmão')
continue
max_period = len(grid)-1
p = 0
period_completed = 1
checked = []
while (p < max_period):
c = 0
while c < len(grid[p]):
course = grid[p][c]
coursed = 0
# course is a normal obligatory code
if course in dataframe['COD_ATIV_CURRIC'].values:
coursed = 1
# course is a optative or tg
elif course in fake_codes:
for item in opts_tgs:
if item not in checked:
if item in dataframe['COD_ATIV_CURRIC'].values:
checked.append(item)
coursed = 1
break
# to do: caso em que recebeu equivalencia na disciplina
# equivs =
# for equiv in equivs:
# if equiv in dataframe['COD_ATIV_CURRIC'].values:
# checked.append(item)
# coursed = 1
if coursed:
c += 1
else:
period_completed = 0
break
if period_completed:
p += 1
else:
break
# p actually stands for number of completed periods
# current period is the first incompleted one
student_period[student] = p+1
return student_period
def periodo_pretendido(self, df=None):
df = df if df is not None else self.data_frame
......
......@@ -127,6 +127,7 @@ def generate_student_data(path, dataframe, student_analysis):
(student_analysis.student_info(),
"student"),
]
for x in student_data:
......
......@@ -157,7 +157,9 @@ class Situation:
SITUATION_PASS = (
SIT_APROVADO,
SIT_CONHECIMENTO_APROVADO,
SIT_DISPENSA_COM_NOTA
SIT_DISPENSA_COM_NOTA,
SIT_APROV_ADIANTAMENTO,
SIT_EQUIVALENCIA,
)
SITUATION_KNOWLDGE = (
......
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