@@ -283,7 +283,7 @@ def rank_1d_int64(object in_arr, ties_method='average', ascending=True,
283283
284284
285285def rank_2d_float64 (object in_arr , axis = 0 , ties_method = ' average' ,
286- ascending = True , na_option = ' keep' ):
286+ ascending = True , na_option = ' keep' , pct = False ):
287287 """
288288 Fast NaN-friendly version of scipy.stats.rankdata
289289 """
@@ -296,6 +296,7 @@ def rank_2d_float64(object in_arr, axis=0, ties_method='average',
296296 float64_t sum_ranks = 0
297297 int tiebreak = 0
298298 bint keep_na = 0
299+ float count = 0.0
299300
300301 tiebreak = tiebreakers[ties_method]
301302
@@ -335,13 +336,15 @@ def rank_2d_float64(object in_arr, axis=0, ties_method='average',
335336 for i in range (n):
336337 dups = sum_ranks = 0
337338 total_tie_count = 0
339+ count = 0.0
338340 for j in range (k):
339341 sum_ranks += j + 1
340342 dups += 1
341343 val = values[i, j]
342344 if val == nan_value and keep_na:
343345 ranks[i, argsorted[i, j]] = nan
344346 continue
347+ count += 1.0
345348 if j == k - 1 or fabs(values[i, j + 1 ] - val) > FP_ERR:
346349 if tiebreak == TIEBREAK_AVERAGE:
347350 for z in range (j - dups + 1 , j + 1 ):
@@ -363,15 +366,16 @@ def rank_2d_float64(object in_arr, axis=0, ties_method='average',
363366 for z in range (j - dups + 1 , j + 1 ):
364367 ranks[i, argsorted[i, z]] = total_tie_count
365368 sum_ranks = dups = 0
366-
369+ if pct:
370+ ranks[i, :] /= count
367371 if axis == 0 :
368372 return ranks.T
369373 else :
370374 return ranks
371375
372376
373377def rank_2d_int64 (object in_arr , axis = 0 , ties_method = ' average' ,
374- ascending = True , na_option = ' keep' ):
378+ ascending = True , na_option = ' keep' , pct = False ):
375379 """
376380 Fast NaN-friendly version of scipy.stats.rankdata
377381 """
@@ -384,6 +388,7 @@ def rank_2d_int64(object in_arr, axis=0, ties_method='average',
384388 int64_t val
385389 float64_t sum_ranks = 0
386390 int tiebreak = 0
391+ float count = 0.0
387392 tiebreak = tiebreakers[ties_method]
388393
389394 if axis == 0 :
@@ -411,10 +416,12 @@ def rank_2d_int64(object in_arr, axis=0, ties_method='average',
411416 for i in range (n):
412417 dups = sum_ranks = 0
413418 total_tie_count = 0
419+ count = 0.0
414420 for j in range (k):
415421 sum_ranks += j + 1
416422 dups += 1
417423 val = values[i, j]
424+ count += 1.0
418425 if j == k - 1 or fabs(values[i, j + 1 ] - val) > FP_ERR:
419426 if tiebreak == TIEBREAK_AVERAGE:
420427 for z in range (j - dups + 1 , j + 1 ):
@@ -436,7 +443,8 @@ def rank_2d_int64(object in_arr, axis=0, ties_method='average',
436443 for z in range (j - dups + 1 , j + 1 ):
437444 ranks[i, argsorted[i, z]] = total_tie_count
438445 sum_ranks = dups = 0
439-
446+ if pct:
447+ ranks[i, :] /= count
440448 if axis == 0 :
441449 return ranks.T
442450 else :
@@ -528,7 +536,7 @@ def rank_1d_generic(object in_arr, bint retry=1, ties_method='average',
528536 ranks[argsorted[j]] = total_tie_count
529537 sum_ranks = dups = 0
530538 if pct:
531- ranks / count
539+ return ranks / count
532540 else :
533541 return ranks
534542
@@ -562,7 +570,7 @@ class NegInfinity(object):
562570 __cmp__ = _return_true
563571
564572def rank_2d_generic (object in_arr , axis = 0 , ties_method = ' average' ,
565- ascending = True , na_option = ' keep' ):
573+ ascending = True , na_option = ' keep' , pct = False ):
566574 """
567575 Fast NaN-friendly version of scipy.stats.rankdata
568576 """
@@ -577,6 +585,7 @@ def rank_2d_generic(object in_arr, axis=0, ties_method='average',
577585 float64_t sum_ranks = 0
578586 int tiebreak = 0
579587 bint keep_na = 0
588+ float count = 0.0
580589
581590 tiebreak = tiebreakers[ties_method]
582591
@@ -611,7 +620,8 @@ def rank_2d_generic(object in_arr, axis=0, ties_method='average',
611620 for i in range (len (values)):
612621 ranks[i] = rank_1d_generic(in_arr[i],
613622 ties_method = ties_method,
614- ascending = ascending)
623+ ascending = ascending,
624+ pct = pct)
615625 if axis == 0 :
616626 return ranks.T
617627 else :
@@ -626,12 +636,14 @@ def rank_2d_generic(object in_arr, axis=0, ties_method='average',
626636 for i in range (n):
627637 dups = sum_ranks = infs = 0
628638 total_tie_count = 0
639+ count = 0.0
629640 for j in range (k):
630641 val = values[i, j]
631642 if val is nan_value and keep_na:
632643 ranks[i, argsorted[i, j]] = nan
633644 infs += 1
634645 continue
646+ count += 1.0
635647 sum_ranks += (j - infs) + 1
636648 dups += 1
637649 if j == k - 1 or are_diff(values[i, j + 1 ], val):
@@ -652,7 +664,8 @@ def rank_2d_generic(object in_arr, axis=0, ties_method='average',
652664 for z in range (j - dups + 1 , j + 1 ):
653665 ranks[i, argsorted[i, z]] = total_tie_count
654666 sum_ranks = dups = 0
655-
667+ if pct:
668+ ranks[i, :] /= count
656669 if axis == 0 :
657670 return ranks.T
658671 else :
0 commit comments