Как программировать базовые психологические эксперименты с помощью Python
Введение
Библиотека Psychopy — полезная платформа для разработки психологических экспериментов с использованием Python. В этом примере я покажу, как разработать базовый эксперимент, который регистрирует, сколько времени требуется человеку, чтобы нажать клавишу, а затем я сохраню данные в виде CSV-файла. Полный код можно найти здесь.
Код
Библиотеки
Сначала я импортирую библиотеки
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
Экраны
Теперь мы собираемся определить экраны. Здесь мы укажем текст сообщения, его стиль, цвет фона и все такое. В нашей программе есть только два экрана: начальный экран, на котором вас просят начать, и экран остановки, который записывает, сколько времени вам потребовалось, чтобы нажать кнопку.
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')