-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy path_irt_pymc3.py
163 lines (126 loc) · 5.26 KB
/
_irt_pymc3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# coding: utf-8
# http://y-okamoto-psy1949.la.coocan.jp/Python/en1/IRTLClassPyMC3/
import os
# pip3 install pymc3
# pip3 install arviz
import arviz as az
import pymc3 as pm
import numpy as np
import smtplib
import sys
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from django.http import Http404
os.system('source ../_settings.env')
from mctest.settings import BASE_DIR
from mctest.settings import webMCTest_FROM
from mctest.settings import webMCTest_PASS
from mctest.settings import webMCTest_SERVER
print("Starting IRT...")
print("File: "+str(sys.argv[1]))
file_name = str(sys.argv[1])
s = file_name.split('/')
s = s[len(s)-1].split('_')
destinatario = s[2]
print("Destination: " + destinatario)
msg = """
Prezado(a),
Gostaria de compartilhar algumas informações e estatísticas referentes às correções realizadas recentemente. Abaixo estão os detalhes para acessar e compreender os dados:
1. Gabarito: Para verificar o gabarito, consulte a primeira página do arquivo PDF. Note que isso se aplica apenas se o quadro de respostas foi utilizado exclusivamente (as questões foram fornecidas à parte).
2. Arquivo CSV: Anexado a este e-mail, você encontrará um arquivo CSV utilizado para calcular a Teoria de Resposta ao Item (TRI) da avaliação. Neste arquivo, as linhas representam os alunos, na mesma ordem apresentada no PDF mencionado.
3. Ordem das colunas: Caso a avaliação tenha incluído tanto o quadro de respostas quanto as questões do MCTest, as colunas do arquivo CSV estarão ordenadas de acordo com as chaves das questões no banco de dados.
Caso tenha dúvidas ou precise de esclarecimentos adicionais, por favor, não hesite em entrar em contato. Estou à disposição para ajudá-lo(a).
Atenciosamente,
Francisco de Assis Zampirolli\n\n
"""
msg += "REF.: http://y-okamoto-psy1949.la.coocan.jp/Python/en1/IRTLClassPyMC3/ \n\n"
msg += "==================================================\n\n"
msg += "File: %s\n\n" % "_".join([i for i in s[3:-1]])
X = np.genfromtxt(file_name, delimiter=',', dtype=int)
try:
N = len(X)
M = len(X[0])
except:
print("Erro ao calcular IRT")
exit(0)
NStg = 5 # Number of stages: A=4, B=3, C=0, D=1, F=0
msg += 'N = %s Number of students \n' % N
msg += 'M = %s Number of questions \n' % M
msg += 'NStg = %s Number of stages, for ex. 0=F, 1=D, 2=C, 3=B, 4=A \n' % NStg
a_Diri = np.ones((M, NStg + 1))
a_coeff = np.zeros((NStg, NStg + 1))
for i in range(NStg):
for j in range(i + 1):
a_coeff[i][j] = 1
a_p = np.ones(NStg)
with pm.Model() as stage_model:
prob_steps = pm.Dirichlet('prob_steps', a=a_Diri, shape=(M, NStg + 1))
coeff = pm.math.constant(a_coeff, 'coeff')
prob_response_ = pm.math.matrix_dot(coeff, prob_steps.T)
prob_response = pm.Deterministic('prob_response', prob_response_)
p_stages = pm.Categorical('p_stages', p=a_p, shape=N)
p_at_stage = pm.Deterministic('p_at_stage', prob_response[p_stages])
y = pm.Bernoulli('y', p=prob_response[p_stages], observed=X)
trace = pm.sample()
summary = az.summary(trace, var_names=['prob_response'])
ary_prob_response = trace['prob_response']
msg += '\nP(correct|item,stage)\n'
msg += '{0: >10s}'.format(' ')
for i in range(NStg):
msg += "{0:>10}".format('Stage-{}'.format(i))
msg += '\n'
for j in range(M):
msg += 'Item-{0: <7d}'.format(j+1)
for s in range(NStg):
msg += '{0: >10.5f}'.format(ary_prob_response[:, s, j].mean())
msg += '\n'
ary_p_stages = trace['p_stages']
ary_p_stages = ary_p_stages.T
msg += "\nMean stages and their SD's\n"
msg += '{0: >11s}{1:>10s}{2:>10s}\n'.format(' ', ' Mean', 'SD')
for i in range(len(ary_p_stages)):
msg += 'person-{0: <4d}{1:>10.3f}{2:>10.3f}\n'.format(i+1, ary_p_stages[i].mean(),
ary_p_stages[i].std())
v_waic = az.waic(trace)
msg += '\nWAIC = {0:.3f} for the number of stages = {1}'.format(v_waic['waic'], NStg)
msg += '\nWAIC statistics... %s\n' % v_waic
def envia_email(servidor, porta, FROM, PASS, TO, subject, texto, anexo=[]):
msg = MIMEMultipart()
msg['From'] = FROM
msg['To'] = TO
msg['Subject'] = subject
msg.attach(MIMEText(texto))
# Anexa os arquivos
for f in anexo:
# print(">>>>$$$$>>>>",f)
part = MIMEBase('application', 'octet-stream')
part.set_payload(open(f, 'rb').read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment;filename="%s"' % os.path.basename(f))
msg.attach(part)
try:
gm = smtplib.SMTP(servidor, porta)
gm.ehlo()
gm.starttls()
gm.ehlo()
gm.login(FROM, PASS)
gm.sendmail(FROM, TO, msg.as_string())
gm.close()
print("Sending email ...")
except Exception:
raise Http404(
"Nao Foi Possivel Enviar o Email.\n Error:" + str([servidor, porta, FROM, TO, subject, texto, anexo]))
print (msg)
myporta = 587
myserver = webMCTest_SERVER
assunto = "Mensagem enviada automaticamente por MCTest com estatíticas das correções"
envia_email(webMCTest_SERVER,
myporta,
webMCTest_FROM,
webMCTest_PASS,
destinatario,
assunto,
msg,
[file_name])