Skip to content

Commit 81f2e9b

Browse files
rouzazarigfyoung
authored andcommitted
Parameterize all rank methods for pct=True
- Added frame and series tests for all methods - method='dense' remains the only change method
1 parent 9a06c93 commit 81f2e9b

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
@@ -7,6 +7,8 @@
77

88
from pandas import Series, DataFrame
99

10+
import pytest
11+
1012
from pandas.compat import product
1113
from pandas.util.testing import assert_frame_equal
1214
import pandas.util.testing as tm
@@ -217,15 +219,6 @@ def test_rank_methods_frame(self):
217219
expected = expected.astype('float64')
218220
tm.assert_frame_equal(result, expected)
219221

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

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

pandas/tests/series/test_rank.py

+79-6
Original file line numberDiff line numberDiff line change
@@ -378,21 +378,94 @@ def test_rank_modify_inplace(self):
378378
assert_series_equal(result, expected)
379379

380380

381+
# GH15630, pct should be on 100% basis when method='dense'
382+
381383
@pytest.mark.parametrize('dtype', ['O', 'f8', 'i8'])
382384
@pytest.mark.parametrize('ser, exp', [
383385
([1], [1.]),
384-
([2], [1.]),
385-
([0], [1.]),
386+
([1, 2], [1. / 2, 2. / 2]),
386387
([2, 2], [1., 1.]),
387388
([1, 2, 3], [1. / 3, 2. / 3, 3. / 3]),
389+
([1, 2, 2], [1. / 2, 2. / 2, 2. / 2]),
388390
([4, 2, 1], [3. / 3, 2. / 3, 1. / 3],),
389391
([1, 1, 5, 5, 3], [1. / 3, 1. / 3, 3. / 3, 3. / 3, 2. / 3]),
392+
([1, 1, 3, 3, 5, 5], [1. / 3, 1. / 3, 2. / 3, 2. / 3, 3. / 3, 3. / 3]),
390393
([-5, -4, -3, -2, -1], [1. / 5, 2. / 5, 3. / 5, 4. / 5, 5. / 5])])
391-
def test_rank_pct(dtype, ser, exp):
392-
# GH15630, pct should be on 100% basis even when method='dense'
393-
# TODO: add other methods (i.e. 'average', 'min', 'max', 'first')
394-
394+
def test_rank_dense_pct(dtype, ser, exp):
395395
s = Series(ser).astype(dtype)
396396
result = s.rank(method='dense', pct=True)
397397
expected = Series(exp).astype(result.dtype)
398398
assert_series_equal(result, expected)
399+
400+
401+
@pytest.mark.parametrize('dtype', ['O', 'f8', 'i8'])
402+
@pytest.mark.parametrize('ser, exp', [
403+
([1], [1.]),
404+
([1, 2], [1. / 2, 2. / 2]),
405+
([2, 2], [1. / 2, 1. / 2]),
406+
([1, 2, 3], [1. / 3, 2. / 3, 3. / 3]),
407+
([1, 2, 2], [1. / 3, 2. / 3, 2. / 3]),
408+
([4, 2, 1], [3. / 3, 2. / 3, 1. / 3],),
409+
([1, 1, 5, 5, 3], [1. / 5, 1. / 5, 4. / 5, 4. / 5, 3. / 5]),
410+
([1, 1, 3, 3, 5, 5], [1. / 6, 1. / 6, 3. / 6, 3. / 6, 5. / 6, 5. / 6]),
411+
([-5, -4, -3, -2, -1], [1. / 5, 2. / 5, 3. / 5, 4. / 5, 5. / 5])])
412+
def test_rank_min_pct(dtype, ser, exp):
413+
s = Series(ser).astype(dtype)
414+
result = s.rank(method='min', pct=True)
415+
expected = Series(exp).astype(result.dtype)
416+
assert_series_equal(result, expected)
417+
418+
419+
@pytest.mark.parametrize('dtype', ['O', 'f8', 'i8'])
420+
@pytest.mark.parametrize('ser, exp', [
421+
([1], [1.]),
422+
([1, 2], [1. / 2, 2. / 2]),
423+
([2, 2], [1., 1.]),
424+
([1, 2, 3], [1. / 3, 2. / 3, 3. / 3]),
425+
([1, 2, 2], [1. / 3, 3. / 3, 3. / 3]),
426+
([4, 2, 1], [3. / 3, 2. / 3, 1. / 3],),
427+
([1, 1, 5, 5, 3], [2. / 5, 2. / 5, 5. / 5, 5. / 5, 3. / 5]),
428+
([1, 1, 3, 3, 5, 5], [2. / 6, 2. / 6, 4. / 6, 4. / 6, 6. / 6, 6. / 6]),
429+
([-5, -4, -3, -2, -1], [1. / 5, 2. / 5, 3. / 5, 4. / 5, 5. / 5])])
430+
def test_rank_max_pct(dtype, ser, exp):
431+
s = Series(ser).astype(dtype)
432+
result = s.rank(method='max', pct=True)
433+
expected = Series(exp).astype(result.dtype)
434+
assert_series_equal(result, expected)
435+
436+
437+
@pytest.mark.parametrize('dtype', ['O', 'f8', 'i8'])
438+
@pytest.mark.parametrize('ser, exp', [
439+
([1], [1.]),
440+
([1, 2], [1. / 2, 2. / 2]),
441+
([2, 2], [1.5 / 2, 1.5 / 2]),
442+
([1, 2, 3], [1. / 3, 2. / 3, 3. / 3]),
443+
([1, 2, 2], [1. / 3, 2.5 / 3, 2.5 / 3]),
444+
([4, 2, 1], [3. / 3, 2. / 3, 1. / 3],),
445+
([1, 1, 5, 5, 3], [1.5 / 5, 1.5 / 5, 4.5 / 5, 4.5 / 5, 3. / 5]),
446+
([1, 1, 3, 3, 5, 5],
447+
[1.5 / 6, 1.5 / 6, 3.5 / 6, 3.5 / 6, 5.5 / 6, 5.5 / 6]),
448+
([-5, -4, -3, -2, -1], [1. / 5, 2. / 5, 3. / 5, 4. / 5, 5. / 5])])
449+
def test_rank_average_pct(dtype, ser, exp):
450+
s = Series(ser).astype(dtype)
451+
result = s.rank(method='average', pct=True)
452+
expected = Series(exp).astype(result.dtype)
453+
assert_series_equal(result, expected)
454+
455+
456+
@pytest.mark.parametrize('dtype', ['f8', 'i8'])
457+
@pytest.mark.parametrize('ser, exp', [
458+
([1], [1.]),
459+
([1, 2], [1. / 2, 2. / 2]),
460+
([2, 2], [1. / 2, 2. / 2.]),
461+
([1, 2, 3], [1. / 3, 2. / 3, 3. / 3]),
462+
([1, 2, 2], [1. / 3, 2. / 3, 3. / 3]),
463+
([4, 2, 1], [3. / 3, 2. / 3, 1. / 3],),
464+
([1, 1, 5, 5, 3], [1. / 5, 2. / 5, 4. / 5, 5. / 5, 3. / 5]),
465+
([1, 1, 3, 3, 5, 5], [1. / 6, 2. / 6, 3. / 6, 4. / 6, 5. / 6, 6. / 6]),
466+
([-5, -4, -3, -2, -1], [1. / 5, 2. / 5, 3. / 5, 4. / 5, 5. / 5])])
467+
def test_rank_first_pct(dtype, ser, exp):
468+
s = Series(ser).astype(dtype)
469+
result = s.rank(method='first', pct=True)
470+
expected = Series(exp).astype(result.dtype)
471+
assert_series_equal(result, expected)

0 commit comments

Comments
 (0)