Skip to content

Commit c89e9bb

Browse files
Chang Shewesm
Chang She
authored andcommitted
BUG: remove asserts from core #2288
1 parent 4a6e6d2 commit c89e9bb

File tree

11 files changed

+147
-65
lines changed

11 files changed

+147
-65
lines changed

pandas/core/format.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -293,8 +293,9 @@ def to_latex(self, force_unicode=False, column_format=None):
293293

294294
if column_format is None:
295295
column_format = '|l|%s|' % '|'.join('c' for _ in strcols)
296-
else:
297-
assert isinstance(column_format, basestring)
296+
elif not isinstance(column_format, basestring):
297+
raise AssertionError(('column_format must be str or unicode, not %s'
298+
% type(column_format)))
298299

299300
self.buf.write('\\begin{tabular}{%s}\n' % column_format)
300301
self.buf.write('\\hline\n')
@@ -474,7 +475,9 @@ def write_result(self, buf):
474475
if self.classes is not None:
475476
if isinstance(self.classes, str):
476477
self.classes = self.classes.split()
477-
assert isinstance(self.classes, (list, tuple))
478+
if not isinstance(self.classes, (list, tuple)):
479+
raise AssertionError(('classes must be list or tuple, '
480+
'not %s') % type(self.classes))
478481
_classes.extend(self.classes)
479482

480483
self.write('<table border="1" class="%s">' % ' '.join(_classes),

pandas/core/frame.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,8 +1138,9 @@ def to_panel(self):
11381138
from pandas.core.reshape import block2d_to_block3d
11391139

11401140
# only support this kind for now
1141-
assert(isinstance(self.index, MultiIndex) and
1142-
len(self.index.levels) == 2)
1141+
if (not isinstance(self.index, MultiIndex) or
1142+
len(self.index.levels) != 2):
1143+
raise AssertionError('Must have 2-level MultiIndex')
11431144

11441145
self._consolidate_inplace()
11451146

@@ -1503,7 +1504,8 @@ def info(self, verbose=True, buf=None):
15031504
lines.append('Data columns:')
15041505
space = max([len(com.pprint_thing(k)) for k in self.columns]) + 4
15051506
counts = self.count()
1506-
assert(len(cols) == len(counts))
1507+
if len(cols) != len(counts):
1508+
raise AssertionError('Columns must equal counts')
15071509
for col, count in counts.iteritems():
15081510
if not isinstance(col, basestring):
15091511
col = str(col)
@@ -1962,7 +1964,8 @@ def _boolean_set(self, key, value):
19621964

19631965
def _set_item_multiple(self, keys, value):
19641966
if isinstance(value, DataFrame):
1965-
assert(len(value.columns) == len(keys))
1967+
if len(value.columns) != len(keys):
1968+
raise AssertionError('Columns must be same length as keys')
19661969
for k1, k2 in zip(keys, value.columns):
19671970
self[k1] = value[k2]
19681971
else:
@@ -2195,7 +2198,8 @@ def lookup(self, row_labels, col_labels):
21952198
from itertools import izip
21962199

21972200
n = len(row_labels)
2198-
assert(n == len(col_labels))
2201+
if n != len(col_labels):
2202+
raise AssertionError('Row labels must have same size as col labels')
21992203

22002204
thresh = 1000
22012205
if not self._is_mixed_type or n > thresh:
@@ -2973,7 +2977,8 @@ def sort_index(self, axis=0, by=None, ascending=True, inplace=False):
29732977
labels = self._get_axis(axis)
29742978

29752979
if by is not None:
2976-
assert(axis == 0)
2980+
if axis != 0:
2981+
raise AssertionError('Axis must be 0')
29772982
if isinstance(by, (tuple, list)):
29782983
keys = [self[x].values for x in by]
29792984
indexer = _lexsort_indexer(keys, orders=ascending)
@@ -3934,7 +3939,8 @@ def _apply_raw(self, func, axis):
39343939
def _apply_standard(self, func, axis, ignore_failures=False):
39353940
try:
39363941

3937-
assert(not self._is_mixed_type) # maybe a hack for now
3942+
if self._is_mixed_type: # maybe a hack for now
3943+
raise AssertionError('Must be mixed type DataFrame')
39383944
values = self.values
39393945
dummy = Series(NA, index=self._get_axis(axis),
39403946
dtype=values.dtype)
@@ -4151,7 +4157,8 @@ def _join_compat(self, other, on=None, how='left', lsuffix='', rsuffix='',
41514157
from pandas.tools.merge import merge, concat
41524158

41534159
if isinstance(other, Series):
4154-
assert(other.name is not None)
4160+
if other.name is None:
4161+
raise AssertionError('Other Series must have a name')
41554162
other = DataFrame({other.name: other})
41564163

41574164
if isinstance(other, DataFrame):
@@ -5030,7 +5037,12 @@ def group_agg(values, bounds, f):
50305037
result = np.empty((len(bounds), K), dtype=float)
50315038

50325039
testagg = f(values[:min(1, len(values))])
5033-
assert(not (isinstance(testagg, np.ndarray) and testagg.ndim == 2))
5040+
if isinstance(testagg, np.ndarray):
5041+
raise AssertionError('Results must be an ndarray, not %s'
5042+
% type(testagg))
5043+
if testagg.ndim == 2:
5044+
raise AssertionError('Results must be 2-D, not %d-D'
5045+
% testagg.ndim)
50345046

50355047
for i, left_bound in enumerate(bounds):
50365048
if i == len(bounds) - 1:

pandas/core/generic.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -340,15 +340,17 @@ def drop(self, labels, axis=0, level=None):
340340

341341
if axis.is_unique:
342342
if level is not None:
343-
assert(isinstance(axis, MultiIndex))
343+
if not isinstance(axis, MultiIndex):
344+
raise AssertionError('axis must be a MultiIndex')
344345
new_axis = axis.drop(labels, level=level)
345346
else:
346347
new_axis = axis.drop(labels)
347348

348349
return self.reindex(**{axis_name: new_axis})
349350
else:
350351
if level is not None:
351-
assert(isinstance(axis, MultiIndex))
352+
if not isinstance(axis, MultiIndex):
353+
raise AssertionError('axis must be a MultiIndex')
352354
indexer = -lib.ismember(axis.get_level_values(level),
353355
set(labels))
354356
else:
@@ -1012,7 +1014,9 @@ def truncate(self, before=None, after=None, copy=True):
10121014
after = to_datetime(after)
10131015

10141016
if before is not None and after is not None:
1015-
assert(before <= after)
1017+
if before > after:
1018+
raise AssertionError('Truncate: %s must be after %s' %
1019+
(before, after))
10161020

10171021
result = self.ix[before:after]
10181022

pandas/core/groupby.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -830,12 +830,9 @@ def _aggregate_series_pure_python(self, obj, func):
830830
axis=self.axis):
831831
res = func(group)
832832
if result is None:
833-
try:
834-
assert(not isinstance(res, np.ndarray))
835-
assert(not isinstance(res, list))
836-
result = np.empty(ngroups, dtype='O')
837-
except Exception:
838-
raise ValueError('function does not reduce')
833+
if isinstance(res, np.ndarray) or isinstance(res, list):
834+
raise ValueError('Function does not reduce')
835+
result = np.empty(ngroups, dtype='O')
839836

840837
counts[label] = group.shape[0]
841838
result[label] = res
@@ -1040,7 +1037,8 @@ def __init__(self, index, grouper=None, name=None, level=None,
10401037

10411038
if level is not None:
10421039
if not isinstance(level, int):
1043-
assert(level in index.names)
1040+
if level not in index.names:
1041+
raise AssertionError('Level %s not in index' % str(level))
10441042
level = index.names.index(level)
10451043

10461044
inds = index.labels[level]
@@ -1231,7 +1229,8 @@ def _convert_grouper(axis, grouper):
12311229
else:
12321230
return grouper.reindex(axis).values
12331231
elif isinstance(grouper, (list, np.ndarray)):
1234-
assert(len(grouper) == len(axis))
1232+
if len(grouper) != len(axis):
1233+
raise AssertionError('Grouper and axis must be same length')
12351234
return grouper
12361235
else:
12371236
return grouper
@@ -1629,7 +1628,8 @@ def _aggregate_multiple_funcs(self, arg):
16291628
return result
16301629

16311630
def _aggregate_generic(self, func, *args, **kwargs):
1632-
assert(self.grouper.nkeys == 1)
1631+
if self.grouper.nkeys != 1:
1632+
raise AssertionError('Number of keys must be 1')
16331633

16341634
axis = self.axis
16351635
obj = self._obj_with_exclusions
@@ -2061,7 +2061,9 @@ def _get_slice(slob):
20612061
# Since I'm now compressing the group ids, it's now not "possible" to
20622062
# produce empty slices because such groups would not be observed in the
20632063
# data
2064-
assert(start < end)
2064+
if start >= end:
2065+
raise AssertionError('Start %s must be less than end %s'
2066+
% (str(start), str(end)))
20652067
yield i, _get_slice(slice(start, end))
20662068

20672069

pandas/core/index.py

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,9 @@ def _get_names(self):
180180
return [self.name]
181181

182182
def _set_names(self, values):
183-
assert(len(values) == 1)
183+
if len(values) != 1:
184+
raise AssertionError('Length of new names must be 1, got %d'
185+
% len(values))
184186
self.name = values[0]
185187

186188
names = property(fset=_set_names, fget=_get_names)
@@ -255,7 +257,9 @@ def _engine(self):
255257

256258
def _get_level_number(self, level):
257259
if not isinstance(level, int):
258-
assert(level == self.name)
260+
if level != self.name:
261+
raise AssertionError('Level %s must be same as name (%s)'
262+
% (level, self.name))
259263
level = 0
260264
return level
261265

@@ -749,10 +753,12 @@ def get_indexer(self, target, method=None, limit=None):
749753
'objects')
750754

751755
if method == 'pad':
752-
assert(self.is_monotonic)
756+
if not self.is_monotonic:
757+
raise AssertionError('Must be monotonic for forward fill')
753758
indexer = self._engine.get_pad_indexer(target.values, limit)
754759
elif method == 'backfill':
755-
assert(self.is_monotonic)
760+
if not self.is_monotonic:
761+
raise AssertionError('Must be monotonic for backward fill')
756762
indexer = self._engine.get_backfill_indexer(target.values, limit)
757763
elif method is None:
758764
indexer = self._engine.get_indexer(target.values)
@@ -1249,7 +1255,8 @@ class MultiIndex(Index):
12491255
names = None
12501256

12511257
def __new__(cls, levels=None, labels=None, sortorder=None, names=None):
1252-
assert(len(levels) == len(labels))
1258+
if len(levels) != len(labels):
1259+
raise AssertionError('Length of levels and labels must be the same')
12531260
if len(levels) == 0:
12541261
raise Exception('Must pass non-zero number of levels/labels')
12551262

@@ -1272,7 +1279,10 @@ def __new__(cls, levels=None, labels=None, sortorder=None, names=None):
12721279
if names is None:
12731280
subarr.names = [None] * subarr.nlevels
12741281
else:
1275-
assert(len(names) == subarr.nlevels)
1282+
if len(names) != subarr.nlevels:
1283+
raise AssertionError(('Length of names must be same as level '
1284+
'(%d), got %d') % (subarr.nlevels))
1285+
12761286
subarr.names = list(names)
12771287

12781288
# set the name
@@ -1815,7 +1825,10 @@ def reorder_levels(self, order):
18151825
----------
18161826
"""
18171827
order = [self._get_level_number(i) for i in order]
1818-
assert(len(order) == self.nlevels)
1828+
if len(order) != self.nlevels:
1829+
raise AssertionError(('Length of order must be same as '
1830+
'number of levels (%d), got %d')
1831+
% (self.nlevels, len(order)))
18191832
new_levels = [self.levels[i] for i in order]
18201833
new_labels = [self.labels[i] for i in order]
18211834
new_names = [self.names[i] for i in order]
@@ -1912,11 +1925,15 @@ def get_indexer(self, target, method=None, limit=None):
19121925
self_index = self._tuple_index
19131926

19141927
if method == 'pad':
1915-
assert(self.is_unique and self.is_monotonic)
1928+
if not self.is_unique or not self.is_monotonic:
1929+
raise AssertionError(('Must be unique and monotonic to '
1930+
'use forward fill getting the indexer'))
19161931
indexer = self_index._engine.get_pad_indexer(target_index,
19171932
limit=limit)
19181933
elif method == 'backfill':
1919-
assert(self.is_unique and self.is_monotonic)
1934+
if not self.is_unique or not self.is_monotonic:
1935+
raise AssertionError(('Must be unique and monotonic to '
1936+
'use backward fill getting the indexer'))
19201937
indexer = self_index._engine.get_backfill_indexer(target_index,
19211938
limit=limit)
19221939
else:
@@ -2083,7 +2100,9 @@ def _drop_levels(indexer, levels):
20832100
return new_index
20842101

20852102
if isinstance(level, (tuple, list)):
2086-
assert(len(key) == len(level))
2103+
if len(key) != len(level):
2104+
raise AssertionError('Key for location must have same '
2105+
'length as number of levels')
20872106
result = None
20882107
for lev, k in zip(level, key):
20892108
loc, new_index = self.get_loc_level(k, level=lev)
@@ -2329,7 +2348,8 @@ def _assert_can_do_setop(self, other):
23292348
raise TypeError('can only call with other hierarchical '
23302349
'index objects')
23312350

2332-
assert(self.nlevels == other.nlevels)
2351+
if self.nlevels != other.nlevels:
2352+
raise AssertionError('Must have same number of levels')
23332353

23342354
def insert(self, loc, item):
23352355
"""
@@ -2477,7 +2497,8 @@ def _get_distinct_indexes(indexes):
24772497

24782498

24792499
def _union_indexes(indexes):
2480-
assert(len(indexes) > 0)
2500+
if len(indexes) == 0:
2501+
raise AssertionError('Must have at least 1 Index to union')
24812502
if len(indexes) == 1:
24822503
result = indexes[0]
24832504
if isinstance(result, list):

pandas/core/indexing.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,8 @@ def _reindex(keys, level=None):
358358
return self.obj.reindex_axis(keys, axis=axis, level=level)
359359
except AttributeError:
360360
# Series
361-
assert(axis == 0)
361+
if axis != 0:
362+
raise AssertionError('axis must be 0')
362363
return self.obj.reindex(keys, level=level)
363364

364365
if com._is_bool_indexer(key):

0 commit comments

Comments
 (0)