Рубрики
Без рубрики

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

Основной пример психопатии. Я показываю, как разработать эксперимент, который регистрирует, сколько времени требуется кому-то, чтобы нажать клавишу, а затем сохраняет данные в виде csv-файла.

Автор оригинала: Mathias Gatti.

Вступление

Библиотека 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]

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

Окно

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

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