es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Otree / Python – Agrupación secuencial basada en el atributo del jugador.

Actualmente estoy trabajando en un experimento en línea de oTree con 5 grupos de tratamiento. Dentro de cada grupo de tratamiento, los jugadores serán asignados a grupos de 2 jugadores.

Por lo tanto, los participantes de mi experimento hacen clic en el enlace y son asignados a 1 de los 5 grupos de tratamiento ((['TG1', 'TG2', 'TG3', 'TG4', 'CG'])) a través de la siguiente función:

def creating_session(self):
    for player in self.get_players():
        player.experimental_group = random.choice(['TG1', 'TG2', 'TG3', 'TG4', 'CG'])
        print('asignando player.experimental_group a', player.experimental_group)

En el siguiente paso, me gustaría emparejar a los jugadores con el mismo atributo experimental_group en grupos de 2 jugadores. Y me gustaría que este emparejamiento ocurra secuencialmente en el orden en que se unen al experimento para reducir el tiempo de espera.

¿Cómo puedo realizar este emparejamiento de grupos basado en el atributo player.experimental_group?

Adjunto la siguiente imagen para aclarar las cosas: me gustaría emparejar a P1 con P3 ya que ambos son ‘TG3’ y a P2 con P4, y así sucesivamente.
Imagen

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para realizar la coincidencia de grupos basada en el atributo player.experimental_group, puedes utilizar el método group_by_arrival_time proporcionado por oTree. Este método agrupa a los jugadores según el orden de llegada y luego ordena esos grupos según un atributo específico, que en este caso es el atributo player.experimental_group.

    Aquí tienes un ejemplo de implementación:

    from otree.api import models, BaseSubsession, BaseGroup, BasePlayer
    
    class Subsession(BaseSubsession):
        def creating_session(self):
            # crea los grupos de tratamiento
            treatment_groups = ['TG1', 'TG2', 'TG3', 'TG4', 'CG']
    
            # asigna aleatoriamente los jugadores a los grupos de tratamiento
            for player in self.get_players():
                player.experimental_group = random.choice(treatment_groups)
    
            # agrupa a los jugadores según el atributo experimental_group
            players = self.get_players()
            players.sort(key=lambda p: p.participant.id_in_session)
            groups = []
            for group_label in treatment_groups:
                group_players = [p for p in players if p.experimental_group == group_label]
                for i in range(0, len(group_players), 2):
                    groups.append(group_players[i:i+2])
            self.set_groups(groups)
    
    class Group(BaseGroup):
        # aquí van tus métodos y campos a nivel de grupo
        pass
    
    class Player(BasePlayer):
        experimental_group = models.StringField(choices=['TG1', 'TG2', 'TG3', 'TG4', 'CG'])
        # aquí van tus métodos y campos a nivel de jugador
        pass
    

    En esta implementación, el método creating_session asigna aleatoriamente a los jugadores a los grupos de tratamiento. Luego, utiliza el método group_by_arrival_time para agrupar a los jugadores según su orden de llegada y ordena esos grupos según el atributo player.experimental_group. Finalmente, agrupa a los jugadores de cada grupo de tratamiento en pares y establece esos pares como los grupos para la sesión.

Comments are closed.