@@ -172,7 +172,11 @@ def test_all_nan():
172
172
tm .assert_series_equal (result , expected )
173
173
174
174
175
- @pytest .mark .parametrize ("errors" , [None , "ignore" , "raise" , "coerce" ])
175
+ @pytest .fixture (params = [None , "ignore" , "raise" , "coerce" ])
176
+ def errors (request ):
177
+ return request .param
178
+
179
+
176
180
def test_type_check (errors ):
177
181
# see gh-11776
178
182
df = DataFrame ({"a" : [1 , - 3.14 , 7 ], "b" : ["4" , "5" , "6" ]})
@@ -183,11 +187,122 @@ def test_type_check(errors):
183
187
to_numeric (df , ** kwargs )
184
188
185
189
186
- @pytest .mark .parametrize ("val" , [
187
- 1 , 1.1 , "1" , "1.1" , - 1.5 , "-1.5"
190
+ @pytest .fixture (params = [True , False ])
191
+ def signed (request ):
192
+ return request .param
193
+
194
+
195
+ @pytest .fixture (params = [lambda x : x , str ])
196
+ def transform (request ):
197
+ return request .param
198
+
199
+
200
+ @pytest .mark .parametrize ("val" , [1 , 1.1 , 20001 ])
201
+ def test_scalar (val , signed , transform ):
202
+ val = - val if signed else val
203
+ assert to_numeric (transform (val )) == float (val )
204
+
205
+
206
+ @pytest .fixture (params = [
207
+ 47393996303418497800 ,
208
+ 100000000000000000000
188
209
])
189
- def test_scalar (val ):
190
- assert to_numeric (val ) == float (val )
210
+ def large_val (request ):
211
+ return request .param
212
+
213
+
214
+ def test_really_large_scalar (large_val , signed , transform , errors ):
215
+ # see gh-24910
216
+ kwargs = dict (errors = errors ) if errors is not None else dict ()
217
+ val = - large_val if signed else large_val
218
+
219
+ val = transform (val )
220
+ val_is_string = isinstance (val , str )
221
+
222
+ if val_is_string and errors in (None , "raise" ):
223
+ msg = "Integer out of range. at position 0"
224
+ with pytest .raises (ValueError , match = msg ):
225
+ to_numeric (val , ** kwargs )
226
+ else :
227
+ expected = float (val ) if (errors == "coerce" and
228
+ val_is_string ) else val
229
+ assert tm .assert_almost_equal (to_numeric (val , ** kwargs ), expected )
230
+
231
+
232
+ @pytest .fixture (params = [True , False ])
233
+ def multiple_elts (request ):
234
+ return request .param
235
+
236
+
237
+ def test_really_large_in_arr (large_val , signed , transform ,
238
+ multiple_elts , errors ):
239
+ # see gh-24910
240
+ kwargs = dict (errors = errors ) if errors is not None else dict ()
241
+ val = - large_val if signed else large_val
242
+ val = transform (val )
243
+
244
+ extra_elt = "string"
245
+ arr = [val ] + multiple_elts * [extra_elt ]
246
+
247
+ val_is_string = isinstance (val , str )
248
+ coercing = errors == "coerce"
249
+
250
+ if errors in (None , "raise" ) and (val_is_string or multiple_elts ):
251
+ if val_is_string :
252
+ msg = "Integer out of range. at position 0"
253
+ else :
254
+ msg = 'Unable to parse string "string" at position 1'
255
+
256
+ with pytest .raises (ValueError , match = msg ):
257
+ to_numeric (arr , ** kwargs )
258
+ else :
259
+ result = to_numeric (arr , ** kwargs )
260
+
261
+ exp_val = float (val ) if (coercing and val_is_string ) else val
262
+ expected = [exp_val ]
263
+
264
+ if multiple_elts :
265
+ if coercing :
266
+ expected .append (np .nan )
267
+ exp_dtype = float
268
+ else :
269
+ expected .append (extra_elt )
270
+ exp_dtype = object
271
+ else :
272
+ exp_dtype = float if isinstance (exp_val , (int , float )) else object
273
+
274
+ tm .assert_almost_equal (result , np .array (expected , dtype = exp_dtype ))
275
+
276
+
277
+ def test_really_large_in_arr_consistent (large_val , signed ,
278
+ multiple_elts , errors ):
279
+ # see gh-24910
280
+ #
281
+ # Even if we discover that we have to hold float, does not mean
282
+ # we should be lenient on subsequent elements that fail to be integer.
283
+ kwargs = dict (errors = errors ) if errors is not None else dict ()
284
+ arr = [str (- large_val if signed else large_val )]
285
+
286
+ if multiple_elts :
287
+ arr .insert (0 , large_val )
288
+
289
+ if errors in (None , "raise" ):
290
+ index = int (multiple_elts )
291
+ msg = "Integer out of range. at position {index}" .format (index = index )
292
+
293
+ with pytest .raises (ValueError , match = msg ):
294
+ to_numeric (arr , ** kwargs )
295
+ else :
296
+ result = to_numeric (arr , ** kwargs )
297
+
298
+ if errors == "coerce" :
299
+ expected = [float (i ) for i in arr ]
300
+ exp_dtype = float
301
+ else :
302
+ expected = arr
303
+ exp_dtype = object
304
+
305
+ tm .assert_almost_equal (result , np .array (expected , dtype = exp_dtype ))
191
306
192
307
193
308
@pytest .mark .parametrize ("errors,checker" , [
0 commit comments