from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random import numpy as np import csv import pandas as pd doc = '''Information processing game, posterior''' class Constants(BaseConstants): name_in_url = 'Information_processing_dema' players_per_group = None num_rounds = 3 #instructions_template = 'information_experiment_1/instructions.html' # Initial amount allocated to decision maker endowment = 1 guess_fee = 1 conversion_rate = 0.1 # LIST OF POSSIBLE SCENARIOS # 0 = person is republican # 1 = person is democrat # [p1, p2, p3, p4] # teams = p1 & p2, p3 & p4 scenarios = [[1,1,0,0], [1,1,1,0], [0,0,1,0]] # random assignment of treatments # we would like to have 50 / 50 ex ante # guess distributions: # [0] = dem_yellow # [1] =dem_green # [2] =rep_yellow # [3] =rep_green df_ = pd.read_csv('post_information_experiment_demand/guess_distr.csv', sep=';') # list_prolid = temp_df['prol_id'].tolist() # temp_lists = [] # for cols_ in temp_df.drop(['prol_id'], axis=1).columns: # temp_lists.append(temp_df[cols_].tolist()) # distr_ = guess distributions: # [0] = dem_yellow # [1] =dem_green # [2] =rep_yellow # [3] =rep_green distr_ = [] for var_ in df_.columns: distr_.append(df_[var_].dropna().to_list()) # # 0 = election_outcome_electoral --> 1 == Trump , 0 == Biden # # 1 = election_outcome_popular --> 1 == Trump , 0 == Biden # # 2 = econ_measure # # 3 = health_measure # temp_tuple = list(zip(temp_lists[0], temp_lists[1], temp_lists[2], temp_lists[3])) # prol_dict = dict(zip(list_prolid, temp_tuple)) class Subsession(BaseSubsession): def creating_session(self): for p in self.get_players(): # RANDOM ORDER OF SCENARIOS temp_ = Constants.scenarios.copy() random.shuffle(temp_) p.participant.vars['demand_scenarios'] = temp_ # URNS FOR ROUND 1,2,3 p.participant.vars['demand_urn_1'] = random.randint(0,1) p.participant.vars['demand_urn_2'] = random.randint(0, 1) p.participant.vars['demand_urn_3'] = random.randint(0, 1) p.participant.vars['payoff_round_demand'] = random.randint(1, 3) p.participant.vars['distr_'] = Constants.distr_.copy() class Group(BaseGroup): pass class Player(BasePlayer): prob_group_1 = models.IntegerField(initial=50) guess_demand = models.IntegerField(initial=None, choices=[[0, 'Yellow cup'], [1, 'Green cup']], widget=widgets.RadioSelect) urn_demand = models.IntegerField(initial=-1) ball_demand = models.IntegerField(initial=-1) observed_group = models.IntegerField(initial=-1) # person is democrat p1_democrat = models.IntegerField(initial=-1) p2_democrat = models.IntegerField(initial=-1) p3_democrat = models.IntegerField(initial=-1) p4_democrat = models.IntegerField(initial=-1) # guess of person p1_guess = models.IntegerField(initial=-1) p2_guess = models.IntegerField(initial=-1) p3_guess = models.IntegerField(initial=-1) p4_guess = models.IntegerField(initial=-1) def demand_set_up(self): # ASSIGNING SCENARIOS AND GUESSES TO FIELDS num_ = self.round_number self.p1_democrat = self.participant.vars['demand_scenarios'][num_-1][0] self.p2_democrat = self.participant.vars['demand_scenarios'][num_-1][1] self.p3_democrat = self.participant.vars['demand_scenarios'][num_-1][2] self.p4_democrat = self.participant.vars['demand_scenarios'][num_-1][3] # 0 = YELLOW, 1 = GREEN self.urn_demand = random.randint(0,1) if self.urn_demand == 0: if random.uniform(0, 1) >= 1/3: self.ball_demand = 0 else: self.ball_demand = 1 else: if random.uniform(0, 1) >= 1/3: self.ball_demand = 1 else: self.ball_demand = 0 # distr_ = guess distributions: # [0] = dem_yellow # [1] =dem_green # [2] = rep_yellow # [3] =rep_green # YELLOW URN if self.urn_demand == 0: random.shuffle(self.participant.vars['distr_'][0]) random.shuffle(self.participant.vars['distr_'][2]) # P1 if self.p1_democrat == 1: self.p1_guess = int(self.participant.vars['distr_'][0].pop()) else: self.p1_guess = int(self.participant.vars['distr_'][2].pop()) # P2 if self.p2_democrat == 1: self.p2_guess = int(self.participant.vars['distr_'][0].pop()) else: self.p2_guess = int(self.participant.vars['distr_'][2].pop()) # P3 if self.p3_democrat == 1: self.p3_guess = int(self.participant.vars['distr_'][0].pop()) else: self.p3_guess = int(self.participant.vars['distr_'][2].pop()) # P4 if self.p4_democrat == 1: self.p4_guess = int(self.participant.vars['distr_'][0].pop()) else: self.p4_guess = int(self.participant.vars['distr_'][2].pop()) # GREEN URN else: random.shuffle(self.participant.vars['distr_'][1]) random.shuffle(self.participant.vars['distr_'][3]) # P1 if self.p1_democrat == 1: self.p1_guess = int(self.participant.vars['distr_'][1].pop()) else: self.p1_guess = int(self.participant.vars['distr_'][3].pop()) # P2 if self.p2_democrat == 1: self.p2_guess = int(self.participant.vars['distr_'][1].pop()) else: self.p2_guess = int(self.participant.vars['distr_'][3].pop()) # P3 if self.p3_democrat == 1: self.p3_guess = int(self.participant.vars['distr_'][1].pop()) else: self.p3_guess = int(self.participant.vars['distr_'][3].pop()) # P4 if self.p4_democrat == 1: self.p4_guess = int(self.participant.vars['distr_'][1].pop()) else: self.p4_guess = int(self.participant.vars['distr_'][3].pop()) def bdm_set_up(self): # SWITCHING PROBS TO THAT IT MATCHES HTML REPRESENTATION self.prob_group_1 = 100 - self.prob_group_1 if random.randint(1, 100) <= self.prob_group_1: # OBSERVING GROUP 1 self.observed_group = 1 self.participant.vars['obs_p1'] = self.p1_democrat self.participant.vars['obs_p2'] = self.p2_democrat self.participant.vars['obs_guess_p1'] = self.p1_guess self.participant.vars['obs_guess_p2'] = self.p2_guess else: # OBSERVING GROUP 2 self.observed_group = 2 self.participant.vars['obs_p1'] = self.p3_democrat self.participant.vars['obs_p2'] = self.p4_democrat self.participant.vars['obs_guess_p1'] = self.p3_guess self.participant.vars['obs_guess_p2'] = self.p4_guess def payoff_demand(self): if self.round_number == self.participant.vars['payoff_round_demand']: self.participant.vars['correct_guessed_dem'] = 0 self.participant.vars['kept_bdm_demand'] = 1 if self.guess_demand == self.urn_demand: self.participant.vars['payoff_demand'] = Constants.guess_fee + (0.4-(abs(self.prob_group_1 - 50)/100)) self.participant.vars['correct_guessed_dem'] = 1 self.participant.vars['kept_bdm_demand'] = (0.4-(abs(self.prob_group_1 - 50)/100)) else: self.participant.vars['payoff_demand'] = (0.4 - (abs(self.prob_group_1 - 50) / 100)) self.participant.vars['kept_bdm_demand'] = (0.4 - (abs(self.prob_group_1 - 50) / 100))