import numpy as np from numpy import median from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import time author = ' ' doc = """ Raven's progressive matrices test measuring cognitive ability """ class Constants(BaseConstants): name_in_url = 'survey' players_per_group = None num_rounds = 1 # crt payment_for_crt = 1.0 answer_keys_crt = [0.05, 5, 47] # raven payment_for_raven = 0.5 minutes_given = 6 num_question = 12 payment_per_question = 0.5 answer_keys_raven = [8, 8, 1, 1, 3, 6, 1, 5, 7, 5, 2, 3] instructions_payment = 'survey/Instructions_payment.html' instructions_slider = 'survey/SliderInstructions.html' class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): # Questionnaire questionnaire_1 = models.StringField(choices=['男', '女'], widget=widgets.RadioSelectHorizontal) questionnaire_2 = models.IntegerField(min=0, max=99) questionnaire_3 = models.StringField(choices=['哲学', '经济', '法律', '教育', '文学', '历史学', '自然科学', '工科', '农业科学', '医学', '管理学', '艺术', '外语', '测绘', '其它'], widget=widgets.RadioSelectHorizontal) questionnaire_32 = models.StringField(blank=True) questionnaire_4 = models.StringField(choices=['1万以下', '1万-3万', '3万-6万', '6万以上'], widget=widgets.RadioSelectHorizontal) questionnaire_5 = models.StringField(choices=['大一', '大二', '大三', '大四', '研一', '研二', '研三', '博士'], widget=widgets.RadioSelectHorizontal) questionnaire_6 = models.StringField(choices=['人们生活中的许多不愉快的事情部分是由于运气不好', '人们的不幸源于他们所犯的错误'], widget=widgets.RadioSelect) questionnaire_7 = models.StringField(choices=['发生战争的一个主要原因是人们对政治没有足够的兴趣', '无论人们多么努力地去阻止,战争总是会发生的'], widget=widgets.RadioSelect) questionnaire_8 = models.StringField(choices=['从长远来看,人们在这个世界上会得到他们应得的尊重', '不幸的是,无论一个人多么努力,他的价值往往并不为人所知'], widget=widgets.RadioSelect) questionnaire_9 = models.StringField(choices=['认为教师对学生不公平的想法是无稽之谈', '大多数学生没有意识到他们的成绩在多大程度上受到偶然事件的影响'], widget=widgets.RadioSelect) questionnaire_10 = models.StringField(choices=['没有适当的休息时间,一个人就不能成为一个有效的领导者', '有能力却不能成为领导者的人,没有利用好他们的机会'], widget=widgets.RadioSelect) questionnaire_11 = models.StringField(choices=['无论你多么努力,有些人就是不喜欢你', '不能让别人喜欢自己的人,是不懂得如何与人相处的'], widget=widgets.RadioSelect) questionnaire_12 = models.StringField(choices=['我常常发现,要发生的事情总会发生', '对我来说,听天由命从来没有像决定采取明确的行动那样好'], widget=widgets.RadioSelect) questionnaire_13 = models.StringField(choices=['对于准备充分的学生而言,很少有不公平的考试', '很多时候,考试的问题往往与课程无关,以至于学习真的毫无用处'], widget=widgets.RadioSelect) questionnaire_14 = models.StringField(choices=['成功需要努力,运气与此几乎没有关系', '获得一份好工作主要取决于天时地利人和'], widget=widgets.RadioSelect) questionnaire_15 = models.StringField(choices=['普通公民可以对政府决策产生影响', '这个世界是由少数掌权者控制的,小人物对此无能为力'], widget=widgets.RadioSelect) questionnaire_16 = models.StringField(choices=['当我制定计划时,我几乎肯定我能使它们奏效', '提前计划太多并不总是明智的,因为许多事情最后都是运气问题'], widget=widgets.RadioSelect) questionnaire_17 = models.StringField(choices=['就我而言,得到我想要的东西与运气几乎没有关系', '很多时候,我们还不如通过抛硬币来决定做什么'], widget=widgets.RadioSelect) questionnaire_18 = models.StringField(choices=['发生在我身上的事情是我自己造成的', '有时我觉得我对生活的方向控制不够'], widget=widgets.RadioSelect) questionnaire_19 = models.StringField(choices=['是', '否'], widget=widgets.RadioSelect) questionnaire_20 = models.StringField( choices=['0 完全不愿意', '1', '2', '3', '4', '5', '6', '7 非常愿意'], widget=widgets.RadioSelectHorizontal) questionnaire_21 = models.StringField( choices=['0 完全不愿意', '1', '2', '3', '4', '5', '6', '7 非常愿意'], widget=widgets.RadioSelectHorizontal) slider1 = models.FloatField() slider2 = models.FloatField() slider3 = models.FloatField() slider4 = models.FloatField() slider5 = models.FloatField() slider6 = models.FloatField() slider_angle = models.DecimalField(decimal_places=2, max_digits=5) slider_classification = models.StringField() belief = models.StringField(choices=['亲自我', '亲社会'], widget=widgets.RadioSelect) # crt CRT1 = models.FloatField(label='1. 一副球拍和一个球一共价值1.10美元,球拍比球贵1美元,请问球的单价是多少美元 ') CRT2 = models.FloatField(label='2. 如果5台机器5分钟可以生产5个零件,那么100台机器生产100个零件需要多少分钟 ') CRT3 = models.FloatField(label='3. 湖里有一片睡莲。每一天,睡莲的覆盖面积都是原来的两倍。如果睡莲覆盖整个湖需要48天,那么睡莲覆盖半个湖需要多少天 ') total_answer = models.IntegerField() # 答对的题目个数 crt_payoff = models.FloatField() # 总收益=答对的题目个数*0.1 def set_payoff_crt(self): answer = [self.CRT1, self.CRT2, self.CRT3] print(answer) self.total_answer = 0 for i in range(1, 4): if answer[i - 1] == Constants.answer_keys_crt[i - 1]: self.total_answer += 1 # 一一对应个数 self.crt_payoff = self.total_answer * Constants.payment_for_crt # 答对的总个数乘以每道题的报酬 # raven answer1_1 = models.IntegerField(choices=[0, 1, 2, 3, 4, 5, 6, 7, 8]) answer1_2 = models.IntegerField(choices=[0, 1, 2, 3, 4, 5, 6, 7, 8]) answer1_3 = models.IntegerField(choices=[0, 1, 2, 3, 4, 5, 6, 7, 8]) answer1_4 = models.IntegerField(choices=[0, 1, 2, 3, 4, 5, 6, 7, 8]) answer1_5 = models.IntegerField(choices=[0, 1, 2, 3, 4, 5, 6, 7, 8]) answer1_6 = models.IntegerField(choices=[0, 1, 2, 3, 4, 5, 6, 7, 8]) answer1_7 = models.IntegerField(choices=[0, 1, 2, 3, 4, 5, 6, 7, 8]) answer1_8 = models.IntegerField(choices=[0, 1, 2, 3, 4, 5, 6, 7, 8]) answer1_9 = models.IntegerField(choices=[0, 1, 2, 3, 4, 5, 6, 7, 8]) answer1_10 = models.IntegerField(choices=[0, 1, 2, 3, 4, 5, 6, 7, 8]) answer1_11 = models.IntegerField(choices=[0, 1, 2, 3, 4, 5, 6, 7, 8]) answer1_12 = models.IntegerField(choices=[0, 1, 2, 3, 4, 5, 6, 7, 8]) total_correct = models.IntegerField() # 答对的题目个数 ravens_payoff = models.FloatField() # 总收益=答对的题目个数*0.1 def set_payoff_raven(self): answer = [self.answer1_1, self.answer1_2, self.answer1_3, self.answer1_4, self.answer1_5, self.answer1_6, self.answer1_7, self.answer1_8, self.answer1_9, self.answer1_10, self.answer1_11, self.answer1_12] print(answer) self.total_correct = 0 for i in range(1, 13): if answer[i - 1] == Constants.answer_keys_raven[i - 1]: self.total_correct += 1 # 一一对应个数 self.ravens_payoff = self.total_correct * Constants.payment_per_question # 答对的总个数乘以每道题的报酬 def trans(self): # crt self.participant.vars['crt_payoff_trans'] = self.crt_payoff self.participant.vars['total_answer_trans'] = self.total_answer # raven self.participant.vars['ravens_payoff_trans'] = self.ravens_payoff self.participant.vars['total_correct_trans'] = self.total_correct