Skip to content

Commit a56f285

Browse files
committed
refactoring dabest_object with errors
1 parent 9f1bf1d commit a56f285

2 files changed

Lines changed: 244 additions & 228 deletions

File tree

dabest/_dabest_object.py

Lines changed: 122 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -54,124 +54,16 @@ def __init__(
5454
self.__proportional = proportional
5555
self.__mini_meta = mini_meta
5656

57-
# Check if it is a valid mini_meta case
58-
if self.__mini_meta:
59-
# Only mini_meta calculation but not proportional and delta-delta function
60-
if self.__proportional:
61-
err0 = "`proportional` and `mini_meta` cannot be True at the same time."
62-
raise ValueError(err0)
63-
if self.__delta2:
64-
err0 = "`delta2` and `mini_meta` cannot be True at the same time."
65-
raise ValueError(err0)
66-
67-
# Check if the columns stated are valid
68-
# TODO instead of traversing twice idx you can traverse only once
69-
# and break the loop if the condition is not satisfied?
70-
# TODO What if the type is not str and not tuple,list? missing raise Error
71-
if all([isinstance(i, str) for i in idx]):
72-
if len(pd.unique([t for t in idx]).tolist()) != 2:
73-
err0 = "`mini_meta` is True, but `idx` ({})".format(idx)
74-
err1 = "does not contain exactly 2 columns."
75-
raise ValueError(err0 + err1)
76-
77-
if all([isinstance(i, (tuple, list)) for i in idx]):
78-
all_idx_lengths = [len(t) for t in idx]
79-
if (array(all_idx_lengths) != 2).any():
80-
err1 = "`mini_meta` is True, but some idx "
81-
err2 = "in {} does not consist only of two groups.".format(idx)
82-
raise ValueError(err1 + err2)
83-
84-
# TODO can you have True mini_meta and delta2 at the same time?
85-
# Check if this is a 2x2 ANOVA case and x & y are valid columns
86-
# Create experiment_label and x1_level
87-
if self.__delta2:
88-
# TODO Wrap the errors in a separate function called check_errors()
89-
if x is None:
90-
error_msg = "If `delta2` is True. `x` parameter cannot be None. String or list expected"
91-
raise ValueError(error_msg)
92-
93-
if self.__proportional:
94-
err0 = "`proportional` and `delta2` cannot be True at the same time."
95-
raise ValueError(err0)
96-
97-
# idx should not be specified
98-
if idx:
99-
err0 = "`idx` should not be specified when `delta2` is True.".format(
100-
len(x)
101-
)
102-
raise ValueError(err0)
103-
104-
# Check if x is valid
105-
# TODO if x is None is fine??
106-
if len(x) != 2:
107-
err0 = "`delta2` is True but the number of variables indicated by `x` is {}.".format(
108-
len(x)
109-
)
110-
raise ValueError(err0)
111-
112-
for i in x:
113-
if i not in self.__output_data.columns:
114-
err = "{0} is not a column in `data`. Please check.".format(i)
115-
raise IndexError(err)
116-
117-
# Check if y is valid
118-
if not y:
119-
err0 = "`delta2` is True but `y` is not indicated."
120-
raise ValueError(err0)
121-
122-
if y not in self.__output_data.columns:
123-
err = "{0} is not a column in `data`. Please check.".format(y)
124-
raise IndexError(err)
125-
126-
# Check if experiment is valid
127-
if experiment not in self.__output_data.columns:
128-
err = "{0} is not a column in `data`. Please check.".format(experiment)
129-
raise IndexError(err)
130-
131-
# Check if experiment_label is valid and create experiment when needed
132-
if experiment_label:
133-
if len(experiment_label) != 2:
134-
err0 = "`experiment_label` does not have a length of 2."
135-
raise ValueError(err0)
136-
137-
for i in experiment_label:
138-
if i not in self.__output_data[experiment].unique():
139-
err = "{0} is not an element in the column `{1}` of `data`. Please check.".format(
140-
i, experiment
141-
)
142-
raise IndexError(err)
143-
else:
144-
experiment_label = self.__output_data[experiment].unique()
145-
146-
# Check if x1_level is valid
147-
if x1_level:
148-
if len(x1_level) != 2:
149-
err0 = "`x1_level` does not have a length of 2."
150-
raise ValueError(err0)
151-
152-
for i in x1_level:
153-
if i not in self.__output_data[x[0]].unique():
154-
err = "{0} is not an element in the column `{1}` of `data`. Please check.".format(
155-
i, experiment
156-
)
157-
raise IndexError(err)
158-
159-
else:
160-
x1_level = self.__output_data[x[0]].unique()
161-
162-
# TODO what if experiment is None?
163-
elif experiment:
164-
experiment_label = self.__output_data[experiment].unique()
165-
x1_level = self.__output_data[x[0]].unique()
166-
self.__experiment_label = experiment_label
167-
self.__x1_level = x1_level
57+
# after this call the attributes self.__experiment_label and self.__x1_level are updated
58+
self._check_errors(x, y, idx, experiment, experiment_label, x1_level)
59+
16860

16961
# create new x & idx and record the second variable if this is a valid 2x2 ANOVA case
17062
if idx is None and x is not None and y is not None:
17163
# Add a length check for unique values in the first element in list x,
17264
# if the length is greater than 2, force delta2 to be False
17365
# Should be removed if delta2 for situations other than 2x2 is supported
174-
if len(self.__output_data[x[0]].unique()) > 2 and x1_level is None:
66+
if len(self.__output_data[x[0]].unique()) > 2 and self.__x1_level is None:
17567
self.__delta2 = False
17668
# stop the loop if delta2 is False
17769

@@ -188,9 +80,9 @@ def __init__(
18880

18981
# create idx and record the first and second x variable
19082
idx = []
191-
for i in list(map(lambda x: str(x), experiment_label)):
83+
for i in list(map(lambda x: str(x), self.__experiment_label)):
19284
temp = []
193-
for j in list(map(lambda x: str(x), x1_level)):
85+
for j in list(map(lambda x: str(x), self.__x1_level)):
19486
temp.append(j + " " + i)
19587
idx.append(temp)
19688

@@ -533,6 +425,122 @@ def _all_plot_groups(self):
533425
"""
534426
return self.__all_plot_groups
535427

428+
def _check_errors(self, x, y, idx, experiment, experiment_label, x1_level):
429+
'''
430+
Function to check some input parameters and combinations between them.
431+
At the end of this function these two class attributes are updated
432+
self.__experiment_label and self.__x1_level
433+
'''
434+
# Check if it is a valid mini_meta case
435+
if self.__mini_meta:
436+
# Only mini_meta calculation but not proportional and delta-delta function
437+
if self.__proportional:
438+
err0 = "`proportional` and `mini_meta` cannot be True at the same time."
439+
raise ValueError(err0)
440+
if self.__delta2:
441+
err0 = "`delta2` and `mini_meta` cannot be True at the same time."
442+
raise ValueError(err0)
443+
444+
# Check if the columns stated are valid
445+
# TODO instead of traversing twice idx you can traverse only once
446+
# and break the loop if the condition is not satisfied?
447+
# TODO What if the type is not str and not tuple,list? missing raise Error
448+
if all([isinstance(i, str) for i in idx]):
449+
if len(pd.unique([t for t in idx]).tolist()) != 2:
450+
err0 = "`mini_meta` is True, but `idx` ({})".format(idx)
451+
err1 = "does not contain exactly 2 columns."
452+
raise ValueError(err0 + err1)
453+
454+
if all([isinstance(i, (tuple, list)) for i in idx]):
455+
all_idx_lengths = [len(t) for t in idx]
456+
if (array(all_idx_lengths) != 2).any():
457+
err1 = "`mini_meta` is True, but some idx "
458+
err2 = "in {} does not consist only of two groups.".format(idx)
459+
raise ValueError(err1 + err2)
460+
461+
# TODO can you have True mini_meta and delta2 at the same time?
462+
# Check if this is a 2x2 ANOVA case and x & y are valid columns
463+
# Create experiment_label and x1_level
464+
if self.__delta2:
465+
if x is None:
466+
error_msg = "If `delta2` is True. `x` parameter cannot be None. String or list expected"
467+
raise ValueError(error_msg)
468+
469+
if self.__proportional:
470+
err0 = "`proportional` and `delta2` cannot be True at the same time."
471+
raise ValueError(err0)
472+
473+
# idx should not be specified
474+
if idx:
475+
err0 = "`idx` should not be specified when `delta2` is True.".format(
476+
len(x)
477+
)
478+
raise ValueError(err0)
479+
480+
# Check if x is valid
481+
if len(x) != 2:
482+
err0 = "`delta2` is True but the number of variables indicated by `x` is {}.".format(
483+
len(x)
484+
)
485+
raise ValueError(err0)
486+
487+
for i in x:
488+
if i not in self.__output_data.columns:
489+
err = "{0} is not a column in `data`. Please check.".format(i)
490+
raise IndexError(err)
491+
492+
# Check if y is valid
493+
if not y:
494+
err0 = "`delta2` is True but `y` is not indicated."
495+
raise ValueError(err0)
496+
497+
if y not in self.__output_data.columns:
498+
err = "{0} is not a column in `data`. Please check.".format(y)
499+
raise IndexError(err)
500+
501+
# Check if experiment is valid
502+
if experiment not in self.__output_data.columns:
503+
err = "{0} is not a column in `data`. Please check.".format(experiment)
504+
raise IndexError(err)
505+
506+
# Check if experiment_label is valid and create experiment when needed
507+
if experiment_label:
508+
if len(experiment_label) != 2:
509+
err0 = "`experiment_label` does not have a length of 2."
510+
raise ValueError(err0)
511+
512+
for i in experiment_label:
513+
if i not in self.__output_data[experiment].unique():
514+
err = "{0} is not an element in the column `{1}` of `data`. Please check.".format(
515+
i, experiment
516+
)
517+
raise IndexError(err)
518+
else:
519+
experiment_label = self.__output_data[experiment].unique()
520+
521+
# Check if x1_level is valid
522+
if x1_level:
523+
if len(x1_level) != 2:
524+
err0 = "`x1_level` does not have a length of 2."
525+
raise ValueError(err0)
526+
527+
for i in x1_level:
528+
if i not in self.__output_data[x[0]].unique():
529+
err = "{0} is not an element in the column `{1}` of `data`. Please check.".format(
530+
i, experiment
531+
)
532+
raise IndexError(err)
533+
534+
else:
535+
x1_level = self.__output_data[x[0]].unique()
536+
537+
# TODO what if experiment is None?
538+
elif experiment:
539+
experiment_label = self.__output_data[experiment].unique()
540+
x1_level = self.__output_data[x[0]].unique()
541+
self.__experiment_label = experiment_label
542+
self.__x1_level = x1_level
543+
536544
def _get_plot_data(self, x, y, all_plot_groups):
537545
"""
538546
Function to prepare some attributes for plotting

0 commit comments

Comments
 (0)