@@ -44,6 +44,10 @@ def rank_1d_{{dtype}}(object in_arr, ties_method='average', ascending=True,
44
44
45
45
{{if dtype == 'object'}}
46
46
ndarray sorted_data, values
47
+ ndarray[np.uint8_t, cast=True] sorted_namask
48
+ {{elif dtype != 'uint64'}}
49
+ ndarray[{{ctype}}] sorted_data, values
50
+ ndarray[np.uint8_t, cast=True] sorted_namask
47
51
{{else}}
48
52
ndarray[{{ctype}}] sorted_data, values
49
53
{{endif}}
@@ -54,7 +58,7 @@ def rank_1d_{{dtype}}(object in_arr, ties_method='average', ascending=True,
54
58
{{if dtype == 'uint64'}}
55
59
{{ctype}} val
56
60
{{else}}
57
- {{ctype}} val, nan_value
61
+ {{ctype}} val, nan_value, isnan
58
62
{{endif}}
59
63
60
64
float64_t sum_ranks = 0
@@ -123,17 +127,23 @@ def rank_1d_{{dtype}}(object in_arr, ties_method='average', ascending=True,
123
127
_as = _as[::-1]
124
128
125
129
sorted_data = values.take(_as)
130
+ # need to distinguish between pos/neg nan and real nan when keep_na is true
131
+ {{if dtype != 'uint64'}}
132
+ sorted_namask = mask.take(_as)
133
+ sorted_namask = sorted_namask.astype(np.bool)
134
+ {{endif}}
126
135
argsorted = _as.astype('i8')
127
136
128
137
{{if dtype == 'object'}}
129
138
for i in range(n):
130
139
sum_ranks += i + 1
131
140
dups += 1
132
-
141
+ isnan = sorted_namask[i]
133
142
val = util.get_value_at(sorted_data, i)
134
143
135
- if (val is nan_value) and keep_na:
144
+ if isnan and keep_na:
136
145
ranks[argsorted[i]] = nan
146
+ sum_ranks = dups = 0
137
147
continue
138
148
139
149
count += 1.0
@@ -168,8 +178,10 @@ def rank_1d_{{dtype}}(object in_arr, ties_method='average', ascending=True,
168
178
val = sorted_data[i]
169
179
170
180
{{if dtype != 'uint64'}}
171
- if (val == nan_value) and keep_na:
181
+ isnan = sorted_namask[i]
182
+ if isnan and keep_na:
172
183
ranks[argsorted[i]] = nan
184
+ sum_ranks = dups = 0
173
185
continue
174
186
{{endif}}
175
187
0 commit comments