from otree.api import * import pandas as pd import random doc = """ Your app description """ # super simple version with only once race class C(BaseConstants): NAME_IN_URL = 'eval_phase3' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 AData = pd.read_csv('eval_phase3ver2_demo/AsianData.csv') # Asian Data for payment BData = pd.read_csv('eval_phase3ver2_demo/BlackData.csv') # Black Data for payment class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): race = models.StringField() # task variables belief = models.FloatField(min=0, max=100) wage = models.FloatField() # admin info consent_choice = models.StringField( label="", choices=["Consent", "Do not consent"], widget=widgets.RadioSelect ) prolific_id = models.StringField(label="What is your Prolific ID?") compG1 = models.IntegerField() compG2 = models.IntegerField() # Result info payId = models.StringField() p1 = models.IntegerField() paytask = models.IntegerField() payinfo = models.IntegerField() # PAGES class Consent(Page): pass class Consent2(Page): form_model = "player" form_fields = ['consent_choice'] class EndNowC(Page): @staticmethod def is_displayed(player): return player.consent_choice == 'Do not consent' class ProlificID(Page): form_model = "player" form_fields = ["prolific_id"] def before_next_page(player: Player, timeout_happened): # dist0 = [1/2, 1/2] # number0 = [1, 2] # y = random.choices(number0, dist0, k=1) # # if y[0] == 1: # player.race = 'Asian' # elif y[0] == 2: # player.race = 'Black' player.race = 'Asian' class ProlificID2(Page): pass class InstG(Page): form_model = "player" form_fields = ["compG1"] @staticmethod def error_message(player, values): if values['compG1'] != 2: return 'Please try again.' class InstG2(Page): form_model = "player" form_fields = ["compG2"] @staticmethod def error_message(player, values): if values['compG2'] != 3: return 'Please try again.' class Task1(Page): form_model = 'player' form_fields = ['belief', 'wage'] @staticmethod def is_displayed(player): return player.race == 'Asian' def error_message(player, values): if values['wage'] == 0: return 'Please choose a wage greater than 0.' class Task2(Page): form_model = 'player' form_fields = ['belief', 'wage'] @staticmethod def is_displayed(player): return player.race == 'Black' def error_message(player, values): if values['wage'] == 0: return 'Please choose a wage greater than 0.' class Results(Page): form_model = 'player' def before_next_page(player: Player, timeout_happened): IDAsian = C.AData.values IDBlack = C.BData.values dist0 = [1/2, 1/2] number0 = [1, 2] y = random.choices(number0, dist0, k=1) player.paytask = y[0] if player.race == 'Asian': Acandi = int(random.uniform(0, 52)) if Acandi == 52: Acandi = 51 player.payId = IDAsian[Acandi][0] player.p1 = IDAsian[Acandi][3] if player.race == 'Black': Bcandi = int(random.uniform(0, 62)) if Bcandi == 62: Bcandi = 61 player.payId = IDBlack[Bcandi][0] player.p1 = IDBlack[Bcandi][3] if y[0] == 1: x = player.belief / 100 numbers = [10, 0] if player.p1 == 1: dist = [1 - (1 - x) ** 2, (1 - x) ** 2] if player.p1 == 0: dist = [1 - x ** 2, x ** 2] x2 = random.choices(numbers, dist, k=1) player.payinfo = x2[0] player.payoff = 0.1*x2[0] if y[0] == 2: list0 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] random.shuffle(list0) x = list0[0] player.payinfo = x if player.wage < x: player.payoff = 0 if player.wage == x: player.payoff = 0.1*(10*(player.p1+1) - x) if player.wage > x: player.payoff = 0.1 * (10 * (player.p1 + 1) - x) class Results2(Page): def vars_for_template(player: Player): if player.paytask == 1: x = player.payinfo if player.paytask == 2: if player.wage < player.payinfo: x='Your wage is less than the actual wage. Thus you do not hire and paid 0.' if player.wage == player.payinfo: x = 10 * (player.p1 + 1) - player.payinfo if player.wage > player.payinfo: x = 10 * (player.p1 + 1) - player.payinfo if player.p1 == 0: t1 = 'Low' pay1 = 10 if player.p1 == 1: t1 ='High' pay1 = 20 return dict( t1=t1, pay1=pay1, x=x ) page_sequence = [Consent, Consent2, EndNowC, ProlificID, InstG, InstG2, Task1, Task2, Results, Results2]