Skip to content

Commit 34b86fd

Browse files
jbrockmendeljreback
authored andcommitted
separate numeric tests so we can isolate division by zero (pandas-dev#19336)
1 parent 432642e commit 34b86fd

File tree

1 file changed

+102
-94
lines changed

1 file changed

+102
-94
lines changed

pandas/tests/series/test_operators.py

+102-94
Original file line numberDiff line numberDiff line change
@@ -596,77 +596,81 @@ def test_divide_decimal(self):
596596

597597
assert_series_equal(expected, s)
598598

599-
def test_div(self):
599+
@pytest.mark.parametrize(
600+
'dtype2',
601+
[
602+
np.int64, np.int32, np.int16, np.int8,
603+
np.float64, np.float32, np.float16,
604+
np.uint64, np.uint32,
605+
np.uint16, np.uint8
606+
])
607+
@pytest.mark.parametrize('dtype1', [np.int64, np.float64, np.uint64])
608+
def test_ser_div_ser(self, dtype1, dtype2):
609+
# no longer do integer div for any ops, but deal with the 0's
610+
first = Series([3, 4, 5, 8], name='first').astype(dtype1)
611+
second = Series([0, 0, 0, 3], name='second').astype(dtype2)
612+
600613
with np.errstate(all='ignore'):
601-
# no longer do integer div for any ops, but deal with the 0's
602-
p = DataFrame({'first': [3, 4, 5, 8], 'second': [0, 0, 0, 3]})
603-
result = p['first'] / p['second']
604-
expected = Series(
605-
p['first'].values.astype(float) / p['second'].values,
606-
dtype='float64')
607-
expected.iloc[0:3] = np.inf
608-
assert_series_equal(result, expected)
614+
expected = Series(first.values.astype(np.float64) / second.values,
615+
dtype='float64', name=None)
616+
expected.iloc[0:3] = np.inf
609617

610-
result = p['first'] / 0
611-
expected = Series(np.inf, index=p.index, name='first')
612-
assert_series_equal(result, expected)
618+
result = first / second
619+
assert_series_equal(result, expected)
620+
assert not result.equals(second / first)
613621

614-
p = p.astype('float64')
615-
result = p['first'] / p['second']
616-
expected = Series(p['first'].values / p['second'].values)
617-
assert_series_equal(result, expected)
622+
def test_div_equiv_binop(self):
623+
# Test Series.div as well as Series.__div__
624+
# float/integer issue
625+
# GH#7785
626+
first = pd.Series([1, 0], name='first')
627+
second = pd.Series([-0.01, -0.02], name='second')
628+
expected = Series([-0.01, -np.inf])
618629

619-
p = DataFrame({'first': [3, 4, 5, 8], 'second': [1, 1, 1, 1]})
620-
result = p['first'] / p['second']
621-
assert_series_equal(result, p['first'].astype('float64'),
622-
check_names=False)
623-
assert result.name is None
624-
assert not result.equals(p['second'] / p['first'])
625-
626-
# inf signing
627-
s = Series([np.nan, 1., -1.])
628-
result = s / 0
629-
expected = Series([np.nan, np.inf, -np.inf])
630-
assert_series_equal(result, expected)
630+
result = second.div(first)
631+
assert_series_equal(result, expected, check_names=False)
631632

632-
# float/integer issue
633-
# GH 7785
634-
p = DataFrame({'first': (1, 0), 'second': (-0.01, -0.02)})
635-
expected = Series([-0.01, -np.inf])
633+
result = second / first
634+
assert_series_equal(result, expected)
636635

637-
result = p['second'].div(p['first'])
638-
assert_series_equal(result, expected, check_names=False)
636+
def test_rdiv_zero_compat(self):
637+
# GH#8674
638+
zero_array = np.array([0] * 5)
639+
data = np.random.randn(5)
640+
expected = pd.Series([0.] * 5)
639641

640-
result = p['second'] / p['first']
641-
assert_series_equal(result, expected)
642+
result = zero_array / pd.Series(data)
643+
assert_series_equal(result, expected)
642644

643-
# GH 9144
644-
s = Series([-1, 0, 1])
645+
result = pd.Series(zero_array) / data
646+
assert_series_equal(result, expected)
645647

646-
result = 0 / s
647-
expected = Series([0.0, nan, 0.0])
648-
assert_series_equal(result, expected)
648+
result = pd.Series(zero_array) / pd.Series(data)
649+
assert_series_equal(result, expected)
649650

650-
result = s / 0
651-
expected = Series([-inf, nan, inf])
652-
assert_series_equal(result, expected)
651+
def test_div_zero_inf_signs(self):
652+
# GH#9144, inf signing
653+
ser = Series([-1, 0, 1], name='first')
654+
expected = Series([-np.inf, np.nan, np.inf], name='first')
653655

654-
result = s // 0
655-
expected = Series([-inf, nan, inf])
656-
assert_series_equal(result, expected)
656+
result = ser / 0
657+
assert_series_equal(result, expected)
657658

658-
# GH 8674
659-
zero_array = np.array([0] * 5)
660-
data = np.random.randn(5)
661-
expected = pd.Series([0.] * 5)
662-
result = zero_array / pd.Series(data)
663-
assert_series_equal(result, expected)
659+
def test_rdiv_zero(self):
660+
# GH#9144
661+
ser = Series([-1, 0, 1], name='first')
662+
expected = Series([0.0, np.nan, 0.0], name='first')
664663

665-
result = pd.Series(zero_array) / data
666-
assert_series_equal(result, expected)
664+
result = 0 / ser
665+
assert_series_equal(result, expected)
667666

668-
result = pd.Series(zero_array) / pd.Series(data)
669-
assert_series_equal(result, expected)
667+
def test_floordiv_div(self):
668+
# GH#9144
669+
ser = Series([-1, 0, 1], name='first')
670+
671+
result = ser // 0
672+
expected = Series([-inf, nan, inf], name='first')
673+
assert_series_equal(result, expected)
670674

671675

672676
class TestTimedeltaSeriesArithmeticWithIntegers(object):
@@ -1576,33 +1580,42 @@ def test_dt64_series_add_intlike(self, tz):
15761580

15771581

15781582
class TestSeriesOperators(TestData):
1579-
def test_op_method(self):
1580-
def check(series, other, check_reverse=False):
1581-
simple_ops = ['add', 'sub', 'mul', 'floordiv', 'truediv', 'pow']
1582-
if not compat.PY3:
1583-
simple_ops.append('div')
1584-
1585-
for opname in simple_ops:
1586-
op = getattr(Series, opname)
1587-
1588-
if op == 'div':
1589-
alt = operator.truediv
1590-
else:
1591-
alt = getattr(operator, opname)
1592-
1593-
result = op(series, other)
1594-
expected = alt(series, other)
1595-
assert_almost_equal(result, expected)
1596-
if check_reverse:
1597-
rop = getattr(Series, "r" + opname)
1598-
result = rop(series, other)
1599-
expected = alt(other, series)
1600-
assert_almost_equal(result, expected)
1583+
@pytest.mark.parametrize(
1584+
'ts',
1585+
[
1586+
(lambda x: x, lambda x: x * 2, False),
1587+
(lambda x: x, lambda x: x[::2], False),
1588+
(lambda x: x, lambda x: 5, True),
1589+
(lambda x: tm.makeFloatSeries(),
1590+
lambda x: tm.makeFloatSeries(),
1591+
True)
1592+
])
1593+
@pytest.mark.parametrize('opname', ['add', 'sub', 'mul', 'floordiv',
1594+
'truediv', 'div', 'pow'])
1595+
def test_op_method(self, opname, ts):
1596+
# check that Series.{opname} behaves like Series.__{opname}__,
1597+
series = ts[0](self.ts)
1598+
other = ts[1](self.ts)
1599+
check_reverse = ts[2]
1600+
1601+
if opname == 'div' and compat.PY3:
1602+
pytest.skip('div test only for Py3')
1603+
1604+
op = getattr(Series, opname)
1605+
1606+
if op == 'div':
1607+
alt = operator.truediv
1608+
else:
1609+
alt = getattr(operator, opname)
16011610

1602-
check(self.ts, self.ts * 2)
1603-
check(self.ts, self.ts[::2])
1604-
check(self.ts, 5, check_reverse=True)
1605-
check(tm.makeFloatSeries(), tm.makeFloatSeries(), check_reverse=True)
1611+
result = op(series, other)
1612+
expected = alt(series, other)
1613+
assert_almost_equal(result, expected)
1614+
if check_reverse:
1615+
rop = getattr(Series, "r" + opname)
1616+
result = rop(series, other)
1617+
expected = alt(other, series)
1618+
assert_almost_equal(result, expected)
16061619

16071620
def test_neg(self):
16081621
assert_series_equal(-self.series, -1 * self.series)
@@ -1971,20 +1984,15 @@ def test_operators_corner(self):
19711984
index=self.ts.index[:-5], name='ts')
19721985
tm.assert_series_equal(added[:-5], expected)
19731986

1974-
def test_operators_reverse_object(self):
1987+
@pytest.mark.parametrize('op', [operator.add, operator.sub, operator.mul,
1988+
operator.truediv, operator.floordiv])
1989+
def test_operators_reverse_object(self, op):
19751990
# GH 56
19761991
arr = Series(np.random.randn(10), index=np.arange(10), dtype=object)
19771992

1978-
def _check_op(arr, op):
1979-
result = op(1., arr)
1980-
expected = op(1., arr.astype(float))
1981-
assert_series_equal(result.astype(float), expected)
1982-
1983-
_check_op(arr, operator.add)
1984-
_check_op(arr, operator.sub)
1985-
_check_op(arr, operator.mul)
1986-
_check_op(arr, operator.truediv)
1987-
_check_op(arr, operator.floordiv)
1993+
result = op(1., arr)
1994+
expected = op(1., arr.astype(float))
1995+
assert_series_equal(result.astype(float), expected)
19881996

19891997
def test_arith_ops_df_compat(self):
19901998
# GH 1134

0 commit comments

Comments
 (0)