from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random author = 'Jelmer Reijerink' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'dnb_bankrun' players_per_group = 1 num_rounds = 1 endowment = 10 class Subsession(BaseSubsession): def creating_session(self): import math bank_interest_rate = [1, 1.5, 2] max_cbdc = [5, 2.5, 0] cbdc_interest_rate = [0.2, 0.3, 0.4] num_players = self.session.num_participants num_pp_group = Constants.players_per_group num_groups = num_players / num_pp_group num_combinations = len(bank_interest_rate) * len(max_cbdc) * len(cbdc_interest_rate) number_of_iterations = math.ceil(num_groups / num_combinations) x = list(["{},{},{}".format(f, s, t) for f in bank_interest_rate for s in max_cbdc for t in cbdc_interest_rate]) n = number_of_iterations new_list = [item for i in range(n) for item in x] iterated_list = iter(new_list) groepen = self.get_groups() for group in groepen: next_in_list = next(iterated_list, "0,0,0") group.bank_interest_rate = float((next_in_list).split(",")[0]) group.max_cbdc = float((next_in_list).split(",")[1]) group.cbdc_interest_rate = float((next_in_list).split(",")[2]) class Group(BaseGroup): bank_interest_rate = models.FloatField() max_cbdc = models.FloatField() cbdc_interest_rate = models.FloatField() def set_payoffs(self): print(type(self.bank_interest_rate)) for p in self.get_players(): p.individual_end_bank = p.individual_new_bank * (1 + self.bank_interest_rate / 100) p.individual_end_cash = p.individual_new_cash p.individual_end_cbdc = p.individual_new_cbdc * (1 + self.cbdc_interest_rate / 100) p.individual_end_value = p.individual_end_bank + p.individual_end_cash + p.individual_end_cbdc if self.round_number - Constants.num_rounds != 0: next_round = p.in_round(self.round_number + 1) next_round.individual_start_bank = p.individual_end_bank next_round.individual_start_cash = p.individual_end_cash next_round.individual_start_cbdc = p.individual_end_cbdc next_round.individual_start_value = p.individual_end_value p.payoff = (p.individual_new_bank * self.bank_interest_rate / 100) + ( p.individual_new_cbdc * self.cbdc_interest_rate / 100) class Player(BasePlayer): individual_start_value = models.FloatField(initial=Constants.endowment) individual_start_bank = models.FloatField(initial=Constants.endowment) individual_start_cash = models.FloatField(initial=0) individual_start_cbdc = models.FloatField(initial=0) individual_new_bank = models.FloatField(initial=0) individual_new_cash = models.FloatField(initial=0) individual_new_cbdc = models.FloatField(initial=0) individual_end_value = models.FloatField(initial=0) individual_end_bank = models.FloatField(initial=0) individual_end_cash = models.FloatField(initial=0) individual_end_cbdc = models.FloatField(initial=0) age = models.IntegerField() gender = models.StringField( choices=["Male", "Female", "Other", "Prefer not to say"] ) education = models.StringField( choices=["Low", "Medium", "High"] )