Skip to content

TST: restructure internal extension arrays tests (split between /arrays and /extension) #22026

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
f3e3085
Split integer array tests in tests/arrays/integer and tests/extension…
jorisvandenbossche Jul 23, 2018
6408ee0
split interval tests
jorisvandenbossche Jul 23, 2018
de10591
use tm.assert methods instead of class methods
jorisvandenbossche Jul 24, 2018
1c40fd7
fix py2
jorisvandenbossche Jul 24, 2018
facfc44
linter
jorisvandenbossche Jul 24, 2018
6edec38
move test_integer/test_interval/test_categorical to main tests/extens…
jorisvandenbossche Jul 26, 2018
39e46c9
Merge remote-tracking branch 'upstream/master' into restructure-array…
jorisvandenbossche Jul 26, 2018
cb1350f
Merge remote-tracking branch 'upstream/master' into restructure-array…
jorisvandenbossche Aug 16, 2018
5574c11
Merge remote-tracking branch 'upstream/master' into restructure-array…
jorisvandenbossche Aug 21, 2018
a17deda
get tests passing
jorisvandenbossche Aug 21, 2018
41b2615
Merge remote-tracking branch 'upstream/master' into restructure-array…
jorisvandenbossche Aug 22, 2018
8cf71e9
add module docstring to each test file
jorisvandenbossche Aug 22, 2018
edcb3da
fix rebase mistake
jorisvandenbossche Aug 23, 2018
96a9a8b
absolute import
jorisvandenbossche Aug 23, 2018
700c405
remove BaseInteger with assert overwrites
jorisvandenbossche Aug 23, 2018
c28cab9
fix linter
jorisvandenbossche Aug 23, 2018
6ced029
Merge remote-tracking branch 'upstream/master' into restructure-array…
jorisvandenbossche Sep 5, 2018
c2644cb
Merge remote-tracking branch 'upstream/master' into restructure-array…
jorisvandenbossche Sep 5, 2018
db2836c
pep8
jorisvandenbossche Sep 5, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

72 changes: 72 additions & 0 deletions pandas/tests/arrays/test_interval.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# -*- coding: utf-8 -*-
import pytest
import numpy as np

from pandas import Index, IntervalIndex, date_range, timedelta_range
from pandas.core.arrays import IntervalArray
import pandas.util.testing as tm


@pytest.fixture(params=[
(Index([0, 2, 4]), Index([1, 3, 5])),
(Index([0., 1., 2.]), Index([1., 2., 3.])),
(timedelta_range('0 days', periods=3),
timedelta_range('1 day', periods=3)),
(date_range('20170101', periods=3), date_range('20170102', periods=3)),
(date_range('20170101', periods=3, tz='US/Eastern'),
date_range('20170102', periods=3, tz='US/Eastern'))],
ids=lambda x: str(x[0].dtype))
def left_right_dtypes(request):
"""
Fixture for building an IntervalArray from various dtypes
"""
return request.param


class TestMethods(object):

@pytest.mark.parametrize('repeats', [0, 1, 5])
def test_repeat(self, left_right_dtypes, repeats):
left, right = left_right_dtypes
result = IntervalArray.from_arrays(left, right).repeat(repeats)
expected = IntervalArray.from_arrays(
left.repeat(repeats), right.repeat(repeats))
tm.assert_extension_array_equal(result, expected)

@pytest.mark.parametrize('bad_repeats, msg', [
(-1, 'negative dimensions are not allowed'),
('foo', r'invalid literal for (int|long)\(\) with base 10')])
def test_repeat_errors(self, bad_repeats, msg):
array = IntervalArray.from_breaks(range(4))
with tm.assert_raises_regex(ValueError, msg):
array.repeat(bad_repeats)

@pytest.mark.parametrize('new_closed', [
'left', 'right', 'both', 'neither'])
def test_set_closed(self, closed, new_closed):
# GH 21670
array = IntervalArray.from_breaks(range(10), closed=closed)
result = array.set_closed(new_closed)
expected = IntervalArray.from_breaks(range(10), closed=new_closed)
tm.assert_extension_array_equal(result, expected)


class TestSetitem(object):

def test_set_na(self, left_right_dtypes):
left, right = left_right_dtypes
result = IntervalArray.from_arrays(left, right)
result[0] = np.nan

expected_left = Index([left._na_value] + list(left[1:]))
expected_right = Index([right._na_value] + list(right[1:]))
expected = IntervalArray.from_arrays(expected_left, expected_right)

tm.assert_extension_array_equal(result, expected)


def test_repr_matches():
idx = IntervalIndex.from_breaks([1, 2, 3])
a = repr(idx)
b = repr(idx.values)
assert a.replace("Index", "Array") == b
9 changes: 5 additions & 4 deletions pandas/tests/extension/base/methods.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,10 +127,11 @@ def test_combine_add(self, data_repeated):
s1 = pd.Series(orig_data1)
s2 = pd.Series(orig_data2)
result = s1.combine(s2, lambda x1, x2: x1 + x2)
expected = pd.Series(
orig_data1._from_sequence([a + b for (a, b) in
zip(list(orig_data1),
list(orig_data2))]))
with np.errstate(over='ignore'):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what surfaces the error here?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When testing with Int8 dtype, you get an overflow warning for summing the scalars (the a + b below)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm ok, maybe we should actually move this to the integer tests rather than here then?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it is fine to ignore it here (it's numpy behaviour to warn, not something we need to test), but it's true that we might want to add explicit test for the behaviour we want on the Series level in the integer tests.

The behaviour currently to silently ignore it in the case of series is consistent with a Series with numpy dtype int8:

In [38]: s = pd.Series([50, 100], dtype='Int8')

In [39]: s[0] + s[1]
/home/joris/miniconda3/envs/dev/bin/ipython:1: RuntimeWarning: overflow encountered in byte_scalars
  #!/home/joris/miniconda3/envs/dev/bin/python
Out[39]: -106

In [40]: s + s[::-1].reset_index(drop=True)
Out[40]: 
0    -106
1    -106
dtype: Int8

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i understand though this may be indicative of an error in other extension types. ok for now

expected = pd.Series(
orig_data1._from_sequence([a + b for (a, b) in
zip(list(orig_data1),
list(orig_data2))]))
self.assert_series_equal(result, expected)

val = s1.iloc[0]
Expand Down
9 changes: 5 additions & 4 deletions pandas/tests/extension/base/ops.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ def get_op_from_name(self, op_name):
def check_opname(self, s, op_name, other, exc=NotImplementedError):
op = self.get_op_from_name(op_name)

self._check_op(s, op, other, exc)
self._check_op(s, op, other, op_name, exc)

def _check_op(self, s, op, other, exc=NotImplementedError):
def _check_op(self, s, op, other, op_name, exc=NotImplementedError):
if exc is None:
result = op(s, other)
expected = s.combine(other, op)
Expand Down Expand Up @@ -69,7 +69,8 @@ def test_arith_series_with_array(self, data, all_arithmetic_operators):
# ndarray & other series
op_name = all_arithmetic_operators
s = pd.Series(data)
self.check_opname(s, op_name, [s.iloc[0]] * len(s), exc=TypeError)
self.check_opname(s, op_name, pd.Series([s.iloc[0]] * len(s)),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why this change?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar as what Tom said below: combine doesn't work with lists (it might be we should improve combine, but that is a separate issue)

exc=TypeError)

def test_divmod(self, data):
s = pd.Series(data)
Expand Down Expand Up @@ -113,5 +114,5 @@ def test_compare_scalar(self, data, all_compare_operators):
def test_compare_array(self, data, all_compare_operators):
op_name = all_compare_operators
s = pd.Series(data)
other = [0] * len(data)
other = pd.Series([data[0]] * len(data))
self._compare_other(s, data, op_name, other)
Empty file.
Empty file.
Empty file.
Original file line number Diff line number Diff line change
@@ -1,3 +1,18 @@
"""
This file contains a minimal set of tests for compliance with the extension
array interface test suite, and should contain no other tests.
The test suite for the full functionality of the array is located in
`pandas/tests/arrays/`.

The tests in this file are inherited from the BaseExtensionTests, and only
minimal tweaks should be applied to get the tests passing (by overwriting a
parent method).

Additional tests should either be added to one of the BaseExtensionTests
classes (if they are relevant for the extension interface for all dtypes), or
be added to the array-specific tests in `pandas/tests/arrays/`.

"""
import string

import pytest
Expand Down Expand Up @@ -204,10 +219,14 @@ class TestComparisonOps(base.BaseComparisonOpsTests):
def _compare_other(self, s, data, op_name, other):
op = self.get_op_from_name(op_name)
if op_name == '__eq__':
assert not op(data, other).all()
result = op(s, other)
expected = s.combine(other, lambda x, y: x == y)
assert (result == expected).all()

elif op_name == '__ne__':
assert op(data, other).all()
result = op(s, other)
expected = s.combine(other, lambda x, y: x != y)
assert (result == expected).all()

else:
with pytest.raises(TypeError):
Expand Down
Loading