Skip to content

Commit 48d4eee

Browse files
committed
prevent the pandas.Categorical support breaking support for older versions of pandas
1 parent f9e8b20 commit 48d4eee

4 files changed

Lines changed: 16 additions & 7 deletions

File tree

patsy/build.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
from patsy import PatsyError
1313
from patsy.categorical import CategoricalTransform, Categorical
1414
from patsy.util import (atleast_2d_column_default,
15-
have_pandas, asarray_or_pandas)
15+
have_pandas, have_pandas_categorical,
16+
asarray_or_pandas)
1617
from patsy.design_info import DesignMatrix, DesignInfo
1718
from patsy.redundancy import pick_contrasts_for_term
1819
from patsy.desc import ModelDesc
@@ -441,7 +442,8 @@ def _examine_factor_types(factors, factor_states, data_iter_maker):
441442
break
442443
for factor in list(examine_needed):
443444
value = factor.eval(factor_states[factor], data)
444-
if have_pandas and isinstance(value, pandas.Categorical):
445+
if (have_pandas_categorical
446+
and isinstance(value, pandas.Categorical)):
445447
value = Categorical.from_pandas_categorical(value)
446448
# fall through into the next 'if':
447449
if isinstance(value, Categorical):

patsy/categorical.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
from patsy import PatsyError
1010
from patsy.state import stateful_transform
1111
from patsy.util import (SortAnythingKey,
12-
have_pandas, asarray_or_pandas,
12+
have_pandas, have_pandas_categorical,
13+
asarray_or_pandas,
1314
pandas_friendly_reshape)
1415

1516
if have_pandas:
@@ -214,7 +215,7 @@ def memorize_finish(self):
214215

215216
def transform(self, data, contrast=None, levels=None):
216217
kwargs = {"contrast": contrast}
217-
if have_pandas and isinstance(data, pandas.Categorical):
218+
if have_pandas_categorical and isinstance(data, pandas.Categorical):
218219
data = Categorical.from_pandas_categorical(data)
219220
# fall through to the next 'if':
220221
if isinstance(data, Categorical):
@@ -295,7 +296,7 @@ def test_C_pandas():
295296
assert cat3.contrast == "asdf"
296297

297298
def test_categorical_from_pandas_categorical():
298-
if have_pandas:
299+
if have_pandas_categorical:
299300
pandas_categorical = pandas.Categorical.from_array(["a", "b", "a"])
300301
c = Categorical.from_pandas_categorical(pandas_categorical)
301302
assert np.array_equal(c.int_array, [0, 1, 0])

patsy/test_build.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
import numpy as np
1111
from nose.tools import assert_raises
1212
from patsy import PatsyError
13-
from patsy.util import atleast_2d_column_default, have_pandas
13+
from patsy.util import (atleast_2d_column_default,
14+
have_pandas, have_pandas_categorical)
1415
from patsy.compat import itertools_product
1516
from patsy.desc import Term, INTERCEPT, LookupFactor
1617
from patsy.build import *
@@ -437,7 +438,7 @@ def test_categorical():
437438
data_strings = {"a": ["a1", "a2", "a1"]}
438439
data_categ = {"a": C(["a2", "a1", "a2"])}
439440
datas = [data_strings, data_categ]
440-
if have_pandas:
441+
if have_pandas_categorical:
441442
data_pandas = {"a": pandas.Categorical.from_array(["a1", "a2", "a2"])}
442443
datas.append(data_pandas)
443444
def t(data1, data2):

patsy/util.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@
2222
else:
2323
have_pandas = True
2424

25+
# Pandas versions < 0.9.0 don't have Categorical
26+
# Can drop this guard whenever we drop support for such older versions of
27+
# pandas.
28+
have_pandas_categorical = (have_pandas and hasattr(pandas, "Categorical"))
29+
2530
# Passes through Series and DataFrames, call np.asarray() on everything else
2631
def asarray_or_pandas(a, copy=False, dtype=None, subok=False):
2732
if have_pandas:

0 commit comments

Comments
 (0)