From 0ff5402a1f87dccb48ec98ca9bc2b59eddff443b Mon Sep 17 00:00:00 2001
From: odair mario <badwolves123@gmail.com>
Date: Wed, 27 Dec 2017 01:25:18 -0200
Subject: [PATCH] iniciado grafico_compara_nota, aviso em
 script/utils/situation.py

---
 script/analysis/course_analysis.py | 71 +++++++++++++++++++++++++++---
 script/utils/situations.py         |  9 ++++
 2 files changed, 75 insertions(+), 5 deletions(-)

diff --git a/script/analysis/course_analysis.py b/script/analysis/course_analysis.py
index 6893d93..8e41ba0 100644
--- a/script/analysis/course_analysis.py
+++ b/script/analysis/course_analysis.py
@@ -219,11 +219,29 @@ def reprovacao(qtd,disciplina,qtd_matr,taxa_reprov_absoluta,taxa_reprov_freq):
         disciplina[taxa_reprov_absoluta] = 0.0
         disciplina[taxa_reprov_freq] = 0.0 
 
-def nota(notas_df,disciplina,index):
+"analises que envolvem nota e disciplina, como nota media geral, nota media
+ultima vez que foi ofertado, grafico de comparacao de intervalo/nota.
+as diferença entre as analises nota media geral, desvio padrao geral para nota
+media ultimo, desvio padrao ultimo é apenas a quandidade de linhas do nota_df e
+o nome da chave no dicionario disciplina, logo eu passo o nome da chave como
+parametro e mudo o notas_df, assim posso reutilizar o codigo.
+O grafico compara_nota precisa de um notas_df geral, um laço que itera cada
+lunha do dataframe e verifica em qual intervalo está a nota, logo se eu fizer um
+if para verificar se o notas_df é geral ou ultimo, posso aproveitar fazer as
+analises gerais e o grafico percorrendo uma unica vez o dataframe. A desvantagem
+é de a função fugir de seu escopo." 
+def nota(notas_df,disciplina,index,grafico,seme_geral):
     notas = [] 
+    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}
     for i in notas_df.iterrows():
         if i[1].SITUACAO in sit.SITUATION_AFFECT_IRA:
-            nota = 0 if np.isnan(i[1].MEDIA_FINAL) else i[1].MEDIA_FINAL  
+            if seme_geral: #True para quando nota_df é geral e False para quando é ultimo
+                pass
+            nota = 0 if np.isnan(i[1].MEDIA_FINAL) else i[1].MEDIA_FINAL     
+            #alguns valores de media_final não são confiaveis na tabela .33
+            nota = 0 if nota > 100 else nota 
             notas.append(nota) 
 
     if len(notas) != 0: 
@@ -381,25 +399,68 @@ def listagem_disciplina(lista_disciplinas):
     compara_aprov = {} 
     disciplinas = {} 
     # nota media de todas as disciplinas
-    #n 
+    taxa_trancamento = 0.0
+    taxa_reprovacao = 0.0
+    taxa_conhecimento = 0.0
+    nota_media = [] # lista que contem todas as notas medias de todas as disciplinas
+    nota_desvio = [] # lista que contem todos os desvio padrao de todas as disciplinas 
+
     for disciplina in lista_disciplinas.keys(): 
         disciplina_dict = lista_disciplinas[disciplina] 
+
         cache[disciplina] = {"nota":disciplina_dict["nota"],
                 "taxa_reprovacao_absoluta":disciplina_dict["taxa_reprovacao_absoluta"],
                 "taxa_reprovacao_frequencia": disciplina_dict["taxa_reprovacao_frequencia" ],
                 "taxa_trancamento":disciplina_dict["taxa_trancamento"]}  
         compara_disciplina = [] 
+        
+        #calcula aprovacao semestral
         for ano in disciplina_dict["aprovacao_semestral"].keys():  
             aprov_por_ano = [ano,disciplina_dict["aprovacao_semestral"][ano][0]] 
             compara_disciplina.append(aprov_por_ano) 
+
         compara_aprov[disciplina] = compara_disciplina 
         disciplinas[disciplina] = disciplina_dict["disciplina_nome"]  
+
+        taxa_conhecimento += disciplina_dict["taxa_conhecimento"] 
+        taxa_trancamento += disciplina_dict["taxa_trancamento" ] 
+        taxa_reprovacao += disciplina_dict["taxa_reprovacao_absoluta" ] 
+        nota_media.append(disciplina_dict["nota"][0])  
+        nota_desvio.append(disciplina_dict["nota"][1])  
+        #print(disciplina_dict["nota"][0])  
+        #print(disciplina_dict["nota"][1])  
+
+    #transformando as listas nota_media e nota_desvio para numpy array, para
+    #poder utilizar os metodos np.mean()  e np.std() por questão de desepenho. 
+    nota_media_np = np.array(nota_media) 
+    nota_desvio_np = np.array(nota_desvio) 
+    media= np.mean(nota_media_np) 
+    desvio= np.std(nota_desvio_np) 
+    #verifica se o resultado final não é nan
+    if np.isnan(media):
+        media = 0.0
+    if np.isnan(desvio):
+        desvio = 0.0
+
+    #calcula os valores medios das taxas de todas as disciplinas
+    qtd_disciplina = len(lista_disciplinas.keys()) 
+    if qtd_disciplina != 0:
+        taxa_conhecimento /= qtd_disciplina 
+        taxa_trancamento /= qtd_disciplina
+        taxa_reprovacao /= qtd_disciplina
+
     listagem = { "cache" : cache,
             "compara_aprov":  compara_aprov,
-            "disciplinas": disciplinas} 
+            "disciplinas": disciplinas,
+            "taxa_conhecimento":taxa_conhecimento,
+            "taxa_trancamento":taxa_trancamento,
+            "taxa_reprovacao": taxa_reprovacao, 
+            "nota": [float(media),float(desvio) ] 
+            } 
     with open("cache/disciplinas.json",'w') as f:
         f.write(json.dumps(listagem,indent=4)) 
-        
+ # [ ] ->media_disc
+ # [ ] compara_aprov 
 
 def analises_disciplinas(df):
     lista_disciplinas = {}
diff --git a/script/utils/situations.py b/script/utils/situations.py
index 80f2b17..3884823 100644
--- a/script/utils/situations.py
+++ b/script/utils/situations.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 # == Admission Form == #
 class AdmissionType:
     AT_DESCONHECIDO = 0
@@ -65,6 +66,14 @@ class EvasionForm:
     )
 
 # == Situation Courses == #
+#note:  os valores da coluna media_final não são confiavel, situation como
+# reprovacao,reprovacao_freq,dispensa_com_nota aparecem em algumas linha como
+# 9999, o valor 9999 é o valor definido pelo sie para ser o 'null' na tabela
+# .33, na tabela .18 o 'null' é o zero e não ocorre problema de calculo de
+# nota/ira  
+# orientaçao: verificar se media_final é maior que 100 se sim atribua 0 se nao
+# atribua media_final
+
 class Situation:
     SIT_DESCONHECIDA = 0
 
-- 
GitLab