from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) author = 'jacopo.bregolin@gmail.com' doc = """ Post experimental questions and final payoff """ import pandas as pd class Constants(BaseConstants): name_in_url = 'PostQuestions' players_per_group = None num_rounds = 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): # variables on behavior of subject during game related to advice purchases allt = models.BooleanField() anyt = models.BooleanField() nonet = models.BooleanField() anybid = models.BooleanField() A = models.BooleanField() B = models.BooleanField() C = models.BooleanField() D = models.BooleanField() # variables containing string reporting the mixed behavior of the user, if indeed it was mixed mixed_behavior = models.StringField(initial='') # variables for the final payoff final_payoff = models.IntegerField() final_payoff_euro = models.CurrencyField() # WHAT HAS TO BE PAID TO THE SUBJECT def get_final_payoff(self): return self.session.vars['init_endowment'] + self.participant.vars['payoff_points'] def get_final_payoff_euro(self): return round(self.session.vars['init_endowment'] / self.session.vars['euroconversion'], 2) + round(self.participant.vars['payoff_points'] / self.session.vars['euroconversion'], 2) # post questions for treatments 1A and 1B Q1 = models.IntegerField(min=1, max=10, label="Veuillez indiquer à quel point il a été difficile de prendre des décisions dans cette expérience en utilisant une échelle de 10 points, 1 très facile et 10 très difficile") Q2 = models.StringField(label="Quelles décisions ont été les plus difficiles?") Q3 = models.LongStringField(label="Avez-vous utilisé une règle de prise de décision?") Q4 = models.IntegerField(min=0, max=100, label="Quelle probabilité avez-vous attribué à votre conseiller d'être parfait après avoir reçu son conseil «vert» en période 1? (en pourcentage, chiffre ronde entre entre 0 et 100)") # Q5 = models.IntegerField(min=0, max=100, # label="During the session with 7 green balls in the jar which probability have you assigned to your advisor being perfect after receiving advice “blue” in period 1? (in percentage, between 0 and 100)") Q6all = models.StringField(widget=widgets.RadioSelect) Q6any_neg = models.StringField(widget=widgets.RadioSelect) Q6any_pos = models.StringField(widget=widgets.RadioSelect) Q6none = models.StringField(widget=widgets.RadioSelect) Q6bisall = models.LongStringField(blank=True, label='Si vous avez sélectionné "raisons différentes" pour expliquer vos choix, veuillez préciser ici') Q6bisany_neg = models.LongStringField(blank=True, label='Si vous avez sélectionné "raisons différentes" pour expliquer vos choix, veuillez préciser ici') Q6bisany_pos = models.LongStringField(blank=True, label='Si vous avez sélectionné "raisons différentes" pour expliquer vos choix, veuillez préciser ici') Q6bisnone = models.LongStringField(blank=True, label='Si vous avez sélectionné "raisons différentes" pour expliquer vos choix, veuillez préciser ici') Q7 = models.StringField( choices=[ ' La somme que vous étiez vraiment prêt à payer', 'Plus que vous étiez prêt à payer', 'Moins que vous étiez prêt à payer'], widget=widgets.RadioSelect, label='Quelle somme avez vous proposé de payer pour du conseil dans la période 2 du dernier tour?') # post questions for treatment 2A and 2B # Q1 and Q2 unchanged Q8 = models.IntegerField(min=0, max=100, label="Quelle probabilité avez-vous attribué à vos deux conseillers d'être parfaits après avoir reçu des conseils «verts» de la part de chacun d'eux dans la période 1? (en pourcentage, chiffre ronde entre entre 0 et 100)") Q10 = models.IntegerField(min=0, max=100, label="Quelle probabilité avez-vous attribué à vos deux conseillers d'être parfaits après avoir reçu des conseils «bleu» de l'un d'eux et «vert» de l'autre dans la période 1? (en pourcentage, chiffre ronde entre entre 0 et 100)") Q11 = models.IntegerField(min=0, max=100, label="Quelle probabilité avez-vous attribuée au conseiller à la gauche de votre écran d’être parfait après avoir reçu les conseils «bleu» de sa part et «vert» de la part du conseiller à droite de votre écran? (en pourcentage, chiffre ronde entre entre 0 et 100)") Q12 = models.IntegerField(min=0, max=100, label="Quelle probabilité avez-vous attribué au conseiller à la gauche de votre écran d’être parfait après avoir reçu les conseil «vert» de sa part et «bleu» de la part du conseiller à droite de votre écran? (en pourcentage, chiffre ronde entre entre 0 et 100)") Q13 = models.LongStringField(label="Saviez-vous à l'avance comment vous alliez utiliser du conseil lorsque vous l’avez demandé en période 2? Si oui, dites-nous comment.") Q14A = models.StringField(widget=widgets.RadioSelect, label="Nous avons remarqué qu'au cours des 15 premiers tours, il vous est arrivé de décider sans solliciter des conseils. Veuillez nous expliquer pourquoi:") Q14B = models.StringField(widget=widgets.RadioSelect, label="Nous avons remarqué qu'au cours des 15 premiers tours, il vous est arrivé de solliciter du conseil aux deux conseillers en période 2. Pourquoi?") Q14C = models.StringField(widget=widgets.RadioSelect, label="Nous avons remarqué qu'au cours des 15 premiers tours, il vous est arrivé de solliciter du conseil d’un seul conseiller en période 2. Pourquoi?") Q14D = models.LongStringField() Q14bisA = models.LongStringField(blank=True, label="Si vous avez sélectionné «raisons différentes» pour expliquer vos choix, veuillez préciser ces raisons:") Q14bisB = models.LongStringField(blank=True, label="Si vous avez sélectionné «raisons différentes» pour expliquer vos choix, veuillez préciser ces raisons:") Q14bisC = models.LongStringField(blank=True, label="Si vous avez sélectionné «raisons différentes» pour expliquer vos choix, veuillez préciser ces raisons:") Q15V1 = models.StringField(widget=widgets.RadioSelect, choices=[ "La somme que j'étais vraiment prêt à payer.", "Moins que la somme que j'étais vraiment prêt à payer.", "Plus que la somme que j'étais vraiment prêt à payer."]) Q15V2 = models.StringField(widget=widgets.RadioSelect, choices=[ " La somme que j'étais vraiment prêt à payer.", " Moins que la somme que j'étais vraiment prêt à payer.", " Plus que la somme que j'étais vraiment prêt à payer."]) # demographics D1 = models.StringField(label='Votre sexe:', blank=True) D2 = models.StringField(label='Votre age:', blank=True) D3 = models.StringField(label='Votre langue maternelle:', blank=True) D4 = models.StringField(label=' En quelle année êtes-vous, et quel est votre diplôme:', blank=True) D41 = models.StringField(label=' Êtes-vous daltonien?', blank=True, widget=widgets.RadioSelect, choices=['Oui','Non']) D5 = models.IntegerField(min=1, max=10, blank=True, label=' À quelle fréquence sollicitez-vous du conseil dans des situations réelles en utilisant une échelle de 10 points, avec 1 jamais et 10 toujours?') D7 = models.IntegerField(blank=True, min=1, max=10, label=' Évaluez votre volonté de prendre des risques en général sur une échelle de 10 points, dont 1 complètement réticent et 10 complètement disposé.') # D71 = models.IntegerField(blank=True, min=1, max=10, # label=' Évaluez votre ouverture à une nouvelle expérience sur une échelle de 10 points, dont 1 très prudent et 10 extrêmement curieux.') # D72 = models.IntegerField(blank=True, min=1, max=10, # label=' Évaluez votre conscience sur une échelle de 10 points, avec 1 faible et 10 très élevée.') # D73 = models.IntegerField(blank=True, min=1, max=10, # label=' Évaluez votre extraversion sur une échelle de 10 points, avec 1 solitaire et 10 extrêmement ouverte.') # D74 = models.IntegerField(blank=True, min=1, max=10, # label=' Évaluez votre agrément sur une échelle de 10 points, dont 1 difficile et 10 très gentil.') # D75 = models.IntegerField(blank=True, min=1, max=10, # label=' Évaluez votre neuroticisme sur une échelle de 10 points, dont 1 confiant et 10 très sensible.') D9 = models.FloatField(blank=True, min=0, max=100, label=" Il y a deux pots A et B, contenant chacun 4 balles. Le pot A contient 3 balles noires et 1 balle blanche. Le pot B contient 3 balles blanches et 1 balle noire. Une balle est tirée de l'un des pots. Il se trouve que c'est une balle noir. Quelle est la probabilité que la balle soit tirée du pot A? (en pourcentage, chiffre ronde entre entre 0 et 100)") D10 = models.FloatField(blank=True, min=0, max=100, label=" Il y a une salle avec 100 personnes à l'intérieur dont la moitié sont des hommes et l'autre moitié sont des femmes. Tous les hommes sont économistes. La moitié des femmes sont économistes. Quelle est la probabilité qu'un économiste dans cette pièce soit une femme? (en pourcentage, chiffre ronde entre entre 0 et 100)") # only 1-advisor treatment D8 = models.CurrencyField(blank=True, label="Combien êtes-vous prêt à payer au plus pour jouer à la loterie 2 plutôt qu'à la loterie 1?") # only 2-advisors treatment D11 = models.CurrencyField(blank=True, min=0, label=" Combien êtes-vous prêt à payer au plus pour jouer à la loterie 2 plutôt qu'à la loterie 1?") D12 = models.CurrencyField(blank=True, min=0, label=" Combien êtes-vous prêt à payer au plus pour jouer à la loterie 2 plutôt qu'à la loterie 1?") D13 = models.CurrencyField(blank=True, min=0, label=" Combien êtes-vous prêt à payer au plus pour jouer à la loterie 2 plutôt qu'à la loterie 1?") # confirmation of end confirmed = models.StringField(widget=widgets.RadioSelect, choices=['Oui']) def Q6all_choices(self): choices = [ 'Vous avez toujours été optimiste quant à la qualité de votre conseiller', 'Vous aimez rassembler toutes les informations pertinentes à vos choix', 'Vous avez trouvé facile de compter sur votre conseiller', ' Pour des raisons différentes'] return choices def Q6any_neg_choices(self): choices = [ 'Vous étiez pessimiste quant à la qualité de votre conseiller', 'Vous aimez décider de façon indépendante', 'Vous avez tenté votre chance', 'Vous vouliez simplifier votre prise de décision', 'Pour des raisons différentes'] return choices def Q6any_pos_choices(self): choices = [ 'Vous étiez optimiste quant à la qualité de votre conseiller', 'Vous aimez rassembler toutes les informations pertinentes à vos choix', 'Vous étiez curieux', 'Vous vouliez être plus confiant dans votre décision', 'Pour des raisons différentes'] return choices def Q6none_choices(self): choices= [ 'Vous étiez pessimiste quant à la qualité de votre conseiller', 'Vous aimez décider de façon indépendante', 'Vous avez tenté votre chance', 'Vous vouliez simplifier votre prise de décision', 'Pour des raisons différentes'] return choices def Q14A_choices(self): choices = [ 'Vous étiez pessimiste quant à la qualité de votre conseiller', 'Vous aimez décider de façon indépendante', 'Vous avez tenté votre chance', 'Vous vouliez simplifier votre prise de décision', 'Pour des raisons différentes'] return choices def Q14B_choices(self): choices = [ 'Vous étiez optimiste quant à la qualité de votre conseiller', 'Vous aimez rassembler toutes les informations pertinentes à vos choix', 'Vous étiez curieux', 'Vous vouliez être plus confiant dans votre décision', 'Pour des raisons différentes'] return choices def Q14C_choices(self): choices = [ "C'était une information suffisante pour votre décision.", "Vous ne vouliez pas faire face à la situation où vos conseillers n'étaient pas d'accord.", "Pour des raisons différentes"] return choices def get_behavior_string(self): adv_purchases = self.participant.vars['advice_purchases'] dfadvices = pd.DataFrame({'requests':adv_purchases}, index=[i for i in range(len(adv_purchases))]) rounds_0 = dfadvices.loc[dfadvices['requests']=='0'].index.tolist() rounds_1or2 = dfadvices.loc[dfadvices['requests'].isin(['1','2'])].index.tolist() rounds_12 = dfadvices.loc[dfadvices['requests']=='12'].index.tolist() options = dfadvices['requests'].unique() mixed_behavior = '' for i in options: if i == '12': mixed_behavior += ' Vous avez demandé du conseil aux deux conseillers dans le(s) tour(s) ' + str([j+1 for j in rounds_12]) + '. ' elif i in ['1','2']: mixed_behavior += ' Vous avez demandé le conseil d’un seul conseiller dans le(s) tour(s) ' + str([j+1 for j in rounds_1or2]) + '. ' elif i == '0': mixed_behavior += " Vous n'avez pas demandé de conseil dans le(s) tour(s) " + str([j+1 for j in rounds_0]) + '. ' return mixed_behavior