from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import pandas as pd import numpy as np import itertools import random author = 'Elisa Macchi' doc = """ App to generate Hypothetical Loan Applicants Cards (IRR Kessler et al.) """ class Constants(BaseConstants): name_in_url = 'IRR_cards' players_per_group = None num_rounds = 3 df = pd.read_csv('IRR_cards/occupations.csv') df_w = pd.read_csv('IRR_cards/occupations_wom.csv') collateral = pd.read_csv('IRR_cards/collateral.csv') tier = [1, 2, 3, 4] amount = ["Ush 1 million", "Ush 5 million", "Ush 10 million"] occupation_men = list(df['occupation_men']) occupation_wom = list(df_w['occupation_wom']) print(occupation_wom) collateral = list(collateral['collateral']) print(collateral) img_t = ['1_thin.jpg', '2_thin.jpg', '3_thin.jpg', '4_thin.jpg', '5_thin.jpg', '6_thin.jpg', '7_thin.jpg', '8_thin.jpg', '9_thin.jpg', '10_thin.jpg'] img_f = ['1_fat.jpg', '2_fat.jpg', '3_fat.jpg', '4_fat.jpg', '5_fat.jpg', '6_fat.jpg', '7_fat.jpg', '8_fat.jpg', '9_fat.jpg', '10_fat.jpg'] img_gender = { '1_fat.jpg': 1, '2_fat.jpg': 1, '3_fat.jpg': 1, '4_fat.jpg': 1, '5_fat.jpg': 0, '6_fat.jpg': 0, '7_fat.jpg': 0, '8_fat.jpg': 0, '9_fat.jpg': 1, '10_fat.jpg': 0, '1_thin.jpg': 1, '2_thin.jpg': 1, '3_thin.jpg': 1, '4_thin.jpg': 1, '5_thin.jpg': 0, '6_thin.jpg': 0, '7_thin.jpg': 0, '8_thin.jpg': 0, '9_thin.jpg': 1, '10_thin.jpg': 0, } img_age = { '1_fat.jpg': 31, '2_fat.jpg': 58, '3_fat.jpg': 47, '4_fat.jpg': 32, '5_fat.jpg': 40, '6_fat.jpg': 52, '7_fat.jpg': 56, '8_fat.jpg': 38, '9_fat.jpg': 33, '10_fat.jpg': 37, '1_thin.jpg': 31, '2_thin.jpg': 58, '3_thin.jpg': 47, '4_thin.jpg': 32, '5_thin.jpg': 40, '6_thin.jpg': 52, '7_thin.jpg': 56, '8_thin.jpg': 38, '9_thin.jpg': 33, '10_thin.jpg': 37, } class Subsession(BaseSubsession): def creating_session(self): for p in self.get_players(): # randomize picture sample_bmi = np.random.choice([1, 2], size=3, replace=True) sample_bmi_cycle = itertools.cycle(sample_bmi) sample_thin = random.sample(population=Constants.img_t, k=4) sample_fat = random.sample(population=Constants.img_f, k=4) rand_c1_bmi1 = next(sample_bmi_cycle) if rand_c1_bmi1 == 1: p.rand_c1_picture1 = sample_thin[0] else: p.rand_c1_picture1 = sample_fat[0] p.rand_c1_bmi2 = next(sample_bmi_cycle) if p.rand_c1_bmi2 == 1: p.rand_c1_picture2 = sample_thin[1] else: p.rand_c1_picture2 = sample_fat[1] p.rand_c1_bmi3 = next(sample_bmi_cycle) if p.rand_c1_bmi3 == 1: p.rand_c1_picture3 = sample_thin[2] else: p.rand_c1_picture3 = sample_fat[2] p.rand_c1_bmi4 = next(sample_bmi_cycle) if p.rand_c1_bmi4 == 1: p.rand_c1_picture4 = sample_thin[3] else: p.rand_c1_picture4 = sample_fat[3] for k, v in Constants.img_gender.items(): if p.rand_c1_picture1 == k: p.gender_c1_picture1 = v if p.rand_c1_picture2 == k: p.gender_c1_picture2 = v if p.rand_c1_picture3 == k: p.gender_c1_picture3 = v if p.rand_c1_picture4 == k: p.gender_c1_picture4 = v for k, v in Constants.img_age.items(): if p.rand_c1_picture1 == k: p.age_c1_picture1 = v if p.rand_c1_picture2 == k: p.age_c1_picture2 = v if p.rand_c1_picture3 == k: p.age_c1_picture3 = v if p.rand_c1_picture4 == k: p.age_c1_picture4 = v # randomize occupation if p.gender_c1_picture1 == 1: p.rand_c1_occupation1 = random.choice(Constants.occupation_men) else: p.rand_c1_occupation1 = random.choice(Constants.occupation_wom) if p.gender_c1_picture2 == 1: p.rand_c1_occupation2 = random.choice(Constants.occupation_men) else: p.rand_c1_occupation2 = random.choice(Constants.occupation_wom) if p.gender_c1_picture3 == 1: p.rand_c1_occupation3 = random.choice(Constants.occupation_men) else: p.rand_c1_occupation3 = random.choice(Constants.occupation_wom) if p.gender_c1_picture4 == 1: p.rand_c1_occupation4 = random.choice(Constants.occupation_men) else: p.rand_c1_occupation4 = random.choice(Constants.occupation_wom) # Randomize Collateral p.collateral = random.choice(Constants.collateral) class Group(BaseGroup): pass class Player(BasePlayer): def role(self): if self.id_in_group <= 20: return 'Kampala' elif self.id_in_group <= 30 and self.id_in_group > 20: return 'Mbarara' else: return 'Gulu' # Card 1 rand_c1_bmi1 = models.IntegerField(choices=[[1, "Low"], [2, "High"]]) rand_c1_bmi2 = models.IntegerField(choices=[[1, "Low"], [2, "High"]]) rand_c1_bmi3 = models.IntegerField(choices=[[1, "Low"], [2, "High"]]) rand_c1_bmi4 = models.IntegerField(choices=[[1, "Low"], [2, "High"]]) rand_c1_picture1 = models.StringField() rand_c1_picture2 = models.StringField() rand_c1_picture3 = models.StringField() rand_c1_picture4 = models.StringField() gender_c1_picture1 = models.IntegerField() gender_c1_picture2 = models.IntegerField() gender_c1_picture3 = models.IntegerField() gender_c1_picture4 = models.IntegerField() age_c1_picture1 = models.IntegerField() age_c1_picture2 = models.IntegerField() age_c1_picture3 = models.IntegerField() age_c1_picture4 = models.IntegerField() rand_c1_occupation1 = models.StringField() rand_c1_occupation2 = models.StringField() rand_c1_occupation3 = models.StringField() rand_c1_occupation4 = models.StringField() collateral = models.StringField()