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 = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'game5' players_per_group = 4 num_rounds = 1 num_ques_task = 40 piece_rate_payoff = 25 tournament_payoff = 100 answer_pred_payoff = 50 rank_pred_payoff = 50 num1_task5 = csv['task5_num1'] num2_task5 = csv['task5_num2'] num3_task5 = csv['task5_num3'] num4_task5 = csv['task5_num4'] num5_task5 = csv['task5_num5'] num6_task5 = csv['task5_num6'] num7_task5 = csv['task5_num7'] num8_task5 = csv['task5_num8'] num9_task5 = csv['task5_num9'] num10_task5 = csv['task5_num10'] num11_task5 = csv['task5_num11'] num12_task5 = csv['task5_num12'] num13_task5 = csv['task5_num13'] num14_task5 = csv['task5_num14'] num15_task5 = csv['task5_num15'] num16_task5 = csv['task5_num16'] num17_task5 = csv['task5_num17'] num18_task5 = csv['task5_num18'] ans_task5 = csv['task5_ans'] class Subsession(BaseSubsession): def before_session_starts(self): for p in self.get_players(): p.generate_decision_stubs() class Group(BaseGroup): def set_payoffs(self): for p in self.get_players(): p.get_payoff() class Player(BasePlayer): def generate_decision_stubs(self): for _ in range(Constants.num_ques_task): decision = self.decision_set.create() decision.save() def reward_confidence_level(self, confidence, rank): if rank == 1: return int((-50.35*(confidence**2) + 100.17*confidence - 0.007) + 1e-2) else: return int((-50.35*(confidence**2) + 0.5315*confidence + 49.811) + 1e-2) def get_payoff(self): players = self.group.get_players() choice = self.task5_choice if(choice == 'Rule 25'): self.task5_payoff = Constants.piece_rate_payoff*self.task5_correct else: other_players = self.get_others_in_group() max_val = max([x.task5_correct for x in other_players]) if(self.task5_correct == max_val): toss = random.random() if toss>=0.5 : self.task5_payoff = Constants.tournament_payoff*self.task5_correct if(self.task5_correct > max_val): self.task5_payoff = Constants.tournament_payoff*self.task5_correct ranked_players = list(sorted(players, key=operator.attrgetter('task5_correct'))) ranked_players.reverse() rank = ranked_players.index(self) + 1 self.task5_rank = rank self.task5_correct_bonus = Constants.answer_pred_payoff*(self.task5_correct_pred == self.task5_correct) self.task5_rank_bonus = Constants.rank_pred_payoff*(rank == self.task5_rank_pred) self.task5_confidence_bonus = self.reward_confidence_level(self.task5_top_chance/100., rank) self.task5_payoff += (self.task5_correct_bonus + self.task5_rank_bonus + self.task5_confidence_bonus) self.participant.vars['game4_payoff'] = self.task5_payoff task5_choice = models.StringField(choices = ['Rule 25', 'Rule 100'], widget = widgets.RadioSelect, label = "Your Choice for the task: ") task5_correct_pred = models.IntegerField(min=0, max=40, label = "How many questions do you think you will be able solve correctly in this round?") task5_correct = models.IntegerField(initial=0) task5_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 3.1, compared to the three other group members") task5_rank = models.IntegerField() task5_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)") task5_correct_bonus = models.IntegerField(initial=0) task5_rank_bonus = models.IntegerField(initial=0) task5_confidence_bonus = models.IntegerField(initial=0) task5_payoff = models.IntegerField(initial=0) reason = models.StringField() class Decision(Model): answer_task5 = models.IntegerField(label = "") player = ForeignKey(Player)