From b4f10b797e6d37e206c5ed9f43442b8284bac54f Mon Sep 17 00:00:00 2001 From: Matt Roeschke Date: Wed, 3 Apr 2019 13:53:02 -0700 Subject: [PATCH 1/4] CLN: Builtins --- pandas/compat/__init__.py | 10 ++++------ pandas/core/base.py | 3 ++- pandas/tests/groupby/test_function.py | 7 ++++--- pandas/tests/test_compat.py | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pandas/compat/__init__.py b/pandas/compat/__init__.py index 115ea96406e51..4773af048f9cd 100644 --- a/pandas/compat/__init__.py +++ b/pandas/compat/__init__.py @@ -38,10 +38,8 @@ 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 @@ -113,10 +111,10 @@ 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 + lrange = lambda x: list(range(x)) + lzip = lambda x: list(zip(x)) + lmap = lambda x: list(map(x)) + lfilter = lambda x: list(filter(x)) if PY2: def iteritems(obj, **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/tests/groupby/test_function.py b/pandas/tests/groupby/test_function.py index 1bfe0c811d4a6..141cee02cb87f 100644 --- a/pandas/tests/groupby/test_function.py +++ b/pandas/tests/groupby/test_function.py @@ -1,3 +1,4 @@ +import builtins from io import StringIO from string import ascii_lowercase @@ -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) diff --git a/pandas/tests/test_compat.py b/pandas/tests/test_compat.py index c33d62dd87be7..65cbaf459b564 100644 --- a/pandas/tests/test_compat.py +++ b/pandas/tests/test_compat.py @@ -2,11 +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, + iteritems, iterkeys, itervalues, lfilter, lmap, lrange, lzip, re_type) From f7f6d1df0f452b93c9ef1271d8cf9a9351e426f6 Mon Sep 17 00:00:00 2001 From: Matt Roeschke Date: Wed, 3 Apr 2019 14:38:57 -0700 Subject: [PATCH 2/4] clean httplib, pandas.compat.product --- pandas/compat/__init__.py | 44 ++++++++------------- pandas/core/reshape/util.py | 3 +- pandas/tests/groupby/test_counting.py | 6 +-- pandas/tests/groupby/test_function.py | 4 +- pandas/tests/indexing/multiindex/test_xs.py | 6 ++- pandas/tests/test_compat.py | 3 +- pandas/tests/test_multilevel.py | 5 ++- pandas/util/testing.py | 5 ++- 8 files changed, 34 insertions(+), 42 deletions(-) diff --git a/pandas/compat/__init__.py b/pandas/compat/__init__.py index 4773af048f9cd..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,14 +34,26 @@ PY37 = sys.version_info >= (3, 7) PYPY = platform.python_implementation() == 'PyPy' -try: - import httplib -except ImportError: - 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() @@ -81,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_]*$") @@ -110,12 +106,6 @@ def bytes_to_str(b, encoding='ascii'): def signature(f): return inspect.getargspec(f) - # Python 2-builtin ranges produce lists - lrange = lambda x: list(range(x)) - lzip = lambda x: list(zip(x)) - lmap = lambda x: list(map(x)) - lfilter = lambda x: list(filter(x)) - if PY2: def iteritems(obj, **kw): return obj.iteritems(**kw) 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/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 141cee02cb87f..0d1575a35a0bc 100644 --- a/pandas/tests/groupby/test_function.py +++ b/pandas/tests/groupby/test_function.py @@ -1,11 +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 @@ -1079,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/test_compat.py b/pandas/tests/test_compat.py index 65cbaf459b564..0fa9fcd8aae9c 100644 --- a/pandas/tests/test_compat.py +++ b/pandas/tests/test_compat.py @@ -6,8 +6,7 @@ import re from pandas.compat import ( - 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): From b2cc71742a4f68f008c7e092debe2cf2a9bed7e1 Mon Sep 17 00:00:00 2001 From: Matt Roeschke Date: Wed, 3 Apr 2019 16:10:23 -0700 Subject: [PATCH 3/4] Remove more product compat imports --- pandas/tests/frame/test_timeseries.py | 3 +-- pandas/tests/reshape/test_pivot.py | 3 +-- pandas/tests/series/test_rank.py | 3 +-- pandas/tests/series/test_timeseries.py | 2 +- 4 files changed, 4 insertions(+), 7 deletions(-) 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/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..e368288810eb1 100644 --- a/pandas/tests/series/test_timeseries.py +++ b/pandas/tests/series/test_timeseries.py @@ -9,7 +9,7 @@ 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 From 90433febd52647ce56140c41b5377d4071c0fafb Mon Sep 17 00:00:00 2001 From: Matt Roeschke Date: Wed, 3 Apr 2019 17:39:52 -0700 Subject: [PATCH 4/4] Add missing import --- pandas/tests/series/test_timeseries.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pandas/tests/series/test_timeseries.py b/pandas/tests/series/test_timeseries.py index e368288810eb1..3a82339375699 100644 --- a/pandas/tests/series/test_timeseries.py +++ b/pandas/tests/series/test_timeseries.py @@ -3,6 +3,7 @@ from datetime import datetime, time, timedelta from io import StringIO +from itertools import product import numpy as np import pytest