from otree.api import * import random import itertools import csv #I nead those to convert csv to matrix #import pandas as pd # import numpy as np doc = """ This is the second session of the iq project. First Subjects have to do IQ test, ... """ # ############################################################################################################# # ##################################### FUNCTIONS ####################################################### # ############################################################################################################# # We will need to copy here the extra Payoff Function # payoffis the sum of the base payoff and the extra payoff an individual can get after the first session. # def set_Payoff_Session1(player): # player.payoff = player.base_payoff + player.extraPayoff1 + player.extraPayoff2 # We need to import the positive feedback from the data we collected in the first session. # Then we have to look for the Melessa ID in the list and figure out what was the Positive Feedback of that person. # UNFORTUNATELY THIS DOES NOT WORK SO FAR: ERROR MESSAGE IS ALWAYS: PLAYER.POSITIVE FEEDBACK IS NONE def creating_session(subsession): scope = itertools.cycle([True, False]) for p in subsession.get_players(): p.HighScope = next(scope) def set_PositiveFeedback(player): with open('iq_session2/static/data.csv', 'r') as df: data = csv.DictReader(df) for row in data: # print(row) if player.Melessa_ID == str(row['ID']): player.PositiveFeedback = int(row['PosFeedback']) #df = pd.read_csv('iq_session2/static/datapay.csv', encoding='utf-8', dtype=int, sep=';', names=['ID', 'Rank', 'X', '3-X'], header=0) #for index, row in df.iterrows(): # print(row['ID']) #if player.Melessa_ID == row['ID']: #player.PositiveFeedback = row['X'] #return def set_ranking(player): with open('iq_session2/static/data.csv', 'r') as df: data = csv.DictReader(df) for row in data: # print(row) #if player.Melessa_ID == int(row['ID']): if player.Melessa_ID == str(row['ID']): player.Rank = int(row['Rank']) #df = pd.read_csv('iq_session2/static/datapay.csv', encoding='utf-8', dtype=int, sep=';', names=['ID', 'Rank', 'X', '3-X'],header=0).astype('int') #for index, row in df.iterrows(): #if player.Melessa_ID == row['ID']: #player.Rank = row['Rank'] #return def set_feedback_order(player): with open('iq_session2/static/data.csv', 'r') as df: data = csv.DictReader(df) for row in data: # print(row) # if player.Melessa_ID == int(row['ID']): if player.Melessa_ID == str(row['ID']): player.feedback_order = int(row['Order']) # Open file for reading # with open('iq_session2/static/datapay.csv', encoding='utf-8') as csvDataFile: # with open('iq_session2/static/datapay.csv', 'r') as csvDataFile: # read file as csv file # data = csv.reader(csvDataFile) # df = pd.read_csv('iq_session2/static/datapay.csv', header=None, index_col=[0]) # people = # for i in range(1,len(people)): # for row in df: # people = player.get_others_in_subsession() + [player] # for p in people: # if player.Melessa_ID == df[row][0]: # player.PositiveFeedback = df[row][2] # return # return # l = len(df.index) # melessa=df.Melessa_ID.values.reshape(l,1) # feedback=df.PositiveFeedback.values.reshape(l,1) # for row in melessa: # people = player.get_others_in_subsession() +[player] # for p in people: # if p.Melessa_ID == melessa[row]: # p.PositiveFeedback = feedback[row] # for i in range(1,len(people)): # for row in data: # # for p in people: # if p.Melessa_ID == data[row][0]: # p.PositiveFeedback = data[row][2] # return # This function defines the number of negative feedback individuals get def set_NegativeFeedback(player): player.NegativeFeedback = 3 - player.PositiveFeedback def set_extrapayoff3(player): if player.field_maybe_none('BeliefTopHalf3') != None: if player.Rank < 6 and player.BeliefTopHalf3 > max([random.randint(0, 100), random.randint(0, 100)]): player.extraPayoff3 = Constants.extra_payoff elif player.Rank > 5 and player.BeliefTopHalf3 < min([random.randint(0, 100), random.randint(0, 100)]): player.extraPayoff3 = Constants.extra_payoff else: player.extraPayoff3 = 0 # ############################################################################################################# # ########################################## MODELS ########################################################### # ############################################################################################################# class Constants(BaseConstants): name_in_url = 'iq_session2' players_per_group = None num_rounds = 1 # we have to set actual payment when we know how long it takes to do the experiment, these are just example numbers so far. base_payment = 14 extra_payoff = 6 days_single = 14 days_double = 28 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): # Melessa_ID = models.IntegerField(min=10000) Melessa_ID = models.StringField() iq_result = models.IntegerField() # Rank (from 1 to 10 ) that depends on the relative performance in the iq test Rank = models.IntegerField() # Positive and Negative feedback can be between 0 and 3, negative feedback + positive feedback = 3 PositiveFeedback = models.IntegerField() NegativeFeedback = models.IntegerField() ConfirmPosFeedbackAgain = models.IntegerField(min=0, max=3, blank=True) ConfirmNegFeedbackAgain = models.IntegerField(min=0, max=3, blank=True) # New variable that determines whether individual will be reminded of the feedback # (HighScope = FALSE) or not (HighScope = TRUE) HighScope = models.BooleanField() details_feedback_2=models.BooleanField(initial=False) details_beliefs_3_1 = models.BooleanField(initial=False) #details_beliefs_3_2 = models.BooleanField(initial=False) feedback_order = models.IntegerField() # We need to copy in here Beliefs ... PART 3 BeliefTopHalf3 = models.IntegerField(min=0, max=100, initial=None) payoutrelevant3 = models.IntegerField(initial=10) extraPayoff3 = models.IntegerField(initial=0) ################################################################################################################### ################################## PAGES #################################################### ################################################################################################################### class GeneralInstructions(Page): form_model = 'player' form_fields = ['Melessa_ID'] @staticmethod def before_next_page(player: Player, timeout_happened): player.participant.melessa_id = player.Melessa_ID @staticmethod def error_message(player: Player, values): with open('iq_session2/static/data.csv', 'r') as df: data = csv.DictReader(df) fehler = 1 for row in data: if values['Melessa_ID'] == str(row['ID']): fehler = 0 if fehler == 1: return 'Number not found. Please use the number you wrote down at the end of the first session.' class Reminder_General(Page): @staticmethod def before_next_page(player, timeout_happened): return dict( # rank=set_ranking(player), PositiveFeedback=set_PositiveFeedback(player), NegativeFeedback=set_NegativeFeedback(player), feedback_order=set_feedback_order(player) ) class Reminder_LowScope(Page): # I only want this page to be displayed if the player is in the High Scope treatment. @staticmethod def is_displayed(player): return player.HighScope == 0 # Here we let people repeat their feedback. class ReminderRepetitionNegFirsta(Page): @staticmethod def is_displayed(player): return player.HighScope == 0 and player.feedback_order==0 form_model = 'player' form_fields = ['ConfirmNegFeedbackAgain', 'ConfirmPosFeedbackAgain','details_feedback_2'] @staticmethod def error_message(player: Player, values): if (values['ConfirmNegFeedbackAgain'] == None or values['ConfirmPosFeedbackAgain'] == None) and values['details_feedback_2']==False: return 'You need to fill in the fields' class ReminderRepetitionPosFirsta(Page): @staticmethod def is_displayed(player): return player.HighScope == 0 and player.feedback_order==1 form_model = 'player' form_fields = ['ConfirmNegFeedbackAgain', 'ConfirmPosFeedbackAgain','details_feedback_2'] @staticmethod def error_message(player: Player, values): if (values['ConfirmNegFeedbackAgain'] == None or values['ConfirmPosFeedbackAgain'] == None) and values['details_feedback_2']==False: return 'You need to fill in the fields' class ReminderRepetitionNegFirstb(Page): form_model = 'player' form_fields = ['ConfirmNegFeedbackAgain', 'ConfirmPosFeedbackAgain'] @staticmethod def is_displayed(player: Player): return player.details_feedback_2==True and player.HighScope==0 and player.feedback_order==0 @staticmethod def error_message(player: Player, values): if values['ConfirmNegFeedbackAgain']==None or values['ConfirmPosFeedbackAgain']==None: return 'You need to fill in the fields' class ReminderRepetitionPosFirstb(Page): form_model = 'player' form_fields = ['ConfirmNegFeedbackAgain', 'ConfirmPosFeedbackAgain'] @staticmethod def is_displayed(player: Player): return player.details_feedback_2==True and player.feedback_order==1 @staticmethod def error_message(player: Player, values): if values['ConfirmNegFeedbackAgain']==None or values['ConfirmPosFeedbackAgain']==None: return 'You need to fill in the fields' class BeliefInstructions3a(Page): form_model = 'player' form_fields = ['details_beliefs_3_1'] class BeliefInstructions3b(Page): @staticmethod def is_displayed(player: Player): return player.details_beliefs_3_1==True # Here we elicit subjects belief that they are in the top half class BelievesTopHalf3(Page): form_model = 'player' form_fields = ['BeliefTopHalf3'] @staticmethod def before_next_page(player: Player, timeout_happened): player.participant.high_scope = player.HighScope #class BelievesTopHalf3a(Page): # form_model = 'player' # form_fields = ['BeliefTopHalf3', 'details_beliefs_3_2'] # @staticmethod # def error_message(player: Player, values): # if values['BeliefTopHalf3']==None and values['details_beliefs_3_2']==False: # return 'You need to fill in your guess' # @staticmethod #def before_next_page(player, timeout_happened): # return dict( # Rank=set_ranking(player), # extraPayoff3=set_extrapayoff3(player), #) #class BelievesTopHalf3b(Page): # @staticmethod # def is_displayed(player: Player): # return player.details_beliefs_3_2==True #form_model = 'player' #form_fields = ['BeliefTopHalf3'] #@staticmethod #def before_next_page(player, timeout_happened): # return dict( # Rank=set_ranking(player), # extraPayoff3=set_extrapayoff3(player), #) #@staticmethod #def error_message(player: Player, values): # if values['BeliefTopHalf3']==None: # return 'You need to fill in your guess' class LastPage2(Page): pass class Part1(Page): pass page_sequence = [ GeneralInstructions, Part1, Reminder_General, Reminder_LowScope, ReminderRepetitionNegFirsta, ReminderRepetitionNegFirstb, ReminderRepetitionPosFirsta, ReminderRepetitionPosFirstb, BeliefInstructions3a, BeliefInstructions3b, BelievesTopHalf3, #LastPage2, ]