from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random from otree.db.models import Model, ForeignKey import pandas as pd import os import operator csv = pd.read_csv("numbers.csv") author = 'Avineil Jain' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'exp2' players_per_group = 4 num_rounds = 1 #Please ensure that all the numbers are the same for all tasks, since its stored in a csv file #Which means it can't have different number of rows for different columns num_ques_task0 = 40 num_ques_task1 = 40 num_ques_task2 = 40 num_ques_task3 = 40 piece_rate_payoff = 25 tournament_payoff = 100 answer_pred_payoff = 50 rank_pred_payoff = 50 num1_task0 = csv['task0_num1'] num2_task0 = csv['task0_num2'] num3_task0 = csv['task0_num3'] num4_task0 = csv['task0_num4'] num5_task0 = csv['task0_num5'] num6_task0 = csv['task0_num6'] num7_task0 = csv['task0_num7'] num8_task0 = csv['task0_num8'] num9_task0 = csv['task0_num9'] num10_task0 = csv['task0_num10'] num11_task0 = csv['task0_num11'] num12_task0 = csv['task0_num12'] num13_task0 = csv['task0_num13'] num14_task0 = csv['task0_num14'] num15_task0 = csv['task0_num15'] num16_task0 = csv['task0_num16'] num17_task0 = csv['task0_num17'] num18_task0 = csv['task0_num18'] ans_task0 = csv['task0_ans'] num1_task1 = csv['task1_num1'] num2_task1 = csv['task1_num2'] num3_task1 = csv['task1_num3'] num4_task1 = csv['task1_num4'] num5_task1 = csv['task1_num5'] num6_task1 = csv['task1_num6'] num7_task1 = csv['task1_num7'] num8_task1 = csv['task1_num8'] num9_task1 = csv['task1_num9'] num10_task1 = csv['task1_num10'] num11_task1 = csv['task1_num11'] num12_task1 = csv['task1_num12'] num13_task1 = csv['task1_num13'] num14_task1 = csv['task1_num14'] num15_task1 = csv['task1_num15'] num16_task1 = csv['task1_num16'] num17_task1 = csv['task1_num17'] num18_task1 = csv['task1_num18'] ans_task1 = csv['task1_ans'] num1_task2 = csv['task2_num1'] num2_task2 = csv['task2_num2'] num3_task2 = csv['task2_num3'] num4_task2 = csv['task2_num4'] num5_task2 = csv['task2_num5'] num6_task2 = csv['task2_num6'] num7_task2 = csv['task2_num7'] num8_task2 = csv['task2_num8'] num9_task2 = csv['task2_num9'] num10_task2 = csv['task2_num10'] num11_task2 = csv['task2_num11'] num12_task2 = csv['task2_num12'] num13_task2 = csv['task2_num13'] num14_task2 = csv['task2_num14'] num15_task2 = csv['task2_num15'] num16_task2 = csv['task2_num16'] num17_task2 = csv['task2_num17'] num18_task2 = csv['task2_num18'] ans_task2 = csv['task2_ans'] num1_task3 = csv['task3_num1'] num2_task3 = csv['task3_num2'] num3_task3 = csv['task3_num3'] num4_task3 = csv['task3_num4'] num5_task3 = csv['task3_num5'] num6_task3 = csv['task3_num6'] num7_task3 = csv['task3_num7'] num8_task3 = csv['task3_num8'] num9_task3 = csv['task3_num9'] num10_task3 = csv['task3_num10'] num11_task3 = csv['task3_num11'] num12_task3 = csv['task3_num12'] num13_task3 = csv['task3_num13'] num14_task3 = csv['task3_num14'] num15_task3 = csv['task3_num15'] num16_task3 = csv['task3_num16'] num17_task3 = csv['task3_num17'] num18_task3 = csv['task3_num18'] ans_task3 = csv['task3_ans'] class Subsession(BaseSubsession): def before_session_starts(self): # called each round """For each player, create a fixed number of "decision stubs" with random values to be decided upon later.""" for p in self.get_players(): p.generate_decision_stubs() p.set_paying_round() def get_treat1(self): all_players = self.get_players() tot_40 = 1.0*len([x.task3_choice for x in all_players if x.task3_choice == 'Rule 100']) tot_1040 = len([x.task3_choice for x in all_players if x.task3_choice == 'Rule 25' or x.task3_choice == 'Rule 100']) avg = (tot_40/tot_1040)*100 rndint = random.choices([1,2], weights=[tot_40/tot_1040,1-(tot_40/tot_1040)])[0] if rndint == 1: rnd = 'Rule 100' else: rnd = 'Rule 25' for p in self.get_players(): p.average = avg p.rndchoice = rnd p.set_treat1() class Group(BaseGroup): def set_payoffs(self): for p in self.get_players(): p.get_payoff() class Player(BasePlayer): def generate_decision_stubs(self): """ Create a fixed number of "decision stubs", i.e. decision objects that only have a random "value" field on which the player will base her or his decision later in the game. """ for _ in range(Constants.num_ques_task0): #This saves the answer of each question decision = self.decision_set.create() # create a new Decision object as part of the player's decision set decision.save() # important: save to DB! def set_paying_round(self): self.paying_round = random.randint(1,3) def reward_confidence_level(self, confidence, rank): if rank == 1: return int((-50.35*(confidence**2) + 100.17*confidence - 0.007) + 1e-2) #To account for approximation errors else: return int((-50.35*(confidence**2) + 0.5315*confidence + 49.811) + 1e-2) def get_payoff(self): self.task1_correct_bonus = Constants.answer_pred_payoff*(self.task1_correct == self.task1_correct_pred) self.task1_payoff = Constants.piece_rate_payoff*self.task1_correct + self.task1_correct_bonus self.participant.vars['game1_task1_payoff'] = self.task1_payoff players = self.group.get_players() ranked_players = list(sorted(players, key=operator.attrgetter('task2_correct'))) ranked_players.reverse() rank = ranked_players.index(self) + 1 self.task2_rank = rank if rank == 1: self.task2_payoff = Constants.tournament_payoff*self.task2_correct self.task2_correct_bonus = Constants.answer_pred_payoff*(self.task2_correct_pred == self.task2_correct) self.task2_rank_bonus = Constants.rank_pred_payoff*(rank == self.task2_rank_pred) self.task2_confidence_bonus = self.reward_confidence_level(self.task2_top_chance/100., rank) self.task2_payoff += (self.task2_correct_bonus + self.task2_rank_bonus + self.task2_confidence_bonus) self.participant.vars['game1_task2_payoff'] = self.task2_payoff players = self.group.get_players() choice = self.task3_choice if(choice == 'Rule 25'): self.task3_payoff = Constants.piece_rate_payoff*self.task3_correct else: other_players = self.get_others_in_group() max_val = max([x.task2_correct for x in other_players]) if(self.task3_correct == max_val): toss = random.random() if toss>=0.5 : self.task3_payoff = Constants.tournament_payoff*self.task3_correct if(self.task3_correct > max_val): self.task3_payoff = Constants.tournament_payoff*self.task3_correct ranked_players = list(sorted(players, key=operator.attrgetter('task3_correct'))) ranked_players.reverse() rank = ranked_players.index(self) + 1 self.task3_rank = rank self.task3_correct_bonus = Constants.answer_pred_payoff*(self.task3_correct_pred == self.task3_correct) self.task3_rank_bonus = Constants.rank_pred_payoff*(rank == self.task3_rank_pred) self.task3_confidence_bonus = self.reward_confidence_level(self.task3_top_chance/100., rank) self.task3_payoff += (self.task3_correct_bonus + self.task3_rank_bonus + self.task3_confidence_bonus) self.participant.vars['game1_task3_payoff'] = self.task3_payoff self.participant.vars['game1_task3_choice'] = self.task3_choice self.payoff = (self.paying_round==1)*self.task1_payoff + (self.paying_round==2)*self.task2_payoff + (self.paying_round==3)*self.task3_payoff self.participant.vars['game1_payoff'] = self.payoff self.participant.vars['game1_paying_round'] = self.paying_round def set_treat1(self): self.participant.vars['avg_treat1'] = self.average self.participant.vars['rnd_treat1'] = self.rndchoice paying_round = models.IntegerField() task0_correct = models.IntegerField(initial=0) task1_correct_pred = models.IntegerField(min=0, max=40, label = "Before you start, how many questions do you think you will be able to solve correctly in this round?") task1_correct = models.IntegerField(initial=0) task2_correct_pred = models.IntegerField(min=0, max=40, label = "Before you start, how many questions do you think you will be able to solve correctly in this round?") task2_correct = models.IntegerField(initial=0) task2_rank_pred = models.IntegerField(choices=[1,2,3,4], widget=widgets.RadioSelect, label = "1. Please indicate which rank, between 1 (topper) and 4 (last) you think you have got in Task 1.2, compared to the three other group members") task2_rank = models.IntegerField() task2_top_chance = models.IntegerField(min=0, max = 100, label = "2. Please indicate the percentage chance that you will be the top scorer in your group of four in this task (Any number between 0 and 100, no % sign)") task3_choice = models.StringField(choices = ['Rule 25', 'Rule 100'], widget = widgets.RadioSelect, label = "Your Choice for the task: ") task3_correct_pred = models.IntegerField(min=0, max=40, label = "How many questions do you think you will be able to solve correctly in this round?") task3_correct = models.IntegerField(initial=0) task3_rank_pred = models.IntegerField(choices=[1,2,3,4], widget=widgets.RadioSelect, label = "1. Please indicate which rank, between 1 (topper) and 4 (last) you think you have got in Task 1.3, compared to the three other group members") task3_rank = models.IntegerField() task3_top_chance = models.IntegerField(min=0, max = 100, label = "2. Please indicate the percentage chance that you will be the top scorer in your group of four in this task (Any number between 0 and 100, no % sign) ") task1_correct_bonus = models.IntegerField(initial=0) task1_payoff = models.IntegerField(initial=0) task2_correct_bonus = models.IntegerField(initial=0) task2_rank_bonus = models.IntegerField(initial=0) task2_confidence_bonus = models.IntegerField(initial=0) task2_payoff = models.IntegerField(initial=0) task3_correct_bonus = models.IntegerField(initial=0) task3_rank_bonus = models.IntegerField(initial=0) task3_confidence_bonus = models.IntegerField(initial=0) task3_payoff = models.IntegerField(initial=0) average = models.FloatField() rndchoice = models.StringField() class Decision(Model): answer_task0 = models.IntegerField(label = "") answer_task1 = models.IntegerField(label = "") answer_task2 = models.IntegerField(label = "") answer_task3 = models.IntegerField(label = "") player = ForeignKey(Player)