Skip to content

Commit 93b476b

Browse files
committed
decentralize unit tests, cite argument in error message, add unit tests for validation function
1 parent 935671d commit 93b476b

18 files changed

+244
-220
lines changed

pandas/computation/eval.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ def eval(expr, parser='pandas', engine=None, truediv=True,
233233
pandas.DataFrame.query
234234
pandas.DataFrame.eval
235235
"""
236-
inplace = _validate_bool_type(inplace)
236+
inplace = _validate_bool_type(inplace, 'inplace')
237237
first_expr = True
238238
if isinstance(expr, string_types):
239239
_check_expression(expr)

pandas/computation/tests/test_eval.py

+9
Original file line numberDiff line numberDiff line change
@@ -1970,6 +1970,15 @@ def test_negate_lt_eq_le():
19701970
for engine, parser in product(_engines, expr._parsers):
19711971
yield check_negate_lt_eq_le, engine, parser
19721972

1973+
class TestValidate(tm.TestCase):
1974+
1975+
def test_validate_bool_args(self):
1976+
invalid_values = [1, "True", [1,2,3], 5.0]
1977+
1978+
for value in invalid_values:
1979+
with self.assertRaises(ValueError):
1980+
pd.eval("2+2", inplace=value)
1981+
19731982

19741983
if __name__ == '__main__':
19751984
nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'],

pandas/core/base.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1179,7 +1179,7 @@ def searchsorted(self, value, side='left', sorter=None):
11791179
False: 'first'})
11801180
@Appender(_shared_docs['drop_duplicates'] % _indexops_doc_kwargs)
11811181
def drop_duplicates(self, keep='first', inplace=False):
1182-
inplace = _validate_bool_type(inplace)
1182+
inplace = _validate_bool_type(inplace, 'inplace')
11831183
if isinstance(self, ABCIndexClass):
11841184
if self.is_unique:
11851185
return self._shallow_copy()

pandas/core/categorical.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ def set_ordered(self, value, inplace=False):
616616
Whether or not to set the ordered attribute inplace or return a copy
617617
of this categorical with ordered set to the value
618618
"""
619-
inplace = _validate_bool_type(inplace)
619+
inplace = _validate_bool_type(inplace, 'inplace')
620620
self._validate_ordered(value)
621621
cat = self if inplace else self.copy()
622622
cat._ordered = value
@@ -633,7 +633,7 @@ def as_ordered(self, inplace=False):
633633
Whether or not to set the ordered attribute inplace or return a copy
634634
of this categorical with ordered set to True
635635
"""
636-
return self.set_ordered(True, inplace=_validate_bool_type(inplace))
636+
return self.set_ordered(True, inplace=_validate_bool_type(inplace, 'inplace'))
637637

638638
def as_unordered(self, inplace=False):
639639
"""
@@ -645,7 +645,7 @@ def as_unordered(self, inplace=False):
645645
Whether or not to set the ordered attribute inplace or return a copy
646646
of this categorical with ordered set to False
647647
"""
648-
return self.set_ordered(False, inplace=_validate_bool_type(inplace))
648+
return self.set_ordered(False, inplace=_validate_bool_type(inplace, 'inplace'))
649649

650650
def _get_ordered(self):
651651
""" Gets the ordered attribute """
@@ -704,7 +704,7 @@ def set_categories(self, new_categories, ordered=None, rename=False,
704704
remove_categories
705705
remove_unused_categories
706706
"""
707-
inplace = _validate_bool_type(inplace)
707+
inplace = _validate_bool_type(inplace, 'inplace')
708708
new_categories = self._validate_categories(new_categories)
709709
cat = self if inplace else self.copy()
710710
if rename:
@@ -757,7 +757,7 @@ def rename_categories(self, new_categories, inplace=False):
757757
remove_unused_categories
758758
set_categories
759759
"""
760-
inplace = _validate_bool_type(inplace)
760+
inplace = _validate_bool_type(inplace, 'inplace')
761761
cat = self if inplace else self.copy()
762762
cat.categories = new_categories
763763
if not inplace:
@@ -798,7 +798,7 @@ def reorder_categories(self, new_categories, ordered=None, inplace=False):
798798
remove_unused_categories
799799
set_categories
800800
"""
801-
inplace = _validate_bool_type(inplace)
801+
inplace = _validate_bool_type(inplace, 'inplace')
802802
if set(self._categories) != set(new_categories):
803803
raise ValueError("items in new_categories are not the same as in "
804804
"old categories")
@@ -837,7 +837,7 @@ def add_categories(self, new_categories, inplace=False):
837837
remove_unused_categories
838838
set_categories
839839
"""
840-
inplace = _validate_bool_type(inplace)
840+
inplace = _validate_bool_type(inplace, 'inplace')
841841
if not is_list_like(new_categories):
842842
new_categories = [new_categories]
843843
already_included = set(new_categories) & set(self._categories)
@@ -883,7 +883,7 @@ def remove_categories(self, removals, inplace=False):
883883
remove_unused_categories
884884
set_categories
885885
"""
886-
inplace = _validate_bool_type(inplace)
886+
inplace = _validate_bool_type(inplace, 'inplace')
887887
if not is_list_like(removals):
888888
removals = [removals]
889889

@@ -924,7 +924,7 @@ def remove_unused_categories(self, inplace=False):
924924
remove_categories
925925
set_categories
926926
"""
927-
inplace = _validate_bool_type(inplace)
927+
inplace = _validate_bool_type(inplace, 'inplace')
928928
cat = self if inplace else self.copy()
929929
idx, inv = np.unique(cat._codes, return_inverse=True)
930930

@@ -1325,7 +1325,7 @@ def sort_values(self, inplace=False, ascending=True, na_position='last'):
13251325
[NaN, NaN, 5.0, 2.0, 2.0]
13261326
Categories (2, int64): [2, 5]
13271327
"""
1328-
inplace = _validate_bool_type(inplace)
1328+
inplace = _validate_bool_type(inplace, 'inplace')
13291329
if na_position not in ['last', 'first']:
13301330
raise ValueError('invalid na_position: {!r}'.format(na_position))
13311331

pandas/core/frame.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -2202,7 +2202,7 @@ def query(self, expr, inplace=False, **kwargs):
22022202
>>> df.query('a > b')
22032203
>>> df[df.a > df.b] # same result as the previous expression
22042204
"""
2205-
inplace = _validate_bool_type(inplace)
2205+
inplace = _validate_bool_type(inplace, 'inplace')
22062206
if not isinstance(expr, compat.string_types):
22072207
msg = "expr must be a string to be evaluated, {0} given"
22082208
raise ValueError(msg.format(type(expr)))
@@ -2222,7 +2222,7 @@ def query(self, expr, inplace=False, **kwargs):
22222222
else:
22232223
return new_data
22242224

2225-
def eval(self, expr, inplace=True, **kwargs):
2225+
def eval(self, expr, inplace=None, **kwargs):
22262226
"""Evaluate an expression in the context of the calling DataFrame
22272227
instance.
22282228
@@ -2269,7 +2269,7 @@ def eval(self, expr, inplace=True, **kwargs):
22692269
>>> df.eval('a + b')
22702270
>>> df.eval('c = a + b')
22712271
"""
2272-
inplace = _validate_bool_type(inplace)
2272+
inplace = _validate_bool_type(inplace, 'inplace')
22732273
resolvers = kwargs.pop('resolvers', None)
22742274
kwargs['level'] = kwargs.pop('level', 0) + 1
22752275
if resolvers is None:
@@ -2878,7 +2878,7 @@ def set_index(self, keys, drop=True, append=False, inplace=False,
28782878
-------
28792879
dataframe : DataFrame
28802880
"""
2881-
inplace = _validate_bool_type(inplace)
2881+
inplace = _validate_bool_type(inplace, 'inplace')
28822882
if not isinstance(keys, list):
28832883
keys = [keys]
28842884

@@ -2971,7 +2971,7 @@ def reset_index(self, level=None, drop=False, inplace=False, col_level=0,
29712971
-------
29722972
resetted : DataFrame
29732973
"""
2974-
inplace = _validate_bool_type(inplace)
2974+
inplace = _validate_bool_type(inplace, 'inplace')
29752975
if inplace:
29762976
new_obj = self
29772977
else:
@@ -3076,7 +3076,7 @@ def dropna(self, axis=0, how='any', thresh=None, subset=None,
30763076
-------
30773077
dropped : DataFrame
30783078
"""
3079-
inplace = _validate_bool_type(inplace)
3079+
inplace = _validate_bool_type(inplace, 'inplace')
30803080
if isinstance(axis, (tuple, list)):
30813081
result = self
30823082
for ax in axis:
@@ -3140,7 +3140,7 @@ def drop_duplicates(self, subset=None, keep='first', inplace=False):
31403140
-------
31413141
deduplicated : DataFrame
31423142
"""
3143-
inplace = _validate_bool_type(inplace)
3143+
inplace = _validate_bool_type(inplace, 'inplace')
31443144
duplicated = self.duplicated(subset, keep=keep)
31453145

31463146
if inplace:
@@ -3202,7 +3202,7 @@ def f(vals):
32023202
@Appender(_shared_docs['sort_values'] % _shared_doc_kwargs)
32033203
def sort_values(self, by, axis=0, ascending=True, inplace=False,
32043204
kind='quicksort', na_position='last'):
3205-
inplace = _validate_bool_type(inplace)
3205+
inplace = _validate_bool_type(inplace, 'inplace')
32063206
axis = self._get_axis_number(axis)
32073207
other_axis = 0 if axis == 1 else 1
32083208

@@ -3313,7 +3313,7 @@ def sort(self, columns=None, axis=0, ascending=True, inplace=False,
33133313
def sort_index(self, axis=0, level=None, ascending=True, inplace=False,
33143314
kind='quicksort', na_position='last', sort_remaining=True,
33153315
by=None):
3316-
inplace = _validate_bool_type(inplace)
3316+
inplace = _validate_bool_type(inplace, 'inplace')
33173317
# 10726
33183318
if by is not None:
33193319
warnings.warn("by argument to sort_index is deprecated, pls use "

pandas/core/generic.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,7 @@ def rename_axis(self, mapper, axis=0, copy=True, inplace=False):
734734
1 2 5
735735
2 3 6
736736
"""
737-
inplace = _validate_bool_type(inplace)
737+
inplace = _validate_bool_type(inplace, 'inplace')
738738
non_mapper = is_scalar(mapper) or (is_list_like(mapper) and not
739739
is_dict_like(mapper))
740740
if non_mapper:
@@ -1896,7 +1896,7 @@ def drop(self, labels, axis=0, level=None, inplace=False, errors='raise'):
18961896
-------
18971897
dropped : type of caller
18981898
"""
1899-
inplace = _validate_bool_type(inplace)
1899+
inplace = _validate_bool_type(inplace, 'inplace')
19001900
axis = self._get_axis_number(axis)
19011901
axis_name = self._get_axis_name(axis)
19021902
axis, axis_ = self._get_axis(axis), axis
@@ -2045,7 +2045,7 @@ def sort_values(self, by, axis=0, ascending=True, inplace=False,
20452045
@Appender(_shared_docs['sort_index'] % dict(axes="axes", klass="NDFrame"))
20462046
def sort_index(self, axis=0, level=None, ascending=True, inplace=False,
20472047
kind='quicksort', na_position='last', sort_remaining=True):
2048-
inplace = _validate_bool_type(inplace)
2048+
inplace = _validate_bool_type(inplace, 'inplace')
20492049
axis = self._get_axis_number(axis)
20502050
axis_name = self._get_axis_name(axis)
20512051
labels = self._get_axis(axis)
@@ -2819,7 +2819,7 @@ def consolidate(self, inplace=False):
28192819
-------
28202820
consolidated : type of caller
28212821
"""
2822-
inplace = _validate_bool_type(inplace)
2822+
inplace = _validate_bool_type(inplace, 'inplace')
28232823
if inplace:
28242824
self._consolidate_inplace()
28252825
else:
@@ -3205,7 +3205,7 @@ def convert_objects(self, convert_dates=True, convert_numeric=False,
32053205
@Appender(_shared_docs['fillna'] % _shared_doc_kwargs)
32063206
def fillna(self, value=None, method=None, axis=None, inplace=False,
32073207
limit=None, downcast=None):
3208-
inplace = _validate_bool_type(inplace)
3208+
inplace = _validate_bool_type(inplace, 'inplace')
32093209
if isinstance(value, (list, tuple)):
32103210
raise TypeError('"value" parameter must be a scalar or dict, but '
32113211
'you passed a "{0}"'.format(type(value).__name__))
@@ -3414,7 +3414,7 @@ def replace(self, to_replace=None, value=None, inplace=False, limit=None,
34143414
and play with this method to gain intuition about how it works.
34153415
34163416
"""
3417-
inplace = _validate_bool_type(inplace)
3417+
inplace = _validate_bool_type(inplace, 'inplace')
34183418
if not is_bool(regex) and to_replace is not None:
34193419
raise AssertionError("'to_replace' must be 'None' if 'regex' is "
34203420
"not a bool")
@@ -3647,7 +3647,7 @@ def interpolate(self, method='linear', axis=0, limit=None, inplace=False,
36473647
"""
36483648
Interpolate values according to different methods.
36493649
"""
3650-
inplace = _validate_bool_type(inplace)
3650+
inplace = _validate_bool_type(inplace, 'inplace')
36513651

36523652
if self.ndim > 2:
36533653
raise NotImplementedError("Interpolate has not been implemented "
@@ -4558,7 +4558,7 @@ def _where(self, cond, other=np.nan, inplace=False, axis=None, level=None,
45584558
Equivalent to public method `where`, except that `other` is not
45594559
applied as a function even if callable. Used in __setitem__.
45604560
"""
4561-
inplace = _validate_bool_type(inplace)
4561+
inplace = _validate_bool_type(inplace, 'inplace')
45624562

45634563
cond = com._apply_if_callable(cond, self)
45644564

@@ -4826,7 +4826,7 @@ def where(self, cond, other=np.nan, inplace=False, axis=None, level=None,
48264826
def mask(self, cond, other=np.nan, inplace=False, axis=None, level=None,
48274827
try_cast=False, raise_on_error=True):
48284828

4829-
inplace = _validate_bool_type(inplace)
4829+
inplace = _validate_bool_type(inplace, 'inplace')
48304830
cond = com._apply_if_callable(cond, self)
48314831

48324832
return self.where(~cond, other=other, inplace=inplace, axis=axis,

pandas/core/internals.py

+10-13
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ def fillna(self, value, limit=None, inplace=False, downcast=None,
361361
""" fillna on the block with the value. If we fail, then convert to
362362
ObjectBlock and try again
363363
"""
364-
inplace = _validate_bool_type(inplace)
364+
inplace = _validate_bool_type(inplace, 'inplace')
365365

366366
if not self._can_hold_na:
367367
if inplace:
@@ -622,7 +622,7 @@ def replace(self, to_replace, value, inplace=False, filter=None,
622622
compatibility.
623623
"""
624624

625-
inplace = _validate_bool_type(inplace)
625+
inplace = _validate_bool_type(inplace, 'inplace')
626626
original_to_replace = to_replace
627627
mask = isnull(self.values)
628628
# try to replace, if we raise an error, convert to ObjectBlock and
@@ -895,7 +895,7 @@ def interpolate(self, method='pad', axis=0, index=None, values=None,
895895
fill_value=None, coerce=False, downcast=None, mgr=None,
896896
**kwargs):
897897

898-
inplace = _validate_bool_type(inplace)
898+
inplace = _validate_bool_type(inplace, 'inplace')
899899

900900
def check_int_bool(self, inplace):
901901
# Only FloatBlocks will contain NaNs.
@@ -944,7 +944,7 @@ def _interpolate_with_fill(self, method='pad', axis=0, inplace=False,
944944
downcast=None, mgr=None):
945945
""" fillna but using the interpolate machinery """
946946

947-
inplace = _validate_bool_type(inplace)
947+
inplace = _validate_bool_type(inplace, 'inplace')
948948

949949
# if we are coercing, then don't force the conversion
950950
# if the block can't hold the type
@@ -972,7 +972,7 @@ def _interpolate(self, method=None, index=None, values=None,
972972
mgr=None, **kwargs):
973973
""" interpolate using scipy wrappers """
974974

975-
inplace = _validate_bool_type(inplace)
975+
inplace = _validate_bool_type(inplace, 'inplace')
976976
data = self.values if inplace else self.values.copy()
977977

978978
# only deal with floats
@@ -1517,7 +1517,7 @@ def putmask(self, mask, new, align=True, inplace=False, axis=0,
15171517
-------
15181518
a new block(s), the result of the putmask
15191519
"""
1520-
inplace = _validate_bool_type(inplace)
1520+
inplace = _validate_bool_type(inplace, 'inplace')
15211521

15221522
# use block's copy logic.
15231523
# .values may be an Index which does shallow copy by default
@@ -1804,12 +1804,8 @@ def should_store(self, value):
18041804
return issubclass(value.dtype.type, np.bool_)
18051805

18061806
def replace(self, to_replace, value, inplace=False, filter=None,
1807-
<<<<<<< 141e128c7987751deda752d57fb676c90b1e18db
18081807
regex=False, convert=True, mgr=None):
1809-
=======
1810-
regex=False, mgr=None):
1811-
inplace = _validate_bool_type(inplace)
1812-
>>>>>>> move validation function into pandas.types.validate and point all instances there
1808+
inplace = _validate_bool_type(inplace, 'inplace')
18131809
to_replace_values = np.atleast_1d(to_replace)
18141810
if not np.can_cast(to_replace_values, bool):
18151811
return self
@@ -1991,7 +1987,8 @@ def replace(self, to_replace, value, inplace=False, filter=None,
19911987

19921988
def _replace_single(self, to_replace, value, inplace=False, filter=None,
19931989
regex=False, convert=True, mgr=None):
1994-
inplace = _validate_bool_type(inplace)
1990+
1991+
inplace = _validate_bool_type(inplace, 'inplace')
19951992

19961993
# to_replace is regex compilable
19971994
to_rep_re = regex and is_re_compilable(to_replace)
@@ -3216,7 +3213,7 @@ def replace_list(self, src_list, dest_list, inplace=False, regex=False,
32163213
mgr=None):
32173214
""" do a list replace """
32183215

3219-
inplace = _validate_bool_type(inplace)
3216+
inplace = _validate_bool_type(inplace, 'inplace')
32203217

32213218
if mgr is None:
32223219
mgr = self

0 commit comments

Comments
 (0)