Как программировать базовые психологические эксперименты с помощью Python

Введение

Библиотека Psychopy — полезная платформа для разработки психологических экспериментов с использованием Python. В этом примере я покажу, как разработать базовый эксперимент, который регистрирует, сколько времени требуется человеку, чтобы нажать клавишу, а затем я сохраню данные в виде CSV-файла. Полный код можно найти здесь.

Изображение WhatsApp 2019-06-09 в 11.40.28 (2).jpeg

Код

Библиотеки

Сначала я импортирую библиотеки

from psychopy import visual, core, event
import datetime # Used to register the date of the experiment
import pandas as pd # Used to save the data as csv easily

Установка констант и глобальных переменных

# Colours
gray = '#969696'
black = '#000000'
white="#FFFFFF"

# Window parameters
resolution = [300, 300]

Определение основных функций

Окно

В психопи вы определяете окно, в котором все экраны будут отображаться следующим образом.

def window(resolution):
    fullScreen = False
    win = visual.Window(resolution,units="pix",  color=gray, colorSpace="hex", fullscr=fullScreen, monitor = "testMonitor")
    win.setMouseVisible(False)
    return win

Экраны

Теперь мы собираемся определить экраны. Здесь мы укажем текст сообщения, его стиль, цвет фона и все такое. В нашей программе есть только два экрана: начальный экран, на котором вас просят начать, и экран остановки, который записывает, сколько времени вам потребовалось, чтобы нажать кнопку.

Изображение WhatsApp 2019-06-09 в 11.40.49 (1).jpeg

def loadInstructionsAndFlip(win):
    background = visual.Rect(win, width=resolution[0]+10, height=resolution[1]+10, fillColor=black, fillColorSpace="hex")
    msg1 = visual.TextStim(win, text="press [ q ] to exit", pos=(0.0,(-resolution[1]*0.10)), color=white, colorSpace="hex")
    msg2 = visual.TextStim(win, text="press [ n ] to continue", color=white, colorSpace="hex",alignHoriz='center', alignVert="center")
    background.draw()
    msg1.draw()
    msg2.draw()

    # Elements are only displayed after the flip command is executed
    win.flip()

def loadStartScreenAndFlip(win):
    background = visual.Rect(win, width=resolution[0]+10, height=resolution[1]+10, fillColor=gray, fillColorSpace="hex")
    msg1 = visual.TextStim(win, text="press any key to start", color=white, colorSpace="hex")
    background.draw()
    msg1.draw()

    # Elements are only displayed after the flip command is executed
    win.flip()

Основная логика

Здесь мы реализуем основную логику программы. Мы создаем часы, которые измеряют время. Мы сбрасываем его на каждой итерации и каждый раз показываем каждый экран.

def startScreensAndRecordData(win):
    clock = core.Clock()
    win.clearBuffer()

    data = []
    loadStartScreenAndFlip(win)
    event.waitKeys()

    while True:
        loadInstructionsAndFlip(win)
        clock.reset()
        keys = event.waitKeys(keyList=["n","q"])
        for key in keys:
            time = clock.getTime()
            print("You pressed the {} key on {} seconds".format(key,round(time,3)))
            data.append([key,time])
            if key == "q":
                return data
            else:
                loadStartScreenAndFlip(win)
                event.waitKeys()

Собираем все вместе и сохраняем

Наконец, мы собираем все вместе и сохраняем файл в формате CSV с помощью pandas. 😃

def main():
    win = window(resolution)
    data = startScreensAndRecordData(win)

    pd.DataFrame(data,columns=["Key","Time"]).to_csv('experiment_' + str(datetime.date.today()) + '.csv')
    print("Experiment saved as:",'experiment_' + str(datetime.date.today()) + '.csv')

Изображение WhatsApp 2019-06-09 в 11.45.55.jpeg

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *