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_phase3ver1_demo/AsianData.csv') # Asian Data for payment BData = pd.read_csv('eval_phase3ver1_demo/BlackData.csv') # Black Data for payment WData1 = pd.read_csv('eval_phase3ver1_demo/WhiteData1.csv') # White (vs Asian) Data for payment WData2 = pd.read_csv('eval_phase3ver1_demo/WhiteData2.csv') # White (vs Black) Data for payment class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): order0 = models.IntegerField() # demo+control ch1 = models.FloatField() # choice1 r1 = models.IntegerField() # demo+control+freq ch2 = models.FloatField() # choice 2 r2 = models.IntegerField(initial=0) # ratio choice (with frequency) # info parameters demowtp = models.FloatField() # demographic wtp contwtp = models.FloatField() # control wtp freq = models.FloatField() # frequency from the worker study # 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() instlog = models.IntegerField() # Result info payId = models.StringField() p1 = 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) # player.order0 = y[0] player.order0 = 2 if player.order0 == 1: # 1 = social l, White vs Asian player.demowtp = 11.83 player.contwtp = 13.59 player.freq = 48 if player.order0 == 2: # 2 = math l, White vs Black player.demowtp = 11.43 player.contwtp = 12.69 player.freq = 10 class InstG(Page): form_model = "player" form_fields = ["compG1", "instlog"] @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'] != 1: return 'Please try again.' class Task1(Page): form_model = 'player' form_fields = ['ch1', 'r1'] def vars_for_template(player: Player): infoD = player.demowtp infoC = player.contwtp return dict( infoD=infoD, infoC=infoC, ) class Task2(Page): form_model = 'player' form_fields = ['ch2', 'r2'] def vars_for_template(player: Player): infoD = player.demowtp infoC = player.contwtp f1 = player.freq f2 = 100-f1 if player.order0 == 1: rev = 14.8 elif player.order0 == 2: rev = 11 return dict( infoD=infoD, infoC=infoC, f1=f1, f2=f2, rev=rev ) class Results(Page): form_model = 'player' def before_next_page(player: Player, timeout_happened): IDAsian = C.AData.values IDBlack = C.BData.values IDWhite1 = C.WData1.values IDWhite2 = C.WData2.values if player.order0 == 1: # 2 = social l Acandi = int(random.uniform(43, 95)) if Acandi == 95: Acandi = 94 player.payId = IDAsian[Acandi][0] player.p1 = IDAsian[Acandi][3] if player.order0 == 2: # 5 = math l, White vs Black Bcandi = int(random.uniform(0, 62)) if Bcandi == 62: Bcandi = 61 player.payId = IDBlack[Bcandi][0] player.p1 = IDBlack[Bcandi][3] player.payoff = 0.1*(10*(player.p1+1) - player.ch2 ) class Results2(Page): def vars_for_template(player: Player): x = (10*(player.p1+1) - player.ch2) 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]