Skip to content

Commit 0d91d8f

Browse files
committed
CLN: Cleanup tests for .rank()
Work in Progress 1. Created new `pandas/tests/series/test_rank` and `pandas/tests/frame/test_rank` 2. Moved tests from `pandas/tests/test_stats` to `series` or `frame` version of `test_rank` See pandas-dev#15640
1 parent 5eac08a commit 0d91d8f

File tree

2 files changed

+108
-69
lines changed

2 files changed

+108
-69
lines changed

pandas/tests/frame/test_rank.py

+103
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# -*- coding: utf-8 -*-
2+
from pandas import compat
3+
4+
from distutils.version import LooseVersion
5+
from numpy import nan
6+
import numpy as np
7+
8+
from pandas import Series, DataFrame
9+
10+
from pandas.compat import product
11+
from pandas.util.testing import assert_frame_equal
12+
import pandas.util.testing as tm
13+
14+
15+
class TestRank(tm.TestCase):
16+
s = Series([1, 3, 4, 2, nan, 2, 1, 5, nan, 3])
17+
df = DataFrame({'A': s, 'B': s})
18+
19+
results = {
20+
'average': np.array([1.5, 5.5, 7.0, 3.5, nan,
21+
3.5, 1.5, 8.0, nan, 5.5]),
22+
'min': np.array([1, 5, 7, 3, nan, 3, 1, 8, nan, 5]),
23+
'max': np.array([2, 6, 7, 4, nan, 4, 2, 8, nan, 6]),
24+
'first': np.array([1, 5, 7, 3, nan, 4, 2, 8, nan, 6]),
25+
'dense': np.array([1, 3, 4, 2, nan, 2, 1, 5, nan, 3]),
26+
}
27+
28+
def test_rank_methods_frame(self):
29+
tm.skip_if_no_package('scipy', '0.13', 'scipy.stats.rankdata')
30+
import scipy
31+
from scipy.stats import rankdata
32+
33+
xs = np.random.randint(0, 21, (100, 26))
34+
xs = (xs - 10.0) / 10.0
35+
cols = [chr(ord('z') - i) for i in range(xs.shape[1])]
36+
37+
for vals in [xs, xs + 1e6, xs * 1e-6]:
38+
df = DataFrame(vals, columns=cols)
39+
40+
for ax in [0, 1]:
41+
for m in ['average', 'min', 'max', 'first', 'dense']:
42+
result = df.rank(axis=ax, method=m)
43+
sprank = np.apply_along_axis(
44+
rankdata, ax, vals,
45+
m if m != 'first' else 'ordinal')
46+
sprank = sprank.astype(np.float64)
47+
expected = DataFrame(sprank, columns=cols)
48+
49+
if LooseVersion(scipy.__version__) >= '0.17.0':
50+
expected = expected.astype('float64')
51+
tm.assert_frame_equal(result, expected)
52+
53+
def test_rank_descending(self):
54+
dtypes = ['O', 'f8', 'i8']
55+
56+
for dtype, method in product(dtypes, self.results):
57+
if 'i' in dtype:
58+
df = self.df.dropna()
59+
else:
60+
df = self.df.astype(dtype)
61+
62+
res = df.rank(ascending=False)
63+
expected = (df.max() - df).rank()
64+
assert_frame_equal(res, expected)
65+
66+
if method == 'first' and dtype == 'O':
67+
continue
68+
69+
expected = (df.max() - df).rank(method=method)
70+
71+
if dtype != 'O':
72+
res2 = df.rank(method=method, ascending=False,
73+
numeric_only=True)
74+
assert_frame_equal(res2, expected)
75+
76+
res3 = df.rank(method=method, ascending=False,
77+
numeric_only=False)
78+
assert_frame_equal(res3, expected)
79+
80+
def test_rank_2d_tie_methods(self):
81+
df = self.df
82+
83+
def _check2d(df, expected, method='average', axis=0):
84+
exp_df = DataFrame({'A': expected, 'B': expected})
85+
86+
if axis == 1:
87+
df = df.T
88+
exp_df = exp_df.T
89+
90+
result = df.rank(method=method, axis=axis)
91+
assert_frame_equal(result, exp_df)
92+
93+
dtypes = [None, object]
94+
disabled = set([(object, 'first')])
95+
results = self.results
96+
97+
for method, axis, dtype in product(results, [0, 1], dtypes):
98+
if (dtype, method) in disabled:
99+
continue
100+
frame = df if dtype is None else df.astype(dtype)
101+
_check2d(frame, results[method], method=method, axis=axis)
102+
103+

pandas/tests/test_stats.py renamed to pandas/tests/series/test_rank.py

+5-69
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,15 @@
55
from numpy import nan
66
import numpy as np
77

8-
from pandas import Series, DataFrame
8+
from pandas import Series
99

1010
from pandas.compat import product
11-
from pandas.util.testing import (assert_frame_equal, assert_series_equal)
11+
from pandas.util.testing import assert_series_equal
1212
import pandas.util.testing as tm
1313

1414

15-
class TestRank(tm.TestCase):
15+
class TestSeriesRank(tm.TestCase):
1616
s = Series([1, 3, 4, 2, nan, 2, 1, 5, nan, 3])
17-
df = DataFrame({'A': s, 'B': s})
1817

1918
results = {
2019
'average': np.array([1.5, 5.5, 7.0, 3.5, nan,
@@ -42,6 +41,7 @@ def _check(s, expected, method='average'):
4241
series = s if dtype is None else s.astype(dtype)
4342
_check(series, results[method], method=method)
4443

44+
4545
def test_rank_methods_series(self):
4646
tm.skip_if_no_package('scipy', '0.13', 'scipy.stats.rankdata')
4747
import scipy
@@ -65,31 +65,6 @@ def test_rank_methods_series(self):
6565
expected = expected.astype('float64')
6666
tm.assert_series_equal(result, expected)
6767

68-
def test_rank_methods_frame(self):
69-
tm.skip_if_no_package('scipy', '0.13', 'scipy.stats.rankdata')
70-
import scipy
71-
from scipy.stats import rankdata
72-
73-
xs = np.random.randint(0, 21, (100, 26))
74-
xs = (xs - 10.0) / 10.0
75-
cols = [chr(ord('z') - i) for i in range(xs.shape[1])]
76-
77-
for vals in [xs, xs + 1e6, xs * 1e-6]:
78-
df = DataFrame(vals, columns=cols)
79-
80-
for ax in [0, 1]:
81-
for m in ['average', 'min', 'max', 'first', 'dense']:
82-
result = df.rank(axis=ax, method=m)
83-
sprank = np.apply_along_axis(
84-
rankdata, ax, vals,
85-
m if m != 'first' else 'ordinal')
86-
sprank = sprank.astype(np.float64)
87-
expected = DataFrame(sprank, columns=cols)
88-
89-
if LooseVersion(scipy.__version__) >= '0.17.0':
90-
expected = expected.astype('float64')
91-
tm.assert_frame_equal(result, expected)
92-
9368
def test_rank_dense_method(self):
9469
dtypes = ['O', 'f8', 'i8']
9570
in_out = [([1], [1]),
@@ -106,67 +81,28 @@ def test_rank_dense_method(self):
10681
s = Series(ser).astype(dtype)
10782
result = s.rank(method='dense')
10883
expected = Series(exp).astype(result.dtype)
109-
assert_series_equal(result, expected)
84+
assert_series_equal(result, expected)
11085

11186
def test_rank_descending(self):
11287
dtypes = ['O', 'f8', 'i8']
11388

11489
for dtype, method in product(dtypes, self.results):
11590
if 'i' in dtype:
11691
s = self.s.dropna()
117-
df = self.df.dropna()
11892
else:
11993
s = self.s.astype(dtype)
120-
df = self.df.astype(dtype)
12194

12295
res = s.rank(ascending=False)
12396
expected = (s.max() - s).rank()
12497
assert_series_equal(res, expected)
12598

126-
res = df.rank(ascending=False)
127-
expected = (df.max() - df).rank()
128-
assert_frame_equal(res, expected)
129-
13099
if method == 'first' and dtype == 'O':
131100
continue
132101

133102
expected = (s.max() - s).rank(method=method)
134103
res2 = s.rank(method=method, ascending=False)
135104
assert_series_equal(res2, expected)
136105

137-
expected = (df.max() - df).rank(method=method)
138-
139-
if dtype != 'O':
140-
res2 = df.rank(method=method, ascending=False,
141-
numeric_only=True)
142-
assert_frame_equal(res2, expected)
143-
144-
res3 = df.rank(method=method, ascending=False,
145-
numeric_only=False)
146-
assert_frame_equal(res3, expected)
147-
148-
def test_rank_2d_tie_methods(self):
149-
df = self.df
150-
151-
def _check2d(df, expected, method='average', axis=0):
152-
exp_df = DataFrame({'A': expected, 'B': expected})
153-
154-
if axis == 1:
155-
df = df.T
156-
exp_df = exp_df.T
157-
158-
result = df.rank(method=method, axis=axis)
159-
assert_frame_equal(result, exp_df)
160-
161-
dtypes = [None, object]
162-
disabled = set([(object, 'first')])
163-
results = self.results
164-
165-
for method, axis, dtype in product(results, [0, 1], dtypes):
166-
if (dtype, method) in disabled:
167-
continue
168-
frame = df if dtype is None else df.astype(dtype)
169-
_check2d(frame, results[method], method=method, axis=axis)
170106

171107
def test_rank_int(self):
172108
s = self.s.dropna().astype('i8')

0 commit comments

Comments
 (0)