@@ -131,7 +131,7 @@ cdef _take_2d_object(ndarray[object, ndim=2] values,
131131
132132
133133def rank_1d_float64 (object in_arr , ties_method = ' average' , ascending = True ,
134- na_option = ' keep' ):
134+ na_option = ' keep' , pct = False ):
135135 """
136136 Fast NaN-friendly version of scipy.stats.rankdata
137137 """
@@ -144,6 +144,7 @@ def rank_1d_float64(object in_arr, ties_method='average', ascending=True,
144144 float64_t sum_ranks = 0
145145 int tiebreak = 0
146146 bint keep_na = 0
147+ float count = 0.0
147148 tiebreak = tiebreakers[ties_method]
148149
149150 values = np.asarray(in_arr).copy()
@@ -182,6 +183,7 @@ def rank_1d_float64(object in_arr, ties_method='average', ascending=True,
182183 if (val == nan_value) and keep_na:
183184 ranks[argsorted[i]] = nan
184185 continue
186+ count += 1.0
185187 if i == n - 1 or fabs(sorted_data[i + 1 ] - val) > FP_ERR:
186188 if tiebreak == TIEBREAK_AVERAGE:
187189 for j in range (i - dups + 1 , i + 1 ):
@@ -199,11 +201,14 @@ def rank_1d_float64(object in_arr, ties_method='average', ascending=True,
199201 for j in range (i - dups + 1 , i + 1 ):
200202 ranks[argsorted[j]] = 2 * i - j - dups + 2
201203 sum_ranks = dups = 0
202- return ranks
204+ if pct:
205+ return ranks / count
206+ else :
207+ return ranks
203208
204209
205210def rank_1d_int64 (object in_arr , ties_method = ' average' , ascending = True ,
206- na_option = ' keep' ):
211+ na_option = ' keep' , pct = False ):
207212 """
208213 Fast NaN-friendly version of scipy.stats.rankdata
209214 """
@@ -216,6 +221,7 @@ def rank_1d_int64(object in_arr, ties_method='average', ascending=True,
216221 int64_t val
217222 float64_t sum_ranks = 0
218223 int tiebreak = 0
224+ float count = 0.0
219225 tiebreak = tiebreakers[ties_method]
220226
221227 values = np.asarray(in_arr)
@@ -242,6 +248,7 @@ def rank_1d_int64(object in_arr, ties_method='average', ascending=True,
242248 sum_ranks += i + 1
243249 dups += 1
244250 val = sorted_data[i]
251+ count += 1.0
245252 if i == n - 1 or fabs(sorted_data[i + 1 ] - val) > 0 :
246253 if tiebreak == TIEBREAK_AVERAGE:
247254 for j in range (i - dups + 1 , i + 1 ):
@@ -259,7 +266,10 @@ def rank_1d_int64(object in_arr, ties_method='average', ascending=True,
259266 for j in range (i - dups + 1 , i + 1 ):
260267 ranks[argsorted[j]] = 2 * i - j - dups + 2
261268 sum_ranks = dups = 0
262- return ranks
269+ if pct:
270+ return ranks / count
271+ else :
272+ return ranks
263273
264274
265275def rank_2d_float64 (object in_arr , axis = 0 , ties_method = ' average' ,
@@ -414,7 +424,7 @@ def rank_2d_int64(object in_arr, axis=0, ties_method='average',
414424
415425
416426def rank_1d_generic (object in_arr , bint retry = 1 , ties_method = ' average' ,
417- ascending = True , na_option = ' keep' ):
427+ ascending = True , na_option = ' keep' , pct = False ):
418428 """
419429 Fast NaN-friendly version of scipy.stats.rankdata
420430 """
@@ -428,6 +438,8 @@ def rank_1d_generic(object in_arr, bint retry=1, ties_method='average',
428438 float64_t sum_ranks = 0
429439 int tiebreak = 0
430440 bint keep_na = 0
441+ float count = 0.0
442+
431443
432444 tiebreak = tiebreakers[ties_method]
433445
@@ -469,7 +481,6 @@ def rank_1d_generic(object in_arr, bint retry=1, ties_method='average',
469481
470482 sorted_data = values.take(_as)
471483 argsorted = _as.astype(' i8' )
472-
473484 for i in range (n):
474485 sum_ranks += i + 1
475486 dups += 1
@@ -479,6 +490,7 @@ def rank_1d_generic(object in_arr, bint retry=1, ties_method='average',
479490 continue
480491 if (i == n - 1 or
481492 are_diff(util.get_value_at(sorted_data, i + 1 ), val)):
493+ count += 1.0
482494 if tiebreak == TIEBREAK_AVERAGE:
483495 for j in range (i - dups + 1 , i + 1 ):
484496 ranks[argsorted[j]] = sum_ranks / dups
@@ -491,7 +503,10 @@ def rank_1d_generic(object in_arr, bint retry=1, ties_method='average',
491503 elif tiebreak == TIEBREAK_FIRST:
492504 raise ValueError (' first not supported for non-numeric data' )
493505 sum_ranks = dups = 0
494- return ranks
506+ if pct:
507+ ranks / count
508+ else :
509+ return ranks
495510
496511cdef inline are_diff(object left, object right):
497512 try :
0 commit comments