@@ -226,14 +226,27 @@ def rank_1d_int64(object in_arr, ties_method='average', ascending=True,
226
226
ndarray[int64_t] sorted_data, values
227
227
ndarray[float64_t] ranks
228
228
ndarray[int64_t] argsorted
229
- int64_t val
229
+ int64_t val, nan_value
230
230
float64_t sum_ranks = 0
231
+ bint keep_na
231
232
int tiebreak = 0
232
233
float count = 0.0
233
234
tiebreak = tiebreakers[ties_method]
234
235
236
+ keep_na = na_option == ' keep'
237
+
235
238
values = np.asarray(in_arr)
236
239
240
+ if ascending ^ (na_option == ' top' ):
241
+ nan_value = np.iinfo(' int64' ).max
242
+ else :
243
+ nan_value = np.iinfo(' int64' ).min
244
+
245
+ # unlike floats, which have np.inf, -np.inf, and np.nan
246
+ # ints do not
247
+ mask = values == iNaT
248
+ np.putmask(values, mask, nan_value)
249
+
237
250
n = len (values)
238
251
ranks = np.empty(n, dtype = ' f8' )
239
252
@@ -256,6 +269,9 @@ def rank_1d_int64(object in_arr, ties_method='average', ascending=True,
256
269
sum_ranks += i + 1
257
270
dups += 1
258
271
val = sorted_data[i]
272
+ if (val == nan_value) and keep_na:
273
+ ranks[argsorted[i]] = nan
274
+ continue
259
275
count += 1.0
260
276
if i == n - 1 or fabs(sorted_data[i + 1 ] - val) > 0 :
261
277
if tiebreak == TIEBREAK_AVERAGE:
@@ -387,16 +403,30 @@ def rank_2d_int64(object in_arr, axis=0, ties_method='average',
387
403
ndarray[float64_t, ndim= 2 ] ranks
388
404
ndarray[int64_t, ndim= 2 ] argsorted
389
405
ndarray[int64_t, ndim= 2 , cast= True ] values
390
- int64_t val
406
+ int64_t val, nan_value
391
407
float64_t sum_ranks = 0
408
+ bint keep_na = 0
392
409
int tiebreak = 0
393
410
float count = 0.0
394
411
tiebreak = tiebreakers[ties_method]
395
412
413
+ keep_na = na_option == ' keep'
414
+
415
+ in_arr = np.asarray(in_arr)
416
+
396
417
if axis == 0 :
397
- values = np.asarray(in_arr).T
418
+ values = in_arr.T.copy()
419
+ else :
420
+ values = in_arr.copy()
421
+
422
+ if ascending ^ (na_option == ' top' ):
423
+ nan_value = np.iinfo(' int64' ).max
398
424
else :
399
- values = np.asarray(in_arr)
425
+ nan_value = np.iinfo(' int64' ).min
426
+
427
+ # unlike floats, which have np.inf, -np.inf, and np.nan
428
+ # ints do not
429
+ np.putmask(values, values == iNaT, nan_value)
400
430
401
431
n, k = (< object > values).shape
402
432
ranks = np.empty((n, k), dtype = ' f8' )
@@ -423,6 +453,9 @@ def rank_2d_int64(object in_arr, axis=0, ties_method='average',
423
453
sum_ranks += j + 1
424
454
dups += 1
425
455
val = values[i, j]
456
+ if val == nan_value and keep_na:
457
+ ranks[i, argsorted[i, j]] = nan
458
+ continue
426
459
count += 1.0
427
460
if j == k - 1 or fabs(values[i, j + 1 ] - val) > FP_ERR:
428
461
if tiebreak == TIEBREAK_AVERAGE:
0 commit comments