@@ -131,7 +131,7 @@ cdef _take_2d_object(ndarray[object, ndim=2] values,
131
131
132
132
133
133
def rank_1d_float64 (object in_arr , ties_method = ' average' , ascending = True ,
134
- na_option = ' keep' ):
134
+ na_option = ' keep' , pct = False ):
135
135
"""
136
136
Fast NaN-friendly version of scipy.stats.rankdata
137
137
"""
@@ -144,6 +144,7 @@ def rank_1d_float64(object in_arr, ties_method='average', ascending=True,
144
144
float64_t sum_ranks = 0
145
145
int tiebreak = 0
146
146
bint keep_na = 0
147
+ float count = 0.0
147
148
tiebreak = tiebreakers[ties_method]
148
149
149
150
values = np.asarray(in_arr).copy()
@@ -182,6 +183,7 @@ def rank_1d_float64(object in_arr, ties_method='average', ascending=True,
182
183
if (val == nan_value) and keep_na:
183
184
ranks[argsorted[i]] = nan
184
185
continue
186
+ count += 1.0
185
187
if i == n - 1 or fabs(sorted_data[i + 1 ] - val) > FP_ERR:
186
188
if tiebreak == TIEBREAK_AVERAGE:
187
189
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,
199
201
for j in range (i - dups + 1 , i + 1 ):
200
202
ranks[argsorted[j]] = 2 * i - j - dups + 2
201
203
sum_ranks = dups = 0
202
- return ranks
204
+ if pct:
205
+ return ranks / count
206
+ else :
207
+ return ranks
203
208
204
209
205
210
def rank_1d_int64 (object in_arr , ties_method = ' average' , ascending = True ,
206
- na_option = ' keep' ):
211
+ na_option = ' keep' , pct = False ):
207
212
"""
208
213
Fast NaN-friendly version of scipy.stats.rankdata
209
214
"""
@@ -216,6 +221,7 @@ def rank_1d_int64(object in_arr, ties_method='average', ascending=True,
216
221
int64_t val
217
222
float64_t sum_ranks = 0
218
223
int tiebreak = 0
224
+ float count = 0.0
219
225
tiebreak = tiebreakers[ties_method]
220
226
221
227
values = np.asarray(in_arr)
@@ -242,6 +248,7 @@ def rank_1d_int64(object in_arr, ties_method='average', ascending=True,
242
248
sum_ranks += i + 1
243
249
dups += 1
244
250
val = sorted_data[i]
251
+ count += 1.0
245
252
if i == n - 1 or fabs(sorted_data[i + 1 ] - val) > 0 :
246
253
if tiebreak == TIEBREAK_AVERAGE:
247
254
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,
259
266
for j in range (i - dups + 1 , i + 1 ):
260
267
ranks[argsorted[j]] = 2 * i - j - dups + 2
261
268
sum_ranks = dups = 0
262
- return ranks
269
+ if pct:
270
+ return ranks / count
271
+ else :
272
+ return ranks
263
273
264
274
265
275
def 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',
414
424
415
425
416
426
def 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 ):
418
428
"""
419
429
Fast NaN-friendly version of scipy.stats.rankdata
420
430
"""
@@ -428,6 +438,8 @@ def rank_1d_generic(object in_arr, bint retry=1, ties_method='average',
428
438
float64_t sum_ranks = 0
429
439
int tiebreak = 0
430
440
bint keep_na = 0
441
+ float count = 0.0
442
+
431
443
432
444
tiebreak = tiebreakers[ties_method]
433
445
@@ -469,7 +481,6 @@ def rank_1d_generic(object in_arr, bint retry=1, ties_method='average',
469
481
470
482
sorted_data = values.take(_as)
471
483
argsorted = _as.astype(' i8' )
472
-
473
484
for i in range (n):
474
485
sum_ranks += i + 1
475
486
dups += 1
@@ -479,6 +490,7 @@ def rank_1d_generic(object in_arr, bint retry=1, ties_method='average',
479
490
continue
480
491
if (i == n - 1 or
481
492
are_diff(util.get_value_at(sorted_data, i + 1 ), val)):
493
+ count += 1.0
482
494
if tiebreak == TIEBREAK_AVERAGE:
483
495
for j in range (i - dups + 1 , i + 1 ):
484
496
ranks[argsorted[j]] = sum_ranks / dups
@@ -491,7 +503,10 @@ def rank_1d_generic(object in_arr, bint retry=1, ties_method='average',
491
503
elif tiebreak == TIEBREAK_FIRST:
492
504
raise ValueError (' first not supported for non-numeric data' )
493
505
sum_ranks = dups = 0
494
- return ranks
506
+ if pct:
507
+ ranks / count
508
+ else :
509
+ return ranks
495
510
496
511
cdef inline are_diff(object left, object right):
497
512
try :
0 commit comments