Skip to content

Commit 2ac3ab9

Browse files
committed
Parameterize all rank methods for pct=True
- Added frame and series tests for all methods - method='dense' remains the only change method
1 parent 3c1128b commit 2ac3ab9

File tree

2 files changed

+134
-15
lines changed

2 files changed

+134
-15
lines changed

pandas/tests/frame/test_rank.py

+55-9
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
from pandas import Series, DataFrame
88

9+
import pytest
10+
911
from pandas.compat import product
1012
from pandas.util.testing import assert_frame_equal
1113
import pandas.util.testing as tm
@@ -218,15 +220,6 @@ def test_rank_methods_frame(self):
218220
expected = expected.astype('float64')
219221
tm.assert_frame_equal(result, expected)
220222

221-
def test_rank_dense_method(self):
222-
# GH15630, pct should be on 100% basis even when method='dense'
223-
df = DataFrame([['2012', 'B', 3], ['2012', 'A', 2], ['2012', 'A', 1]])
224-
result = df.rank(method='dense', pct=True)
225-
expected = DataFrame([[1., 1., 1.],
226-
[1., 0.5, 2. / 3],
227-
[1., 0.5, 1. / 3]])
228-
assert_frame_equal(result, expected)
229-
230223
def test_rank_descending(self):
231224
dtypes = ['O', 'f8', 'i8']
232225

@@ -276,3 +269,56 @@ def _check2d(df, expected, method='average', axis=0):
276269
continue
277270
frame = df if dtype is None else df.astype(dtype)
278271
_check2d(frame, results[method], method=method, axis=axis)
272+
273+
274+
# GH15630, pct should be on 100% basis when method='dense'
275+
@pytest.mark.parametrize('frame, exp', [
276+
([['2012', 'B', 3], ['2012', 'A', 2], ['2012', 'A', 1]],
277+
[[1., 1., 1.], [1., 0.5, 2. / 3], [1., 0.5, 1. / 3]])])
278+
def test_rank_dense_pct(frame, exp):
279+
df = DataFrame(frame)
280+
result = df.rank(method='dense', pct=True)
281+
expected = DataFrame(exp)
282+
assert_frame_equal(result, expected)
283+
284+
285+
@pytest.mark.parametrize('frame, exp', [
286+
([['2012', 'B', 3], ['2012', 'A', 2], ['2012', 'A', 1]],
287+
[[1. / 3, 1., 1.], [1. / 3, 1. / 3, 2. / 3],
288+
[1. / 3, 1. / 3, 1. / 3]])])
289+
def test_rank_min_pct(frame, exp):
290+
df = DataFrame(frame)
291+
result = df.rank(method='min', pct=True)
292+
expected = DataFrame(exp)
293+
assert_frame_equal(result, expected)
294+
295+
296+
@pytest.mark.parametrize('frame, exp', [
297+
([['2012', 'B', 3], ['2012', 'A', 2], ['2012', 'A', 1]],
298+
[[1., 1., 1.], [1., 2. / 3, 2. / 3], [1., 2. / 3, 1. / 3]])])
299+
def test_rank_max_pct(frame, exp):
300+
df = DataFrame(frame)
301+
result = df.rank(method='max', pct=True)
302+
expected = DataFrame(exp)
303+
assert_frame_equal(result, expected)
304+
305+
306+
@pytest.mark.parametrize('frame, exp', [
307+
([['2012', 'B', 3], ['2012', 'A', 2], ['2012', 'A', 1]],
308+
[[2. / 3, 1., 1.], [2. / 3, 0.5, 2. / 3], [2. / 3, 0.5, 1. / 3]])])
309+
def test_rank_average_pct(frame, exp):
310+
df = DataFrame(frame)
311+
result = df.rank(method='average', pct=True)
312+
expected = DataFrame(exp)
313+
assert_frame_equal(result, expected)
314+
315+
316+
@pytest.mark.parametrize('frame, exp', [
317+
([[2012, 66, 3], [2012, 65, 2], [2012, 65, 1]],
318+
[[1. / 3, 1., 1.], [2. / 3, 1. / 3, 2. / 3],
319+
[3. / 3, 2. / 3, 1. / 3]])])
320+
def test_rank_first_pct(frame, exp):
321+
df = DataFrame(frame)
322+
result = df.rank(method='first', pct=True)
323+
expected = DataFrame(exp)
324+
assert_frame_equal(result, expected)

pandas/tests/series/test_rank.py

+79-6
Original file line numberDiff line numberDiff line change
@@ -324,21 +324,94 @@ def test_rank_object_bug(self):
324324
Series([np.nan] * 32).astype(object).rank(ascending=False)
325325

326326

327+
# GH15630, pct should be on 100% basis when method='dense'
328+
327329
@pytest.mark.parametrize('dtype', ['O', 'f8', 'i8'])
328330
@pytest.mark.parametrize('ser, exp', [
329331
([1], [1.]),
330-
([2], [1.]),
331-
([0], [1.]),
332+
([1, 2], [1. / 2, 2. / 2]),
332333
([2, 2], [1., 1.]),
333334
([1, 2, 3], [1. / 3, 2. / 3, 3. / 3]),
335+
([1, 2, 2], [1. / 2, 2. / 2, 2. / 2]),
334336
([4, 2, 1], [3. / 3, 2. / 3, 1. / 3],),
335337
([1, 1, 5, 5, 3], [1. / 3, 1. / 3, 3. / 3, 3. / 3, 2. / 3]),
338+
([1, 1, 3, 3, 5, 5], [1. / 3, 1. / 3, 2. / 3, 2. / 3, 3. / 3, 3. / 3]),
336339
([-5, -4, -3, -2, -1], [1. / 5, 2. / 5, 3. / 5, 4. / 5, 5. / 5])])
337-
def test_rank_pct(dtype, ser, exp):
338-
# GH15630, pct should be on 100% basis even when method='dense'
339-
# TODO: add other methods (i.e. 'average', 'min', 'max', 'first')
340-
340+
def test_rank_dense_pct(dtype, ser, exp):
341341
s = Series(ser).astype(dtype)
342342
result = s.rank(method='dense', pct=True)
343343
expected = Series(exp).astype(result.dtype)
344344
assert_series_equal(result, expected)
345+
346+
347+
@pytest.mark.parametrize('dtype', ['O', 'f8', 'i8'])
348+
@pytest.mark.parametrize('ser, exp', [
349+
([1], [1.]),
350+
([1, 2], [1. / 2, 2. / 2]),
351+
([2, 2], [1. / 2, 1. / 2]),
352+
([1, 2, 3], [1. / 3, 2. / 3, 3. / 3]),
353+
([1, 2, 2], [1. / 3, 2. / 3, 2. / 3]),
354+
([4, 2, 1], [3. / 3, 2. / 3, 1. / 3],),
355+
([1, 1, 5, 5, 3], [1. / 5, 1. / 5, 4. / 5, 4. / 5, 3. / 5]),
356+
([1, 1, 3, 3, 5, 5], [1. / 6, 1. / 6, 3. / 6, 3. / 6, 5. / 6, 5. / 6]),
357+
([-5, -4, -3, -2, -1], [1. / 5, 2. / 5, 3. / 5, 4. / 5, 5. / 5])])
358+
def test_rank_min_pct(dtype, ser, exp):
359+
s = Series(ser).astype(dtype)
360+
result = s.rank(method='min', pct=True)
361+
expected = Series(exp).astype(result.dtype)
362+
assert_series_equal(result, expected)
363+
364+
365+
@pytest.mark.parametrize('dtype', ['O', 'f8', 'i8'])
366+
@pytest.mark.parametrize('ser, exp', [
367+
([1], [1.]),
368+
([1, 2], [1. / 2, 2. / 2]),
369+
([2, 2], [1., 1.]),
370+
([1, 2, 3], [1. / 3, 2. / 3, 3. / 3]),
371+
([1, 2, 2], [1. / 3, 3. / 3, 3. / 3]),
372+
([4, 2, 1], [3. / 3, 2. / 3, 1. / 3],),
373+
([1, 1, 5, 5, 3], [2. / 5, 2. / 5, 5. / 5, 5. / 5, 3. / 5]),
374+
([1, 1, 3, 3, 5, 5], [2. / 6, 2. / 6, 4. / 6, 4. / 6, 6. / 6, 6. / 6]),
375+
([-5, -4, -3, -2, -1], [1. / 5, 2. / 5, 3. / 5, 4. / 5, 5. / 5])])
376+
def test_rank_max_pct(dtype, ser, exp):
377+
s = Series(ser).astype(dtype)
378+
result = s.rank(method='max', pct=True)
379+
expected = Series(exp).astype(result.dtype)
380+
assert_series_equal(result, expected)
381+
382+
383+
@pytest.mark.parametrize('dtype', ['O', 'f8', 'i8'])
384+
@pytest.mark.parametrize('ser, exp', [
385+
([1], [1.]),
386+
([1, 2], [1. / 2, 2. / 2]),
387+
([2, 2], [1.5 / 2, 1.5 / 2]),
388+
([1, 2, 3], [1. / 3, 2. / 3, 3. / 3]),
389+
([1, 2, 2], [1. / 3, 2.5 / 3, 2.5 / 3]),
390+
([4, 2, 1], [3. / 3, 2. / 3, 1. / 3],),
391+
([1, 1, 5, 5, 3], [1.5 / 5, 1.5 / 5, 4.5 / 5, 4.5 / 5, 3. / 5]),
392+
([1, 1, 3, 3, 5, 5],
393+
[1.5 / 6, 1.5 / 6, 3.5 / 6, 3.5 / 6, 5.5 / 6, 5.5 / 6]),
394+
([-5, -4, -3, -2, -1], [1. / 5, 2. / 5, 3. / 5, 4. / 5, 5. / 5])])
395+
def test_rank_average_pct(dtype, ser, exp):
396+
s = Series(ser).astype(dtype)
397+
result = s.rank(method='average', pct=True)
398+
expected = Series(exp).astype(result.dtype)
399+
assert_series_equal(result, expected)
400+
401+
402+
@pytest.mark.parametrize('dtype', ['f8', 'i8'])
403+
@pytest.mark.parametrize('ser, exp', [
404+
([1], [1.]),
405+
([1, 2], [1. / 2, 2. / 2]),
406+
([2, 2], [1. / 2, 2. / 2.]),
407+
([1, 2, 3], [1. / 3, 2. / 3, 3. / 3]),
408+
([1, 2, 2], [1. / 3, 2. / 3, 3. / 3]),
409+
([4, 2, 1], [3. / 3, 2. / 3, 1. / 3],),
410+
([1, 1, 5, 5, 3], [1. / 5, 2. / 5, 4. / 5, 5. / 5, 3. / 5]),
411+
([1, 1, 3, 3, 5, 5], [1. / 6, 2. / 6, 3. / 6, 4. / 6, 5. / 6, 6. / 6]),
412+
([-5, -4, -3, -2, -1], [1. / 5, 2. / 5, 3. / 5, 4. / 5, 5. / 5])])
413+
def test_rank_first_pct(dtype, ser, exp):
414+
s = Series(ser).astype(dtype)
415+
result = s.rank(method='first', pct=True)
416+
expected = Series(exp).astype(result.dtype)
417+
assert_series_equal(result, expected)

0 commit comments

Comments
 (0)