From 9c1174516da83fd49603ad7a2951afd9fc705952 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Denis=20Rodrigues?= <joao.denisr@gmail.com>
Date: Fri, 28 Jul 2017 12:21:21 -0300
Subject: [PATCH] Template do analysis degree

---
 src/admission/analysis.py | 116 ++++++++++++++++++++++++++++++++++++++
 src/degree/analysis.py    |  33 ++++++++++-
 src/script.py             |  34 ++++++++---
 src/utils/data.py         |  31 ++++++++++
 4 files changed, 203 insertions(+), 11 deletions(-)

diff --git a/src/admission/analysis.py b/src/admission/analysis.py
index e69de29..7a695cc 100644
--- a/src/admission/analysis.py
+++ b/src/admission/analysis.py
@@ -0,0 +1,116 @@
+# -*- coding:utf-8 -*-
+from __future__ import division
+from django.shortcuts import get_object_or_404
+from django.db import models
+from student.models import Student
+from klass.models import *
+from admission.models import Admission
+from degree.models import *
+from datetime import datetimme
+import collections
+import json
+import math
+
+def calculate_average_ira(admission):
+    students = admission.student_set.all()
+    average = 0
+    amount = 0
+    for student in students:
+        if student.ira is not None:
+            average += student.ira
+            amount += 1
+
+    if amount == 0:
+        return -1
+    else:
+        average /= n
+        return average
+
+def calculate_avera_ira_standard_deviation(admission):
+    average_ira = calculate_average_ira(admission)
+    students = admission.student_set.all()
+    variance = 0
+    amount = 0
+
+    for student in students:
+        if student.ira is not None:
+            variance += math.pow(aluno.ira - average_ira, 2)
+            amount += 1
+
+    if amount == 0:
+        return -1
+    else:
+        variance /= n
+        standard_deviation = math.sqrt(variance)
+        return (average_ira, standard_deviation]
+
+def calculate_ira_semester(admission, year, semester, amount_semesters):
+    students = admission.student_set.all()
+    average = 0
+    amount = 0
+   
+    for student in students: 
+        time = studnet.get_time_in_degree()
+        if amount_semesters < time:
+            amount_semesters = time
+
+        student_klass_semester = student.studentklass_set.filter(klass__year = year, klass__semester = semester)
+        ira_semester = calculate_ira(student_klass_semester)
+        if ira_semester >= 0:
+            average += ira_semester
+            amount += 1
+
+    if amount == 0
+        return -1
+    else:
+        return average/amount
+
+def calculate_ira_semester_standard_deviation(average, admission, year, semester, amount_semesters):
+    students = admission.student_set.all()
+    variance = 0
+    amount = 0
+
+    for student in students:
+        time = student.get_time_in_degree()
+        if amount_semesters = time
+            amount_semesters = time
+        student_klass_semester = student.studentklass_set.filter(klass__year = year, klass__semester = semester)
+        ira_semester = calculate_ira(student_klass_semesters)
+
+        if ira_semester >= 0:
+            variance += math.pow(ira_semester - average, 2)
+            amount += 1
+
+    if amount == 0
+        return -1
+    else:
+        return math.sqrt(variancia/amount)
+
+def calculate_average_ira_semester(admission):
+    averages = {}
+    students = admission.student_set.all()
+    year = admission.year
+    semester = admission.semester
+    amount_semesters = 0
+    for student in students:
+        time = student.get_time_in_degree()
+        if amount_semesters < time:
+            amount_semesters = time
+
+    for i in range(0, amount_semesters - 1):
+        key = "{}/{}".format(year, semester)
+        ira_average = calculate_ira_semester(admission, year, semester, amount_semesters)
+        ira_standard_deviation = calculate_ira_semester_standard_deviation(ira_average, admission, year, semester, amount_semesters)
+        averages[key] = [ira_average, ira_standard_deviation]
+
+        semester = (semester % 2) + 1
+        year += semester % 2
+
+    ordered_dict = collections.OrderedDict(sorted(average.items()))
+    return ordered_dict
+
+def calculate_pass_rate_semester(students):
+    semesters = {}
+    total_semesters = {}
+    new_semesters = {}
+    temp_semesters = {}
diff --git a/src/degree/analysis.py b/src/degree/analysis.py
index 4a3aadc..b088e85 100644
--- a/src/degree/analysis.py
+++ b/src/degree/analysis.py
@@ -6,7 +6,28 @@ import numpy as np
 import math
 
 
-def graph_period(degree):
+def average_graduation(degree): # media_formandos
+    pass
+
+def average_time_graduation_degree(degree): # tempo_medio_formatura_curso
+    pass
+
+def average_general_failure_standard_deviation(degree): # media_reprovacao_geral_desvio_padrao
+    pass
+
+def average_actives_failure_standard_deviation(degree): # media_reprovacao_alunos_cursando_desvio_padrao
+    pass
+
+def calculate_average_general_ira_standard_deviation(degree): # calcular_ira_medio_geral_desvio_padrao
+    pass
+
+def calculate_average_actives_ira_standard_deviation(degree): # calcular_ira_medio_atual_desvio_padrao
+    pass
+
+def calculate_general_evasion(degree): # calcular_evasao_geral
+   pass
+
+def graph_evasion(degree): # grafico_periodo
     admissions = Admission.objects.filter(degree = degree)
     dict_amount = {}
     dic = {}
@@ -17,7 +38,7 @@ def graph_period(degree):
         semester = admission.semester
         index_semester_evasion = 0
 
-def student_retirement(degree):
+def student_retirement(degree): # jubilamento_alunos
     year = degree.report_year
     semester = degree.report_semester
     curriculum = Curriculum.objects.filter(degree = degree)
@@ -29,7 +50,10 @@ def student_retirement(degree):
 
     return students
 
-def student_lock(degree):
+def amount_students_actives(degree): # quantidade_alunos_atual
+    pass
+
+def student_lock(degree): # trancamento_alunos
     students = Student.objects.filter(admission__degree = degree, 
                    evasion_form = "Sem evasão")
     lockings = StudentKlass.objects.filter(student__in = students,
@@ -67,3 +91,6 @@ def student_lock(degree):
         previous_semester = locking.klass.semester
 
     return amount_locking
+
+def student_gradueted(degree): # formando_alunos
+    pass
diff --git a/src/script.py b/src/script.py
index c464b2b..ddcd815 100644
--- a/src/script.py
+++ b/src/script.py
@@ -55,21 +55,39 @@ def generate_data():
         path = 'cache/curso/' + degree.code
         if not os.path.exists(path):
             os.mkdir(path)
-            generate_degree_data(degree)
-
+        generate_degree_data(degree, path)
+        generate_student_data(degree, path)
+        generate_student_list_data(degree, path)
+        generate_admission_data(degree, path)
+        generate_list_admission_data(degree, path)    
+        generate_course_data(degree, path)
+        generate_course_general_data(degree, path)
+        generate_cepe9615(degree, path)
 
 def generate_degree_data(degree, path):
     average_graduation = average_graduation(degree) # media_formandos
     dic = merge_dicts(graph_average_ira(degree), graph_average_ira_evasion_semester(degree), graph_average_ira_graduation(degree), ['average_ira', 'semester_evasion', 'graduation'])
-'''
     degree_data = {
-        'time_graduation': average_time_to_graduation_degree(degree),
+        'time_graduation': average_time_graduation_degree(degree),
         'graduation_rate': average_graduation[0],
         'student_amount': average_graduation[1],
-        'failure_rate': averag
-        'ira_average':
-
+        'failure_rate': average_general_failure_standard_deviation(degree),
+        'failure_actives': average_actives_failure_standard_deviation(degree),
+        'ira_average': calculate_average_general_ira_standard_deviation(degree),
+        'ira_actives': calculate_average_actives_ira_standard_deviation(degree),
+        'evasion_rate': calculate_general_evasion(degree),
+        'average_ira_graph': json.dumps(sorted(dic.items())),
+        'evasion_graph': json.dumps(sorted(graph_evasion(degree).items())),
+        'retirement': student_retirement(degree),
+        'amount_student_actives': amount_student_actives(degree),
+        'total_students': Student.objects.filter(admission__degree = degree).count(),
+        'amount_locking': student_lock(degree),
+        'gradueted': student_gradueted(degree)
     }
-'''
+
+    with io.open(path + '/degree.json', 'w', encoding='utf8') as output:
+        str_ = json.dumps(degree_data, indent = 4, sort_keys = True,
+                   separators=(',',': '), ensure_ascii = False)
+        output.write(to_unicode(str_))
 if __name__ == '__main__':
     main()
diff --git a/src/utils/data.py b/src/utils/data.py
index d992ee2..3f10f13 100644
--- a/src/utils/data.py
+++ b/src/utils/data.py
@@ -29,6 +29,18 @@ SITUATION_PASS = ( # Situacoes aprovacao
     u'Aprovado Conhecimento',
 )
 
+SITUATION_CANCELLATION = ( # Situacoes de cancelamento
+    u'Cancelado',
+)
+
+SITUATIONS_PASS_KNOWLEDGE = (
+    u'Aprovado Conhecimento',
+)
+
+SITUATIONS_FAIL_KNOWLEDGE = (
+    u'Reprovado Conhecimento',
+)
+
 
 SITUATION_NO_EVASION = ( # Situacoes nao evasao
     u'Sem evasão',
@@ -36,6 +48,25 @@ SITUATION_NO_EVASION = ( # Situacoes nao evasao
     u'Reintegração',
 )
 
+SITUATION_EVASION_OTHERS = (
+    u'Cancelamento a Pedido do Calouro',
+    u'Cancelamento Pedido',
+    u'Descumprimento Edital',
+    u'Desistência',
+    u'Desistência Vestibular',
+    u'Falecimento',
+    u'Jubilamento',
+    u'Não Confirmação de Vaga',
+    u'Novo Vestibular',
+    u'Reopção',
+    u'Término de Registro Temporário',
+    u'Transferência Externa',
+    u'Cancelamento Convênio',
+    u'Cancelamento Judicial',
+    u'Desistência PROVAR',
+    u'Reintegração'
+)
+
 SITUATION_LOCKING = ( # Situacoes trancamento
     u'Trancamento Total',
     u'Trancamento Administrativo'
-- 
GitLab