from otree.api import * doc = """ Choice list (Holt/Laury, risk preferences, price list, equivalence test, etc) """ class C(BaseConstants): NAME_IN_URL = 'choice_list' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 TABLE_TEMPLATE = __name__ + '/table.html' def read_csv(): #Price Listの表を読み込むための関数を定義 import csv import random f = open(__name__ + '/stimuli.csv', encoding='utf-8-sig') #csvファイルを開く関数を作成 rows = list(csv.DictReader(f)) #Listのrowを読み random.shuffle(rows) #列の提示順序をシャッフル。ランダム表示をしない場合は、削除。 return rows class Subsession(BaseSubsession): pass def creating_session(subsession: Subsession): for p in subsession.get_players(): stimuli = read_csv() for stim in stimuli: # In python, ** unpacks a dict. Trial.create(player=p, **stim) class Group(BaseGroup): pass class Player(BasePlayer): raw_responses = models.LongStringField() chose_lottery = models.BooleanField() won_lottery = models.BooleanField() class Trial(ExtraModel): player = models.Link(Player) sure_payoff = models.CurrencyField() lottery_high = models.CurrencyField() lottery_low = models.CurrencyField() probability_percent1 = models.IntegerField() probability_percent2 = models.IntegerField() chose_lottery = models.BooleanField() randomly_chosen = models.BooleanField(initial=False) # PAGES class Stimuli(Page): @staticmethod def vars_for_template(player: Player): return dict(trials=Trial.filter(player=player), is_results=False) @staticmethod def live_method(player: Player, data): # In this case, Trial.filter() will return a list with just 1 item. # so we use python 'iterable unpacking' to assign that single item # to the variable 'trial'. [trial] = Trial.filter(player=player, id=data['trial_id']) trial.chose_lottery = data['chose_lottery'] @staticmethod def before_next_page(player: Player, timeout_happened): import random # if your page has a timeout, you would need to adjust this code. trials = Trial.filter(player=player) #列全部を一度取り出す selected_trial = random.choice(trials) #列の中から1つをランダムに選ぶ selected_trial.randomly_chosen = True #取り出した列について、ランダムに選ばれたことを示す変数をTRUEとする player.chose_lottery = selected_trial.chose_lottery #ランダムに選ばれた列にいて、被験者が選んだくじを取り出す if player.chose_lottery: #被験者が選んだものがくじである場合: player.won_lottery = selected_trial.probability_percent1 > (random.random() * 100) #勝ちか負けかを計算。 if player.won_lottery: #勝った場合 payoff = selected_trial.lottery_high else: #負けた場合 payoff = selected_trial.lottery_low else: payoff = selected_trial.sure_payoff #被験者が選んだものが安全くじある場合: player.payoff = payoff #上で計算した結果を被験者の利得に入れ込む class Results(Page): @staticmethod def vars_for_template(player: Player): trials = Trial.filter(player=player, randomly_chosen=True) #ランダムに選ばれた列を取り出す return dict(trials=trials, is_results=True) page_sequence = [Stimuli, Results]