# -*- coding: utf-8 -*-
import neurokit as nk
import pandas as pd
import datetime
import random
from .path import *
from .core import *
from .write import *
from .image import *
from .start import *
from .scale import *
from .ask import *
from .data import *
# ==============================================================================
# ==============================================================================
# ==============================================================================
# ==============================================================================
# ==============================================================================
# ==============================================================================
# ==============================================================================
# ==============================================================================
[docs]def instructions(text, background='white', color="black", size=1.0,
title="INSTRUCTIONS", title_color="black", subtitle=None, subtitle_color="black", end_text="Appuyez sur ENTRER pour commencer.", top_space=5):
"""
Help incomplete, sorry.
Parameters
----------
NA
Returns
----------
NA
Example
----------
NA
Authors
----------
Dominique Makowski
Dependencies
----------
- pygame 1.9.2
"""
newpage(background, auto_refresh=False)
if title is not None:
write(title, style="title", color=title_color)
if subtitle is not None:
write(subtitle, style="subtitle", color=subtitle_color)
top_space = ["\n"]*top_space
top_space = "".join(str(elem) for elem in top_space)
write(top_space + text, size=size, color=color, long_text=True)
write(end_text, style='end', color=color)
# ==============================================================================
# ==============================================================================
# ==============================================================================
# ==============================================================================
# ==============================================================================
# ==============================================================================
# ==============================================================================
# ==============================================================================
[docs]def questionnaire(questions_dictionary, questions_list_key_name='Item', background='white', size=1, show_page_number=True, randomize=False, reverse=False, results_save=False, results_name="questionnaire_results", results_path="", participant_id="", dimensions_mean=False, dimensions_key_name='Dimension', style='red', x=0, y=-3.3, anchors=None, anchors_space=2, anchors_size=0.7, edges=[0,100], validation=True, analog=True, step=1, labels="numeric", labels_size=0.8, labels_rotation=0, labels_space=-1, labels_x=0, line_thickness=4, line_length=8, line_color="black", title=None, title_style="body", title_size=1, title_space=2, point_center=False, point_edges=True, force_separation=False, separation_labels=None, separation_labels_size=1, separation_labels_rotate=0, separation_labels_space=-1, show_result=False, show_result_shape="circle", show_result_shape_fill_color="white", show_result_shape_line_color="red", show_result_shape_size=0.8, show_result_space=1.2, show_result_size=0.5, show_result_color="black", instructions_text=None, instructions_top_space=5, show_result_decimals=1, cursor_size=1):
"""
A wrapper function for easily creating questionnaires. You can go back and forth in the questions using the LEFT and RIGHT keyboard arrows.
Parameters
----------
questions_dictionary : dict
A dict of the following stucture:
>>> questions_dictionary = {
>>> "Item": {
>>> 1: "Is Neuropsydia great?",
>>> 2: "Is Neuropsydia not great?",
>>> 3: "Is Python great?",
>>> 4: "Is Python not great?"
>>> }
>>> }
questions_list_key_name : str
Key name of the sub-dict containing the items.
background : str
Background color.
size : int
Question's size.
show_page_number : bool
Show page number.
randomize : bool
Randomize question presentation.
reverse : bool
Needs a "Reverse" sub-dict with booleans showing which questions are reversed.
results_save : bool
Save the results.
results_name : str
Filename.
results_path : str
Path where to save.
participant_id : str
Append the participant's name in the filename.
dimensions_mean : bool
Compute the mean by dimension. Needs a "Dimension" sub-dict.
dimensions_key_name : str
Key name of the sub-dict containing dimensions.
style : str
style, check `neuropsydia.scale_styles()` function to see what's available.
x : float
Horizontal position of the center (from -10 (left) to 10 (right)).
y : float
Vertical position of the center (from -10 (bottom) to 10 (top)).
anchors : list of two str
a list of two propositions to be displayed on the sides of the scale (e.g., [not at all, very much]).
anchors_space : float
spacing betweeen the edge and the anchors.
anchors_size : float
size of the anchors' font.
edges : list
the underlying numerical edges of the scale.
validation : bool
confirm the response with a second left click or withdraw with a right click.
analog : bool
continuous (discrete) scale.
step : int
if analog is True, what are the step to go between the edges (determine the number of points on the scale).
labels : str or list
"num", "numeric" or "numbers" or list of actual text labels (e.g., ["not at all", "a bit", "very much"]).
labels_size : float
Size of labels.
labels_rotation : float
Labels rotation angle.
labels_space : float
Space between scale and labels.
labels_x : float
Horizontal dodging position.
line_thickness : float
Scale line thickness.
line_length : float
Scale line length.
line_color : str
Scale line color.
background : str
Scale background color.
title : str
Scale title/question to ask.
title_style : str
'body', 'psychometry', 'psychometry_bold', 'light', 'bold'. You can also insert the name of a system font, or the path to a specific font.
title_size : float
Title size.
title_space : float
Space between scale and title.
point_center : bool
Place a point at the center.
point_edges : bool
Place points at the edges.
reverse : bool
The result is scored as inverse.
force_separation : int
Creates visual separations with points.
separation_labels : list
Place labels corresponding to the separations.
separation_labels_size : float
Separation labels size.
separation_labels_rotate : float
Separation labels rotation angle.
separation_labels_space : float
Space between scale and separation labels.
show_result : bool
Add a marker to show the value on scale.
show_result_shape : str
Shape of this marker. "circle" or "rectangle".
show_result_shape_fill_color : str
Fill color of the marker.
show_result_shape_line_color : str
Line color of the marker.
show_result_shape_size : float
Marker's shape size.
show_result_space : float
Space between scale and marker.
show_result_size : float
Results text size.
show_result_color : str
Results text color.
show_result_decimals : int
How many decimals to show.
cursor_size : float
Size of the circle cursor.
Returns
----------
df : pandas.DataFrame
A pandas' dataframe containing the data.
Example
----------
>>> import neuropsydia as n
>>> questions_dictionary = {
>>> "Item": {
>>> 1: "Is Neuropsydia great?",
>>> 2: "Is Neuropsydia not great?",
>>> 3: "Is Python great?",
>>> 4: "Is Python not great?"
>>> },
>>> "Reverse": {
>>> 1: False,
>>> 2: True,
>>> 3: False,
>>> 4: True
>>> },
>>> "Dimension": {
>>> 1: "Neuropsydia",
>>> 2: "Neuropsydia",
>>> 3: "Python",
>>> 4: "Python"
>>> }
>>> }
>>> n.start()
>>> n.questionnaire(questions_dictionary, anchors=["No", "Yes"], results_save=True, dimensions_mean=True)
>>> n.close()
Notes
----------
*Authors*
- Dominique Makowski (https://github.com/DominiqueMakowski)
*Dependencies*
- pygame
- pandas
"""
time_start = datetime.datetime.now()
if isinstance(questions_dictionary,dict) == False:
print("NEUROPSYDIA ERROR: questionnaire(): wrong object given (not a dictionary), check http://www.neuropsydia.com/#!create-questionnaire/ncq23 for help.")
try:
questions = questions_dictionary[questions_list_key_name]
except:
print("NEUROPSYDIA ERROR: questionnaire(): arg questions_list_key_name does not match.")
n_questions = len(questions)
order = list(questions.keys())
if randomize is True:
random.shuffle(order)
questions_dictionary["Answer"] = {}
questions_dictionary["RT"] = {}
questions_dictionary["Order"] = {}
questions_dictionary["Time"] = {}
if instructions_text != None:
try:
instructions(instructions_text, top_space=instructions_top_space)
except:
print("NEUROPSYDIA ERROR: questionnaire(): problem in 'instructions_text' arg, make sure it's a normal string.")
i = 0
while i < n_questions:
try:
newpage(background, auto_refresh=False)
time.wait(30)
if show_page_number is True:
write('Question n°' + str(i+1) + '/' + str(n_questions), style="light", y=9)
text = questions_dictionary[questions_list_key_name][order[i]]
write('\n\n\n\n\n\n'+text, long_text=True, size=size)
try:
reverse_question = questions_dictionary['Reverse'][order[i]]
except:
if isinstance(reverse,list) is True:
reverse_question=reverse[i]
else:
reverse_question=reverse
try:
if isinstance(questions_dictionary["Anchors"], dict):
anchors = questions_dictionary['Anchors'][order[i]]
except:
pass
t0 = builtin_time.clock()
answer = scale(style=style, anchors=anchors, anchors_space=anchors_space, anchors_size=anchors_size, edges = edges, validation=validation, analog=analog, step=step, labels=labels, labels_size=labels_size, labels_rotation=labels_rotation, labels_space=labels_space,labels_x=labels_x, line_thickness=line_thickness, line_length=line_length, line_color=line_color, background=background, title=title, title_style=title_style, title_size=title_size, title_space=title_space, reverse=reverse_question, point_center=point_center, point_edges=point_edges, force_separation=force_separation, separation_labels=separation_labels, separation_labels_size=separation_labels_size, separation_labels_rotate=separation_labels_rotate, separation_labels_space=separation_labels_space, show_result=show_result, show_result_shape=show_result_shape, show_result_shape_fill_color=show_result_shape_fill_color, show_result_shape_line_color=show_result_shape_line_color, show_result_shape_size=show_result_shape_size, show_result_space=show_result_space, show_result_size=show_result_size, show_result_color=show_result_color, show_result_decimals=show_result_decimals, cursor_size=cursor_size)
RT = (builtin_time.clock()-t0 ) * 1000
if answer == 'RIGHT':
answer = np.nan
questions_dictionary["Answer"][order[i]] = answer
questions_dictionary["RT"][order[i]] = RT
questions_dictionary["Order"][order[i]] = i+1
questions_dictionary["Time"][order[i]] = datetime.datetime.now()
if answer == 'LEFT':
i -= 1
else:
i += 1
except:
print("NEUROPSYDIA ERROR: questionnaire(): someting went wrong (error number 2)")
df = pd.DataFrame.from_dict(questions_dictionary)
df["Time_Start"] = time_start
df["Time_End"] = datetime.datetime.now()
df["Total_Duration"] = (datetime.datetime.now()-time_start).total_seconds()
if dimensions_mean == True:
for dim in set(df[dimensions_key_name]):
df[dim] = df[(df[dimensions_key_name]==dim)]["Answer"].mean()
if results_save == True:
save_data(df, filename=results_name, path=results_path, participant_id=participant_id, index=True, index_label="Item_Number")
return(df)