Skip to content

Commit

Permalink
Fix error in cudf.to_numeric when a bool input is passed (#10431)
Browse files Browse the repository at this point in the history
Fixes: #10049 

This PR fixes an incorrect error being displayed when `cudf.to_numeric` is called by passing an input with `bool` dtype. Technically `bool` is the lowest `dtype` size possible in `numpy` so this is a no-op because `to_numeric` is aimed at downcasting inputs.

Authors:
  - GALI PREM SAGAR (https://github.com/galipremsagar)

Approvers:
  - Vyas Ramasubramani (https://github.com/vyasr)

URL: #10431
  • Loading branch information
galipremsagar authored Mar 15, 2022
1 parent 4596244 commit deb39db
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 12 deletions.
22 changes: 11 additions & 11 deletions python/cudf/cudf/core/tools/numeric.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright (c) 2018-2020, NVIDIA CORPORATION.
# Copyright (c) 2018-2022, NVIDIA CORPORATION.

import warnings

Expand Down Expand Up @@ -144,16 +144,16 @@ def to_numeric(arg, errors="raise", downcast=None):
col = col.as_numerical_column("d")

if downcast:
downcast_type_map = {
"integer": list(np.typecodes["Integer"]),
"signed": list(np.typecodes["Integer"]),
"unsigned": list(np.typecodes["UnsignedInteger"]),
}
float_types = list(np.typecodes["Float"])
idx = float_types.index(cudf.dtype(np.float32).char)
downcast_type_map["float"] = float_types[idx:]

type_set = downcast_type_map[downcast]
if downcast == "float":
# we support only float32 & float64
type_set = [
cudf.dtype(np.float32).char,
cudf.dtype(np.float64).char,
]
elif downcast in ("integer", "signed"):
type_set = list(np.typecodes["Integer"])
elif downcast == "unsigned":
type_set = list(np.typecodes["UnsignedInteger"])

for t in type_set:
downcast_dtype = cudf.dtype(t)
Expand Down
18 changes: 17 additions & 1 deletion python/cudf/cudf/tests/test_numerical.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright (c) 2021, NVIDIA CORPORATION.
# Copyright (c) 2021-2022, NVIDIA CORPORATION.

import numpy as np
import pandas as pd
Expand Down Expand Up @@ -397,3 +397,19 @@ def test_series_construction_with_nulls(dtype, input_obj):
expect = pd.Series(np_data, dtype=np_dtypes_to_pandas_dtypes[dtype])
got = cudf.Series(np_data, dtype=dtype).to_pandas(nullable=True)
assert_eq(expect, got)


@pytest.mark.parametrize(
"data", [[True, False, True]],
)
@pytest.mark.parametrize(
"downcast", ["signed", "integer", "unsigned", "float"]
)
def test_series_to_numeric_bool(data, downcast):
ps = pd.Series(data)
gs = cudf.from_pandas(ps)

expect = pd.to_numeric(ps, downcast=downcast)
got = cudf.to_numeric(gs, downcast=downcast)

assert_eq(expect, got)

0 comments on commit deb39db

Please sign in to comment.