Skip to content

Commit 497b2f7

Browse files
Always unwrap factor values before use due to unfortunate interactions with numpy arrays. (#241)
1 parent 8552610 commit 497b2f7

File tree

2 files changed

+11
-6
lines changed

2 files changed

+11
-6
lines changed

formulaic/materializers/types/factor_values.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@
1313
Union,
1414
)
1515

16-
try:
17-
from typing import SupportsIndex
18-
except ImportError: # pragma: no cover
19-
from typing_extensions import SupportsIndex
20-
2116
import wrapt
2217

2318
from formulaic.parser.types import Factor
2419
from formulaic.utils.sentinels import MISSING, MissingType
2520

21+
try:
22+
from typing import SupportsIndex
23+
except ImportError: # pragma: no cover
24+
from typing_extensions import SupportsIndex
25+
2626
if TYPE_CHECKING: # pragma: no cover
2727
from formulaic.model_spec import ModelSpec
2828

formulaic/transforms/contrasts.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ def encoder(
6969
encoder_state: dict[str, Any],
7070
model_spec: ModelSpec,
7171
) -> FactorValues:
72-
values = pandas.Series(values)
72+
# wrapped numpy arrays are problematic
73+
values = pandas.Series(
74+
values.__wrapped__ if isinstance(values, FactorValues) else values
75+
)
7376
values = values.drop(index=values.index[drop_rows])
7477
return encode_contrasts(
7578
values,
@@ -129,6 +132,8 @@ def encode_contrasts( # pylint: disable=dangerous-default-value # always repla
129132
levels = (
130133
levels if levels is not None else _state.get("categories")
131134
) # TODO: Is this too early to provide useful feedback to users?
135+
if isinstance(data, FactorValues): # wrapped numpy arrays are problematic
136+
data = data.__wrapped__
132137

133138
if contrasts is None:
134139
contrasts = TreatmentContrasts()

0 commit comments

Comments
 (0)