from otree.api import * import random doc = """ Choice matching. Survey (randomized order) """ class C(BaseConstants): NAME_IN_URL = 'CM_survey' PLAYERS_PER_GROUP = None surveys = ['1', '2', '3', '4'] NUM_ROUNDS = len(surveys) DC_scenarios = [(2, 5.5, 5, 4.5), (1, 6, 4, 4), (5, 4.5, 3, 5.5), (4, 5, 5, 4.5), (3, 4, 2, 6), (6, 4.5, 1, 5), (1, 4, 6, 5.5), (2, 5, 3, 5), (6, 5.5, 2, 4)] aux_scenarios = [(2, 5.5, 5, 4.5), (1, 6, 4, 4), (5, 4.5, 3, 5.5), (4, 5, 5, 4.5), (3, 4, 2, 6), (6, 4.5, 1, 5), (1, 4, 6, 5.5), (2, 5, 3, 5), (6, 5.5, 2, 4)] # Price levels (check how to put them in list and draw from it) level1 = 4 level2 = 4.5 level3 = 5 level4 = 5.5 level5 = 6 # Probabilities prob_l = 60 prob_m = 75 prob_h = 90 # Quadratic scoring rules quadratic_score_A = 2 quadratic_score_B = 2 prob_replace_l = 60 prob_replace_m = 75 prob_replace_h = 90 prob_not_replace_l = 100 - prob_replace_l prob_not_replace_m = 100 - prob_replace_m prob_not_replace_h = 100 - prob_replace_h # Number of task tasks = ['1', '2', '3', '4', '5', '6', '7', '8', '9'] num_CE = len(tasks) # payoff frequency method payoff_fr = 4 exchange_pounds = 0.87 frequency_pounds = payoff_fr * exchange_pounds # Experimental budget budget = 6 budget_aux = 6 matching_timeout_mins = 5 smaller_group = 8 timeout = 5 class Subsession(BaseSubsession): pass def creating_session(subsession: Subsession): if subsession.round_number == 1: for p in subsession.get_players(): # Questionnaire pages round_numbers = list(range(1, C.NUM_ROUNDS + 1)) random.shuffle(round_numbers) p.participant.surveys_rounds = dict(zip(C.surveys, round_numbers)) p.participant.num_rounds = C.NUM_ROUNDS class Group(BaseGroup): pass class Player(BasePlayer): frequency_prediction = models.BooleanField() beliefs = models.IntegerField( choices=[[1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"]], widget=widgets.RadioSelectHorizontal) risk_1 = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[[1, "Decisamente no"], [2, '2'], [3, '3'], [4, '4'], [5, "Decisamente sì"]]) dospert_1 = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[1, 2, 3, 4, 5, 6, 7], label='Scommettere la paga di un giorno alle corse dei cavalli') dospert_2 = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[1, 2, 3, 4, 5, 6, 7], label='Investire il 10% del proprio reddito annuo in un fondo d’investimento diversificato a crescita moderata') dospert_3 = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[1, 2, 3, 4, 5, 6, 7], label='Scommettere la paga di un giorno, giocando a carte o al videopoker') dospert_4 = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[1, 2, 3, 4, 5, 6, 7], label='Investire il 5% del proprio reddito annuo in azioni molto speculative') dospert_5 = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[1, 2, 3, 4, 5, 6, 7], label='Scommettere la paga di un giorno sull’esito di un evento sportivo') dospert_6 = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[1, 2, 3, 4, 5, 6, 7], label='Investire il 10% del proprio reddito annuo in una nuova impresa') payoff_bonus = models.CurrencyField() pounds = models.CurrencyField() group_size_2p = models.IntegerField() occupation = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, 'Studente'], [2, 'Lavoratore'], [3, 'Studente e lavoratore (allo stesso tempo)'], [4, 'Disoccupato']], label='Qual’è la tua occupazione?') income = models.BooleanField(widget=widgets.RadioSelect, choices=[[0, "Si"], [1, 'No']], label='Hai un tuo reddito personale (non quello della tua famiglia)?') income2 = models.IntegerField(label='Qual’è il tuo reddito lordo personale nel 2022 (non quello della tua famiglia)?', choices=[ [1, 'Meno di 11 461 Eur'], [2, '11 461 Eur - 22 919 Eur'], [3, '22 920 Eur - 34 377 Eur'], [4, '34 378 Eur - 45 838 Eur'], [5, '45 839 Eur - 57 297 Eur'], [6, '57 298 Eur- 68 748 Eur'], [7, '68 747 Eur- 80 204 Eur'], [8, '80 205 Eur - 91 687 Eur'], [9, '91 688 Eur - 103 132 Eur'], [10, '103 133 Eur - 114 587 Eur'], [11, '114 588 Eur- 171 898 Eur'], [12, 'Più di 171 899 Eur'], [13, 'Preferisco non dirlo'] ], widget=widgets.RadioSelect) crt1 = models.StringField(label="Se stai correndo una gara e sorpassi la persona al secondo posto, " "in che posizione ti trovi? Scrivi il posto come numero.") crt2 = models.StringField(label="Un contadino aveva 15 pecore e tutte, tranne 8, sono morte. " "Quante ne sono rimaste?") crt3 = models.StringField(label="Una mazza e una palla costano complessivamente 1,10 euro. " "La mazza costa 1,00 euro in più della palla. Quanto costa la palla?") CE_choice = models.IntegerField() CE_choice_aux = models.IntegerField() level1 = models.FloatField() level2 = models.FloatField() age = models.IntegerField(label="La tua età") gender = models.IntegerField(label="Sesso ufficiale (alla nascita)", widget=widgets.RadioSelect, choices=[[0, 'F'], [1, 'M']]) # PAGES class Beliefs(Page): def is_displayed(player: Player): return player.round_number == player.participant.surveys_rounds['1'] form_model = 'player' form_fields = ['beliefs'] class Questionnaire_1(Page): def is_displayed(player: Player): return player.round_number == player.participant.surveys_rounds['2'] form_model = 'player' form_fields = ['risk_1'] class Questionnaire_2(Page): def is_displayed(player: Player): return player.round_number == player.participant.surveys_rounds['3'] form_model = 'player' @staticmethod def get_form_fields(player: Player): form_fields = ['dospert_1', 'dospert_2', 'dospert_3', 'dospert_4', 'dospert_5', 'dospert_6'] random.shuffle(form_fields) return form_fields class Questionnaire_3(Page): def is_displayed(player: Player): return player.round_number == player.participant.surveys_rounds['4'] form_model = 'player' @staticmethod def get_form_fields(player: Player): form_fields = ['crt1', 'crt2', 'crt3'] random.shuffle(form_fields) return form_fields class Demographics(Page): def is_displayed(player: Player): return player.round_number == player.participant.num_rounds form_model = 'player' form_fields = ['age', 'gender', 'occupation', 'income2'] class Results_no_replace(Page): def is_displayed(player: Player): return player.participant.replace_predictions == 0 and player.participant.treatment_p < 9 \ and player.round_number == player.participant.num_rounds @staticmethod def vars_for_template(player): if player.participant.random_draw == 1: tuple_list = C.DC_scenarios price_pair = tuple_list[0] payoff_a = player.participant.payoff1_a payoff_b = player.participant.payoff1_b payoff_c = player.participant.payoff1_c choice = player.participant.CE_choice_1 pred_A = player.participant.CE1_pred_A pred_B = player.participant.CE1_pred_B pred_C = player.participant.CE1_pred_C cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] else: if player.participant.random_draw == 2: tuple_list = C.DC_scenarios price_pair = tuple_list[1] payoff_a = player.participant.payoff2_a payoff_b = player.participant.payoff2_b payoff_c = player.participant.payoff2_c choice = player.participant.CE_choice_2 pred_A = player.participant.CE2_pred_A pred_B = player.participant.CE2_pred_B pred_C = player.participant.CE2_pred_C cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] else: if player.participant.random_draw == 3: tuple_list = C.DC_scenarios price_pair = tuple_list[2] payoff_a = player.participant.payoff3_a payoff_b = player.participant.payoff3_b payoff_c = player.participant.payoff3_c choice = player.participant.CE_choice_3 pred_A = player.participant.CE3_pred_A pred_B = player.participant.CE3_pred_B pred_C = player.participant.CE3_pred_C cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] else: if player.participant.random_draw == 4: tuple_list = C.DC_scenarios price_pair = tuple_list[3] payoff_a = player.participant.payoff4_a payoff_b = player.participant.payoff4_b payoff_c = player.participant.payoff4_c choice = player.participant.CE_choice_4 pred_A = player.participant.CE4_pred_A pred_B = player.participant.CE4_pred_B pred_C = player.participant.CE4_pred_C cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] else: if player.participant.random_draw == 5: tuple_list = C.DC_scenarios price_pair = tuple_list[4] payoff_a = player.participant.payoff5_a payoff_b = player.participant.payoff5_b payoff_c = player.participant.payoff5_c choice = player.participant.CE_choice_5 pred_A = player.participant.CE5_pred_A pred_B = player.participant.CE5_pred_B pred_C = player.participant.CE5_pred_C cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] else: if player.participant.random_draw == 6: tuple_list = C.DC_scenarios price_pair = tuple_list[5] payoff_a = player.participant.payoff6_a payoff_b = player.participant.payoff6_b payoff_c = player.participant.payoff6_c choice = player.participant.CE_choice_6 pred_A = player.participant.CE6_pred_A pred_B = player.participant.CE6_pred_B pred_C = player.participant.CE6_pred_C cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] else: if player.participant.random_draw == 7: tuple_list = C.DC_scenarios price_pair = tuple_list[6] payoff_a = player.participant.payoff7_a payoff_b = player.participant.payoff7_b payoff_c = player.participant.payoff7_c choice = player.participant.CE_choice_7 pred_A = player.participant.CE7_pred_A pred_B = player.participant.CE7_pred_B pred_C = player.participant.CE7_pred_C cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] else: if player.participant.random_draw == 8: tuple_list = C.DC_scenarios price_pair = tuple_list[7] payoff_a = player.participant.payoff8_a payoff_b = player.participant.payoff8_b payoff_c = player.participant.payoff8_c choice = player.participant.CE_choice_8 pred_A = player.participant.CE8_pred_A pred_B = player.participant.CE8_pred_B pred_C = player.participant.CE8_pred_C cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] else: tuple_list = C.DC_scenarios price_pair = tuple_list[8] payoff_a = player.participant.payoff9_a payoff_b = player.participant.payoff9_b payoff_c = player.participant.payoff9_c choice = player.participant.CE_choice_9 pred_A = player.participant.CE9_pred_A pred_B = player.participant.CE9_pred_B pred_C = player.participant.CE9_pred_C cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] listA = player.participant.list_choices_A.split() listB = player.participant.list_choices_B.split() listC = player.participant.list_choices_C.split() list_choices = listA + listC + listB player.participant.random_choice = random.choice(list_choices) if player.participant.random_choice == 'A': player.payoff_bonus = payoff_a else: if player.participant.random_choice == 'B': player.payoff_bonus = payoff_b else: player.payoff_bonus = payoff_c nr_pred_A = player.participant.list_choices_A.count('A') nr_pred_B = player.participant.list_choices_B.count('B') nr_pred_C = player.participant.list_choices_C.count('C') if nr_pred_A == pred_A and nr_pred_B == pred_B and nr_pred_C == pred_C: player.frequency_prediction = 1 else: player.frequency_prediction = 0 return dict( num_participants=player.participant.group_size_2 - 1, costs1=cost_1, costs2=cost_2, payoff_a=payoff_a, payoff_b=payoff_b, payoff_c=payoff_c, choice=choice, pred_A=pred_A, pred_B=pred_B, pred_C=pred_C, draw=player.participant.random_draw, listA=listA, listB=listB, listC=listC, nr_pred_A=nr_pred_A, nr_pred_B=nr_pred_B, nr_pred_C=nr_pred_C, frequency_prediction=player.frequency_prediction, product_1=product_1, product_2=product_2, random_prediction_A=len(listA), random_prediction_B=len(listB), random_prediction_C=len(listC), ) @staticmethod def js_vars(player): return dict(replace=player.participant.replace_predictions, random_choice=player.participant.random_choice) @staticmethod def before_next_page(player, timeout_happened): player.pounds = round(player.payoff_bonus * C.exchange_pounds, 2) class Results_no_replace_aux(Page): def is_displayed(player: Player): return player.participant.replace_predictions == 0 and player.participant.treatment_p == 9 \ and player.round_number == player.participant.num_rounds @staticmethod def vars_for_template(player): winning_choice_number = [player.participant.page_no_1aux, player.participant.page_no_2aux, player.participant.page_no_3aux, player.participant.page_no_4aux, player.participant.page_no_5aux, player.participant.page_no_6aux, player.participant.page_no_7aux, player.participant.page_no_8aux, player.participant.page_no_9aux] if player.participant.random_draw == 1: winning_choice_screen = winning_choice_number[0] tuple_list = C.aux_scenarios price_pair = tuple_list[0] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_1 choice_aux = player.participant.CE_choice_1_aux else: if player.participant.random_draw == 2: winning_choice_screen = winning_choice_number[1] tuple_list = C.aux_scenarios price_pair = tuple_list[1] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_2 choice_aux = player.participant.CE_choice_2_aux else: if player.participant.random_draw == 3: winning_choice_screen = winning_choice_number[2] tuple_list = C.aux_scenarios price_pair = tuple_list[2] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_3 choice_aux = player.participant.CE_choice_3_aux else: if player.participant.random_draw == 4: winning_choice_screen = winning_choice_number[3] tuple_list = C.aux_scenarios price_pair = tuple_list[3] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_4 choice_aux = player.participant.CE_choice_4_aux else: if player.participant.random_draw == 5: winning_choice_screen = winning_choice_number[4] tuple_list = C.aux_scenarios price_pair = tuple_list[4] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_5 choice_aux = player.participant.CE_choice_5_aux else: if player.participant.random_draw == 6: winning_choice_screen = winning_choice_number[5] tuple_list = C.aux_scenarios price_pair = tuple_list[5] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_6 choice_aux = player.participant.CE_choice_6_aux else: if player.participant.random_draw == 7: winning_choice_screen = winning_choice_number[6] tuple_list = C.aux_scenarios price_pair = tuple_list[6] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_7 choice_aux = player.participant.CE_choice_7_aux else: if player.participant.random_draw == 8: winning_choice_screen = winning_choice_number[7] tuple_list = C.aux_scenarios price_pair = tuple_list[7] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_8 choice_aux = player.participant.CE_choice_8_aux else: winning_choice_screen = winning_choice_number[8] tuple_list = C.aux_scenarios price_pair = tuple_list[8] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_9 choice_aux = player.participant.CE_choice_9_aux if choice_aux == 1: player.payoff_bonus = C.budget_aux - cost_1 else: if choice_aux == 2: player.payoff_bonus = C.budget_aux - cost_2 else: player.payoff_bonus = C.budget_aux player.CE_choice_aux = choice_aux player.level1 = cost_1 player.level2 = cost_2 return dict(num_participants=player.participant.group_size_2 - 1, costs1=cost_1, costs2=cost_2, choice=choice_aux, choice_aux=choice_aux, draw=player.participant.random_draw, product_1=product_1, product_2=product_2, payoff=player.payoff_bonus, drawscreen=winning_choice_screen ) # @staticmethod # def js_vars(player): # return dict(replace=player.participant.replace_predictions, random_choice=player.participant.random_choice) @staticmethod def before_next_page(player, timeout_happened): player.pounds = round(player.payoff_bonus * C.exchange_pounds, 2) class Results_replace(Page): def is_displayed(player: Player): return player.participant.replace_predictions == 1 and player.participant.treatment_p < 9 \ and player.round_number == player.participant.num_rounds @staticmethod def vars_for_template(player): leng = len(player.participant.group_list_pred_A) if leng == 0: if player.participant.random_draw == 1: random_prediction_A = player.participant.CE1_pred_A random_prediction_B = player.participant.CE1_pred_B random_prediction_C = player.participant.CE1_pred_C else: if player.participant.random_draw == 2: random_prediction_A = player.participant.CE2_pred_A random_prediction_B = player.participant.CE2_pred_B random_prediction_C = player.participant.CE2_pred_C else: if player.participant.random_draw == 3: random_prediction_A = player.participant.CE3_pred_A random_prediction_B = player.participant.CE3_pred_B random_prediction_C = player.participant.CE3_pred_C else: if player.participant.random_draw == 4: random_prediction_A = player.participant.CE4_pred_A random_prediction_B = player.participant.CE4_pred_B random_prediction_C = player.participant.CE4_pred_C else: if player.participant.random_draw == 5: random_prediction_A = player.participant.CE5_pred_A random_prediction_B = player.participant.CE5_pred_B random_prediction_C = player.participant.CE5_pred_C else: if player.participant.random_draw == 6: random_prediction_A = player.participant.CE6_pred_A random_prediction_B = player.participant.CE6_pred_B random_prediction_C = player.participant.CE6_pred_C else: if player.participant.random_draw == 7: random_prediction_A = player.participant.CE7_pred_A random_prediction_B = player.participant.CE7_pred_B random_prediction_C = player.participant.CE7_pred_C else: if player.participant.random_draw == 8: random_prediction_A = player.participant.CE8_pred_A random_prediction_B = player.participant.CE8_pred_B random_prediction_C = player.participant.CE8_pred_C else: random_prediction_A = player.participant.CE9_pred_A random_prediction_B = player.participant.CE9_pred_B random_prediction_C = player.participant.CE9_pred_C if player.participant.group_elec == 1: player.participant.list_choices_A = "A" lenb = len(player.participant.list_choices_B.split()) lenc = len(player.participant.list_choices_C.split()) if lenb > lenc: player.participant.list_choices_B = \ player.participant.list_choices_B.replace("B", "", 1) else: player.participant.list_choices_C = \ player.participant.list_choices_C.replace("C", "", 1) if player.participant.group_elec == 2: player.participant.list_choices_B = "B" lena = len(player.participant.list_choices_A.split()) lenc = len(player.participant.list_choices_C.split()) if lena > lenc: player.participant.list_choices_A = \ player.participant.list_choices_A.replace("A", "", 1) else: player.participant.list_choices_C = \ player.participant.list_choices_C.replace("C", "", 1) if player.participant.group_elec == 3: player.participant.list_choices_C = 'C' lena = len(player.participant.list_choices_A.split()) lenb = len(player.participant.list_choices_B.split()) if lena > lenb: player.participant.list_choices_A = \ player.participant.list_choices_A.replace('A', '', 1) else: player.participant.list_choices_B = \ player.participant.list_choices_B.replace('B', '', 1) # player.participant.id_resto = [random.randint(1, player.participant.num_players)] player.participant.id_resto = [0] id_resto = {0: player.participant.id_resto[0]} example_prediction_selected_A = {0: random_prediction_A} example_prediction_selected_B = {0: random_prediction_B} example_prediction_selected_C = {0: random_prediction_C} player.participant.group_list_pred_A = [random_prediction_A] player.participant.group_list_pred_B = [random_prediction_B] player.participant.group_list_pred_C = [random_prediction_C] listA_2 = id_resto leng = 1 else: id_resto = {i: player.participant.id_resto[i] for i in range(0, leng)} # Corresponding predictions of other players example_prediction_selected_A = {i: player.participant.group_list_pred_A[i] for i in range(0, leng)} example_prediction_selected_B = {i: player.participant.group_list_pred_B[i] for i in range(0, leng)} example_prediction_selected_C = {i: player.participant.group_list_pred_C[i] for i in range(0, leng)} listA_2 = {i: player.participant.id_resto[i] for i in range(0, leng)} integersA = [int(i) for i in player.participant.group_list_pred_A] integersB = [int(i) for i in player.participant.group_list_pred_B] integersC = [int(i) for i in player.participant.group_list_pred_C] selected_id = random.randint(0, len(listA_2)-1) replaced_A = integersA[selected_id] replaced_B = integersB[selected_id] replaced_C = integersC[selected_id] cont = list(range(0, leng)) winning_choice_number = [player.participant.page_no_1, player.participant.page_no_2, player.participant.page_no_3, player.participant.page_no_4, player.participant.page_no_5, player.participant.page_no_6, player.participant.page_no_7, player.participant.page_no_8, player.participant.page_no_9] # print(winning_choice_number) if player.participant.random_draw == 1: tuple_list = C.DC_scenarios price_pair = tuple_list[0] winning_choice_screen = winning_choice_number[0] pred_A = player.participant.CE1_pred_A pred_B = player.participant.CE1_pred_B pred_C = player.participant. CE1_pred_C player.CE_choice = player.participant.CE_choice_1 cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] else: if player.participant.random_draw == 2: tuple_list = C.DC_scenarios price_pair = tuple_list[1] winning_choice_screen = winning_choice_number[1] pred_A = player.participant.CE2_pred_A pred_B = player.participant.CE2_pred_B pred_C = player.participant.CE2_pred_C player.CE_choice = player.participant.CE_choice_2 cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] else: if player.participant.random_draw == 3: tuple_list = C.DC_scenarios price_pair = tuple_list[2] winning_choice_screen = winning_choice_number[2] pred_A = player.participant.CE3_pred_A pred_B = player.participant.CE3_pred_B pred_C = player.participant.CE3_pred_C player.CE_choice = player.participant.CE_choice_3 cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] else: if player.participant.random_draw == 4: tuple_list = C.DC_scenarios price_pair = tuple_list[3] winning_choice_screen = winning_choice_number[3] pred_A = player.participant.CE4_pred_A pred_B = player.participant.CE4_pred_B pred_C = player.participant.CE4_pred_C player.CE_choice = player.participant.CE_choice_4 cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] else: if player.participant.random_draw == 5: tuple_list = C.DC_scenarios price_pair = tuple_list[4] winning_choice_screen = winning_choice_number[4] pred_A = player.participant.CE5_pred_A pred_B = player.participant.CE5_pred_B pred_C = player.participant.CE5_pred_C player.CE_choice = player.participant.CE_choice_5 cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] else: if player.participant.random_draw == 6: tuple_list = C.DC_scenarios price_pair = tuple_list[5] winning_choice_screen = winning_choice_number[5] pred_A = player.participant.CE6_pred_A pred_B = player.participant.CE6_pred_B pred_C = player.participant.CE6_pred_C player.CE_choice = player.participant.CE_choice_6 cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] else: if player.participant.random_draw == 7: tuple_list = C.DC_scenarios price_pair = tuple_list[6] winning_choice_screen = winning_choice_number[6] pred_A = player.participant.CE7_pred_A pred_B = player.participant.CE7_pred_B pred_C = player.participant.CE7_pred_C player.CE_choice = player.participant.CE_choice_7 cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] else: if player.participant.random_draw == 8: tuple_list = C.DC_scenarios price_pair = tuple_list[7] winning_choice_screen = winning_choice_number[7] pred_A = player.participant.CE8_pred_A pred_B = player.participant.CE8_pred_B pred_C = player.participant.CE8_pred_C player.CE_choice = player.participant.CE_choice_8 cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] else: tuple_list = C.DC_scenarios price_pair = tuple_list[8] winning_choice_screen = winning_choice_number[8] pred_A = player.participant.CE9_pred_A pred_B = player.participant.CE9_pred_B pred_C = player.participant.CE9_pred_C player.CE_choice = player.participant.CE_choice_9 cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] Pred_A = replaced_A / (player.participant.group_size_2 - 1) Pred_B = replaced_B / (player.participant.group_size_2 - 1) Pred_C = replaced_C / (player.participant.group_size_2 - 1) factor1 = Pred_A * Pred_A + Pred_B * Pred_B + Pred_C * Pred_C payoff_a = round(C.quadratic_score_A + C.quadratic_score_B * (2 * Pred_A - factor1), 1) payoff_b = round(C.quadratic_score_A + C.quadratic_score_B * (2 * Pred_B - factor1), 1) payoff_c = round(C.quadratic_score_A + C.quadratic_score_B * (2 * Pred_C - factor1), 1) listA = player.participant.list_choices_A.split() listB = player.participant.list_choices_B.split() listC = player.participant.list_choices_C.split() list_choices = listA + listC + listB player.participant.random_choice = random.choice(list_choices) if player.participant.random_choice == 'A': player.payoff_bonus = payoff_a else: if player.participant.random_choice == 'B': player.payoff_bonus = payoff_b else: player.payoff_bonus = payoff_c nr_pred_A = player.participant.list_choices_A.count('A') nr_pred_B = player.participant.list_choices_B.count('B') nr_pred_C = player.participant.list_choices_C.count('C') if nr_pred_A == replaced_A and nr_pred_B == replaced_B and nr_pred_C == replaced_C: player.frequency_prediction = 1 else: player.frequency_prediction = 0 return dict(id_resto=id_resto, example_prediction_selected_A=example_prediction_selected_A, example_prediction_selected_B=example_prediction_selected_B, example_prediction_selected_C=example_prediction_selected_C, # listA=listA_2, cont=cont, replaced_A=replaced_A, replaced_B=replaced_B, replaced_C=replaced_C, costs1=cost_1, costs2=cost_2, num_participants=player.participant.group_size_2 - 1, payoff_a=payoff_a, payoff_b=payoff_b, payoff_c=payoff_c, nr_pred_A=nr_pred_A, nr_pred_B=nr_pred_B, nr_pred_C=nr_pred_C, CE_choice=player.CE_choice, pred_A=pred_A, pred_B=pred_B, pred_C=pred_C, draw=winning_choice_screen, listA=listA, listB=listB, listC=listC, random_prediction_A=len(listA), random_prediction_B=len(listB), random_prediction_C=len(listC), random_draw=player.participant.random_choice, frequency_prediction=player.frequency_prediction, product_1=product_1, product_2=product_2 ) @staticmethod def js_vars(player): return dict(replace=player.participant.replace_predictions, random_choice=player.participant.random_choice) @staticmethod def before_next_page(player, timeout_happened): player.pounds = round(player.payoff_bonus * C.exchange_pounds, 2) # Replace results: T9 class Results_replace_aux(Page): def is_displayed(player: Player): return player.participant.replace_predictions == 1 and player.participant.treatment_p == 9 \ and player.round_number == player.participant.num_rounds @staticmethod def vars_for_template(player): winning_choice_number = [player.participant.page_no_1aux, player.participant.page_no_2aux, player.participant.page_no_3aux, player.participant.page_no_4aux, player.participant.page_no_5aux, player.participant.page_no_6aux, player.participant.page_no_7aux, player.participant.page_no_8aux, player.participant.page_no_9aux] if player.participant.random_draw == 1: winning_choice_screen = winning_choice_number[0] tuple_list = C.aux_scenarios price_pair = tuple_list[0] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_1 choice_aux = player.participant.CE_choice_1_aux else: if player.participant.random_draw == 2: winning_choice_screen = winning_choice_number[1] tuple_list = C.aux_scenarios price_pair = tuple_list[1] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_2 choice_aux = player.participant.CE_choice_2_aux else: if player.participant.random_draw == 3: winning_choice_screen = winning_choice_number[2] tuple_list = C.aux_scenarios price_pair = tuple_list[2] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_3 choice_aux = player.participant.CE_choice_3_aux else: if player.participant.random_draw == 4: winning_choice_screen = winning_choice_number[3] tuple_list = C.aux_scenarios price_pair = tuple_list[3] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_4 choice_aux = player.participant.CE_choice_4_aux else: if player.participant.random_draw == 5: winning_choice_screen = winning_choice_number[4] tuple_list = C.aux_scenarios price_pair = tuple_list[4] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_5 choice_aux = player.participant.CE_choice_5_aux else: if player.participant.random_draw == 6: winning_choice_screen = winning_choice_number[5] tuple_list = C.aux_scenarios price_pair = tuple_list[5] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_6 choice_aux = player.participant.CE_choice_6_aux else: if player.participant.random_draw == 7: winning_choice_screen = winning_choice_number[6] tuple_list = C.aux_scenarios price_pair = tuple_list[6] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_7 choice_aux = player.participant.CE_choice_7_aux else: if player.participant.random_draw == 8: winning_choice_screen = winning_choice_number[7] tuple_list = C.aux_scenarios price_pair = tuple_list[7] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_8 choice_aux = player.participant.CE_choice_8_aux else: tuple_list = C.aux_scenarios winning_choice_screen = winning_choice_number[8] price_pair = tuple_list[8] cost_1 = price_pair[1] cost_2 = price_pair[3] product_1 = price_pair[0] product_2 = price_pair[2] choice = player.participant.CE_choice_9 choice_aux = player.participant.CE_choice_9_aux if player.participant.substitute == 1: player.payoff_bonus = C.budget_aux - cost_1 else: if player.participant.substitute == 2: player.payoff_bonus = C.budget_aux - cost_2 else: player.payoff_bonus = C.budget_aux player.CE_choice_aux = player.participant.substitute player.level1 = cost_1 player.level2 = cost_2 return dict(num_participants=player.participant.group_size_2 - 1, costs1=cost_1, costs2=cost_2, choice=choice_aux, choice_aux=choice_aux, draw=player.participant.random_draw, product_1=product_1, product_2=product_2, payoff=player.payoff_bonus, substitute=player.participant.substitute, drawscreen=winning_choice_screen ) @staticmethod def js_vars(player): return dict(replace=player.participant.replace_predictions, random_choice=player.participant.random_choice) @staticmethod def before_next_page(player, timeout_happened): player.pounds = round(player.payoff_bonus * C.exchange_pounds, 2) class Final(Page): @staticmethod def is_displayed(player: Player): return player.participant.treatment_p < 9 and player.round_number == player.participant.num_rounds @staticmethod def js_vars(player): return dict(pounds=player.pounds, exchange_pounds=C.exchange_pounds) @staticmethod def vars_for_template(player: Player): return dict(payoff=player.payoff_bonus, frequency_prediction=player.frequency_prediction, bonus_pounds=player.pounds) class Final_aux(Page): @staticmethod def is_displayed(player: Player): return player.participant.treatment_p == 9 and player.round_number == player.participant.num_rounds @staticmethod def js_vars(player): return dict(pounds=player.pounds, exchange_pounds=C.exchange_pounds) @staticmethod def vars_for_template(player: Player): return dict(payoff=player.payoff_bonus, bonus_pounds=player.pounds, choice=player.CE_choice_aux, level1=player.level1, level2=player.level2, ) page_sequence = [ Beliefs, Questionnaire_1, Questionnaire_2, Questionnaire_3, # Demographics, Results_no_replace, Results_no_replace_aux, Results_replace, Results_replace_aux, Final, Final_aux]