diff --git a/pandas/compat/__init__.py b/pandas/compat/__init__.py index 115ea96406e51..c37dae4ae3194 100644 --- a/pandas/compat/__init__.py +++ b/pandas/compat/__init__.py @@ -19,10 +19,7 @@ # flake8: noqa import re -import functools -import itertools from distutils.version import LooseVersion -from itertools import product import sys import platform import types @@ -37,16 +34,26 @@ PY37 = sys.version_info >= (3, 7) PYPY = platform.python_implementation() == 'PyPy' -try: - import __builtin__ as builtins - import httplib -except ImportError: - import builtins - import http.client as httplib - from pandas.compat.chainmap import DeepChainMap +# list-producing versions of the major Python iterating functions +def lrange(*args, **kwargs): + return list(range(*args, **kwargs)) + + +def lzip(*args, **kwargs): + return list(zip(*args, **kwargs)) + + +def lmap(*args, **kwargs): + return list(map(*args, **kwargs)) + + +def lfilter(*args, **kwargs): + return list(filter(*args, **kwargs)) + + if PY3: def isidentifier(s): return s.isidentifier() @@ -83,19 +90,6 @@ def signature(f): argspec = namedtuple('Signature', ['args', 'defaults', 'varargs', 'keywords']) return argspec(args, defaults, varargs, keywords) - - # list-producing versions of the major Python iterating functions - def lrange(*args, **kwargs): - return list(range(*args, **kwargs)) - - def lzip(*args, **kwargs): - return list(zip(*args, **kwargs)) - - def lmap(*args, **kwargs): - return list(map(*args, **kwargs)) - - def lfilter(*args, **kwargs): - return list(filter(*args, **kwargs)) else: # Python 2 _name_re = re.compile(r"[a-zA-Z_][a-zA-Z0-9_]*$") @@ -112,12 +106,6 @@ def bytes_to_str(b, encoding='ascii'): def signature(f): return inspect.getargspec(f) - # Python 2-builtin ranges produce lists - lrange = builtins.range - lzip = builtins.zip - lmap = builtins.map - lfilter = builtins.filter - if PY2: def iteritems(obj, **kw): return obj.iteritems(**kw) diff --git a/pandas/core/base.py b/pandas/core/base.py index 684371ba8b494..9a0a4e3e9ca03 100644 --- a/pandas/core/base.py +++ b/pandas/core/base.py @@ -1,6 +1,7 @@ """ Base and utility classes for pandas objects. """ +import builtins from collections import OrderedDict import textwrap import warnings @@ -9,7 +10,7 @@ import pandas._libs.lib as lib import pandas.compat as compat -from pandas.compat import PYPY, builtins +from pandas.compat import PYPY from pandas.compat.numpy import function as nv from pandas.errors import AbstractMethodError from pandas.util._decorators import Appender, Substitution, cache_readonly diff --git a/pandas/core/reshape/util.py b/pandas/core/reshape/util.py index 9d4135a7f310e..9975fe65ac0fe 100644 --- a/pandas/core/reshape/util.py +++ b/pandas/core/reshape/util.py @@ -7,7 +7,7 @@ def cartesian_product(X): """ - Numpy version of itertools.product or pandas.compat.product. + Numpy version of itertools.product. Sometimes faster (for large inputs)... Parameters @@ -28,7 +28,6 @@ def cartesian_product(X): -------- itertools.product : Cartesian product of input iterables. Equivalent to nested for-loops. - pandas.compat.product : An alias for itertools.product. """ msg = "Input must be a list-like of list-likes" if not is_list_like(X): diff --git a/pandas/tests/frame/test_timeseries.py b/pandas/tests/frame/test_timeseries.py index fcf1cc013ee25..f1b52dfb383ca 100644 --- a/pandas/tests/frame/test_timeseries.py +++ b/pandas/tests/frame/test_timeseries.py @@ -1,13 +1,12 @@ # -*- coding: utf-8 -*- from datetime import datetime, time +from itertools import product import numpy as np import pytest import pytz -from pandas.compat import product - import pandas as pd from pandas import ( DataFrame, DatetimeIndex, Index, MultiIndex, Series, Timestamp, date_range, diff --git a/pandas/tests/groupby/test_counting.py b/pandas/tests/groupby/test_counting.py index 7de4be710d8b2..af3051f5eb266 100644 --- a/pandas/tests/groupby/test_counting.py +++ b/pandas/tests/groupby/test_counting.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- +from itertools import product + import numpy as np import pytest -from pandas.compat import product as cart_product - from pandas import DataFrame, MultiIndex, Period, Series, Timedelta, Timestamp from pandas.util.testing import assert_frame_equal, assert_series_equal @@ -167,7 +167,7 @@ def test_ngroup_matches_cumcount(self): def test_ngroup_cumcount_pair(self): # brute force comparison for all small series - for p in cart_product(range(3), repeat=4): + for p in product(range(3), repeat=4): df = DataFrame({'a': p}) g = df.groupby(['a']) diff --git a/pandas/tests/groupby/test_function.py b/pandas/tests/groupby/test_function.py index 1bfe0c811d4a6..0d1575a35a0bc 100644 --- a/pandas/tests/groupby/test_function.py +++ b/pandas/tests/groupby/test_function.py @@ -1,10 +1,11 @@ +import builtins from io import StringIO +from itertools import product from string import ascii_lowercase import numpy as np import pytest -from pandas.compat import product as cart_product from pandas.errors import UnsupportedFunctionCall import pandas as pd @@ -27,7 +28,7 @@ def test_groupby_bool_aggs(agg_func, skipna, vals): df = DataFrame({'key': ['a'] * 3 + ['b'] * 3, 'val': vals * 2}) # Figure out expectation using Python builtin - exp = getattr(compat.builtins, agg_func)(vals) + exp = getattr(builtins, agg_func)(vals) # edge case for missing data with skipna and 'any' if skipna and all(isna(vals)) and agg_func == 'any': @@ -62,8 +63,8 @@ def test_intercept_builtin_sum(): s = Series([1., 2., np.nan, 3.]) grouped = s.groupby([0, 1, 2, 2]) - result = grouped.agg(compat.builtins.sum) - result2 = grouped.apply(compat.builtins.sum) + result = grouped.agg(builtins.sum) + result2 = grouped.apply(builtins.sum) expected = grouped.sum() tm.assert_series_equal(result, expected) tm.assert_series_equal(result2, expected) @@ -1078,7 +1079,7 @@ def test_size(df): assert result[key] == len(group) df = DataFrame(np.random.choice(20, (1000, 3)), columns=list('abc')) - for sort, key in cart_product((False, True), ('a', 'b', ['a', 'b'])): + for sort, key in product((False, True), ('a', 'b', ['a', 'b'])): left = df.groupby(key, sort=sort).size() right = df.groupby(key, sort=sort)['c'].apply(lambda a: a.shape[0]) tm.assert_series_equal(left, right, check_names=False) diff --git a/pandas/tests/indexing/multiindex/test_xs.py b/pandas/tests/indexing/multiindex/test_xs.py index fb6d763cfcf58..c9fc45f9b603c 100644 --- a/pandas/tests/indexing/multiindex/test_xs.py +++ b/pandas/tests/indexing/multiindex/test_xs.py @@ -1,7 +1,9 @@ +from itertools import product + import numpy as np import pytest -from pandas.compat import lrange, product as cart_product +from pandas.compat import lrange from pandas import DataFrame, Index, MultiIndex, Series, concat, date_range import pandas.core.common as com @@ -151,7 +153,7 @@ def test_xs_integer_key(): dates = lrange(20111201, 20111205) ids = 'abcde' index = MultiIndex.from_tuples( - [x for x in cart_product(dates, ids)], + [x for x in product(dates, ids)], names=['date', 'secid']) df = DataFrame( np.random.randn(len(index), 3), index, ['X', 'Y', 'Z']) diff --git a/pandas/tests/reshape/test_pivot.py b/pandas/tests/reshape/test_pivot.py index 1e77cbbb17ab2..24475cc0c8fb3 100644 --- a/pandas/tests/reshape/test_pivot.py +++ b/pandas/tests/reshape/test_pivot.py @@ -2,12 +2,11 @@ from collections import OrderedDict from datetime import date, datetime, timedelta +from itertools import product import numpy as np import pytest -from pandas.compat import product - import pandas as pd from pandas import ( Categorical, DataFrame, Grouper, Index, MultiIndex, Series, concat, diff --git a/pandas/tests/series/test_rank.py b/pandas/tests/series/test_rank.py index 31885077f53c1..d15320cee644f 100644 --- a/pandas/tests/series/test_rank.py +++ b/pandas/tests/series/test_rank.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -from itertools import chain +from itertools import chain, product import numpy as np from numpy import nan @@ -8,7 +8,6 @@ from pandas._libs.algos import Infinity, NegInfinity from pandas._libs.tslib import iNaT import pandas.compat as compat -from pandas.compat import product import pandas.util._test_decorators as td from pandas import NaT, Series, Timestamp, date_range diff --git a/pandas/tests/series/test_timeseries.py b/pandas/tests/series/test_timeseries.py index 02186a5bb5bd4..3a82339375699 100644 --- a/pandas/tests/series/test_timeseries.py +++ b/pandas/tests/series/test_timeseries.py @@ -3,13 +3,14 @@ from datetime import datetime, time, timedelta from io import StringIO +from itertools import product import numpy as np import pytest from pandas._libs.tslib import iNaT from pandas._libs.tslibs.np_datetime import OutOfBoundsDatetime -from pandas.compat import lrange, product +from pandas.compat import lrange from pandas.errors import NullFrequencyError import pandas.util._test_decorators as td diff --git a/pandas/tests/test_compat.py b/pandas/tests/test_compat.py index c33d62dd87be7..0fa9fcd8aae9c 100644 --- a/pandas/tests/test_compat.py +++ b/pandas/tests/test_compat.py @@ -2,12 +2,11 @@ """ Testing that functions from compat work as expected """ - +import builtins import re from pandas.compat import ( - builtins, iteritems, iterkeys, itervalues, lfilter, lmap, lrange, lzip, - re_type) + iteritems, iterkeys, itervalues, lfilter, lmap, lrange, lzip, re_type) class TestBuiltinIterators(object): diff --git a/pandas/tests/test_multilevel.py b/pandas/tests/test_multilevel.py index 3157d800a649c..992c743849fbb 100644 --- a/pandas/tests/test_multilevel.py +++ b/pandas/tests/test_multilevel.py @@ -3,6 +3,7 @@ import datetime from io import StringIO import itertools +from itertools import product from warnings import catch_warnings, simplefilter import numpy as np @@ -10,7 +11,7 @@ import pytest import pytz -from pandas.compat import lrange, lzip, product as cart_product +from pandas.compat import lrange, lzip from pandas.core.dtypes.common import is_float_dtype, is_integer_dtype @@ -238,7 +239,7 @@ def test_repr_name_coincide(self): def test_delevel_infer_dtype(self): tuples = [tuple - for tuple in cart_product( + for tuple in product( ['foo', 'bar'], [10, 20], [1.0, 1.1])] index = MultiIndex.from_tuples(tuples, names=['prm0', 'prm1', 'prm2']) df = DataFrame(np.random.randn(8, 3), columns=['A', 'B', 'C'], diff --git a/pandas/util/testing.py b/pandas/util/testing.py index 633142829dc1b..3640717d752fb 100644 --- a/pandas/util/testing.py +++ b/pandas/util/testing.py @@ -4,6 +4,7 @@ from datetime import datetime from functools import wraps import gzip +import http.client import lzma import os import re @@ -22,7 +23,7 @@ from pandas._libs import testing as _testing import pandas.compat as compat -from pandas.compat import httplib, lmap, lrange, lzip, raise_with_traceback +from pandas.compat import lmap, lrange, lzip, raise_with_traceback from pandas.core.dtypes.common import ( is_bool, is_categorical_dtype, is_datetime64_dtype, is_datetime64tz_dtype, @@ -2047,7 +2048,7 @@ def dec(f): # servers. # and conditionally raise on these exception types -_network_error_classes = (IOError, httplib.HTTPException, TimeoutError) +_network_error_classes = (IOError, http.client.HTTPException, TimeoutError) def can_connect(url, error_classes=_network_error_classes):