Skip to content

CLN GH23123 Move SparseArray to arrays #23147

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Oct 16, 2018
2 changes: 1 addition & 1 deletion pandas/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
import pandas.core.config_init

from pandas.core.api import *
from pandas.core.sparse.api import *
from pandas.core.arrays.sparse.api import *
from pandas.tseries.api import *
from pandas.core.computation.api import *
from pandas.core.reshape.api import *
Expand Down
2 changes: 1 addition & 1 deletion pandas/api/extensions/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
register_index_accessor,
register_series_accessor)
from pandas.core.algorithms import take # noqa
from pandas.core.arrays.base import (ExtensionArray, # noqa
from pandas.core.arrays import (ExtensionArray, # noqa
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, should have reverted this too :/ Oh well.

ExtensionScalarOpsMixin)
from pandas.core.dtypes.dtypes import ( # noqa
ExtensionDtype, register_extension_dtype
Expand Down
3 changes: 2 additions & 1 deletion pandas/compat/numpy/function.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
"""

from numpy import ndarray
from pandas.util._validators import (validate_args, validate_kwargs,
from pandas.util._validators import (validate_args,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is there a reason you are changing unrelated things? (even formatting)

validate_kwargs,
validate_args_and_kwargs)
from pandas.errors import UnsupportedFunctionCall
from pandas.core.dtypes.common import is_integer, is_bool
Expand Down
18 changes: 13 additions & 5 deletions pandas/compat/pickle_compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,14 @@ def load_reduce(self):
# If classes are moved, provide compat here.
_class_locations_map = {

# 23123, fix sparse mapping
('pandas.core.sparse.array', 'SparseArray'):
('pandas.core.arrays.sparse.series', 'SparseArray'),
('pandas.core.sparse.series', 'SparseSeries'):
('pandas.core.arrays.sparse.series', 'SparseSeries'),
('pandas.core.sparse.frame', 'SparseDataFrame'):
('pandas.core.arrays.sparse.frame', 'SparseDataFrame'),

# 15477
('pandas.core.base', 'FrozenNDArray'):
('pandas.core.indexes.frozen', 'FrozenNDArray'),
Expand All @@ -67,7 +75,7 @@ def load_reduce(self):
('pandas.core.series', 'TimeSeries'):
('pandas.core.series', 'Series'),
('pandas.sparse.series', 'SparseTimeSeries'):
('pandas.core.sparse.series', 'SparseSeries'),
('pandas.core.arrays.sparse.series', 'SparseSeries'),

# 12588, extensions moving
('pandas._sparse', 'BlockIndex'):
Expand All @@ -88,11 +96,11 @@ def load_reduce(self):

# 15998 top-level dirs moving
('pandas.sparse.array', 'SparseArray'):
('pandas.core.sparse.array', 'SparseArray'),
('pandas.core.arrays.sparse.array', 'SparseArray'),
('pandas.sparse.series', 'SparseSeries'):
('pandas.core.sparse.series', 'SparseSeries'),
('pandas.core.arrays.sparse.series', 'SparseSeries'),
('pandas.sparse.frame', 'SparseDataFrame'):
('pandas.core.sparse.frame', 'SparseDataFrame'),
('pandas.core.arrays.sparse.frame', 'SparseDataFrame'),
('pandas.indexes.base', '_new_Index'):
('pandas.core.indexes.base', '_new_Index'),
('pandas.indexes.base', 'Index'):
Expand All @@ -112,7 +120,7 @@ def load_reduce(self):

# 19269, arrays moving
('pandas.core.categorical', 'Categorical'):
('pandas.core.arrays', 'Categorical'),
('pandas.core.arrays.categorical', 'Categorical'),

# 19939, add timedeltaindex, float64index compat from 15998 move
('pandas.tseries.tdi', 'TimedeltaIndex'):
Expand Down
4 changes: 2 additions & 2 deletions pandas/core/arrays/datetimes.py
Original file line number Diff line number Diff line change
Expand Up @@ -523,7 +523,7 @@ def _add_delta(self, delta):
The result's name is set outside of _add_delta by the calling
method (__add__ or __sub__)
"""
from pandas.core.arrays.timedeltas import TimedeltaArrayMixin
from pandas.core.arrays import TimedeltaArrayMixin
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Were these changes here before mine? I may revert them.


if isinstance(delta, (Tick, timedelta, np.timedelta64)):
new_values = self._add_delta_td(delta)
Expand Down Expand Up @@ -818,7 +818,7 @@ def to_period(self, freq=None):
pandas.PeriodIndex: Immutable ndarray holding ordinal values
pandas.DatetimeIndex.to_pydatetime: Return DatetimeIndex as object
"""
from pandas.core.arrays.period import PeriodArrayMixin
from pandas.core.arrays import PeriodArrayMixin

if self.tz is not None:
warnings.warn("Converting to PeriodArray/Index representation "
Expand Down
3 changes: 2 additions & 1 deletion pandas/core/arrays/integer.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
is_integer_dtype,
is_object_dtype,
is_list_like)
from pandas.core.arrays import ExtensionArray, ExtensionOpsMixin
from pandas.core.arrays import (ExtensionArray,
ExtensionOpsMixin)
from pandas.core.dtypes.base import ExtensionDtype
from pandas.core.dtypes.dtypes import register_extension_dtype
from pandas.core.dtypes.missing import isna, notna
Expand Down
2 changes: 1 addition & 1 deletion pandas/core/arrays/interval.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
from pandas.util._decorators import Appender
from pandas.util._doctools import _WritableDoc

from . import ExtensionArray, Categorical
from pandas.core.arrays import ExtensionArray, Categorical

_VALID_CLOSED = {'left', 'right', 'both', 'neither'}
_interval_shared_docs = {}
Expand Down
2 changes: 1 addition & 1 deletion pandas/core/arrays/period.py
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ def to_timestamp(self, freq=None, how='start'):
-------
DatetimeArray/Index
"""
from pandas.core.arrays.datetimes import DatetimeArrayMixin
from pandas.core.arrays import DatetimeArrayMixin

how = libperiod._validate_end_alias(how)

Expand Down
File renamed without changes.
6 changes: 6 additions & 0 deletions pandas/core/arrays/sparse/api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# pylint: disable=W0611
# flake8: noqa
from pandas.core.arrays.sparse.array import SparseArray
from pandas.core.arrays.sparse.series import SparseSeries
from pandas.core.arrays.sparse.frame import SparseDataFrame
from pandas.core.arrays.sparse.dtype import SparseDtype
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from pandas.errors import PerformanceWarning
from pandas.compat.numpy import function as nv

from pandas.core.arrays.base import ExtensionArray, ExtensionOpsMixin
from pandas.core.arrays import ExtensionArray, ExtensionOpsMixin
import pandas.core.common as com
from pandas.core.dtypes.generic import (
ABCSparseSeries, ABCSeries, ABCIndexClass
Expand Down Expand Up @@ -45,7 +45,7 @@
import pandas.core.algorithms as algos
import pandas.io.formats.printing as printing

from pandas.core.sparse.dtype import SparseDtype
from pandas.core.arrays.sparse.dtype import SparseDtype


_sparray_doc_kwargs = dict(klass='SparseArray')
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
from pandas.core.internals import (BlockManager,
create_block_manager_from_arrays)
import pandas.core.generic as generic
from pandas.core.sparse.series import SparseSeries, SparseArray
from pandas.core.sparse.dtype import SparseDtype
from pandas.core.arrays.sparse.series import SparseSeries, SparseArray
from pandas.core.arrays.sparse.dtype import SparseDtype
from pandas._libs.sparse import BlockIndex, get_blocks
from pandas.util._decorators import Appender
import pandas.core.ops as ops
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@
import pandas._libs.index as libindex
from pandas.util._decorators import Appender, Substitution

from pandas.core.sparse.array import (
from pandas.core.arrays.sparse.array import (
SparseArray,
)
from pandas._libs.sparse import BlockIndex, IntIndex
import pandas._libs.sparse as splib

from pandas.core.sparse.scipy_sparse import (
from pandas.core.arrays.sparse.scipy_sparse import (
_sparse_series_to_coo,
_coo_to_sparse_series)

Expand Down Expand Up @@ -205,7 +205,7 @@ def _constructor(self):

@property
def _constructor_expanddim(self):
from pandas.core.sparse.api import SparseDataFrame
from pandas.core.arrays.sparse.api import SparseDataFrame
return SparseDataFrame

@property
Expand Down
16 changes: 8 additions & 8 deletions pandas/core/dtypes/common.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
""" common type operations """

import numpy as np
from pandas.compat import (string_types, text_type, binary_type,
PY3, PY36)
Expand All @@ -12,7 +11,6 @@
PeriodDtype, IntervalDtype,
PandasExtensionDtype, ExtensionDtype,
_pandas_registry)
from pandas.core.sparse.dtype import SparseDtype
from pandas.core.dtypes.generic import (
ABCCategorical, ABCPeriodIndex, ABCDatetimeIndex, ABCSeries,
ABCSparseArray, ABCSparseSeries, ABCCategoricalIndex, ABCIndexClass,
Expand All @@ -23,7 +21,6 @@
is_file_like, is_re, is_re_compilable, is_sequence, is_nested_list_like,
is_named_tuple, is_array_like, is_decimal, is_complex, is_interval)


_POSSIBLY_CAST_DTYPES = {np.dtype(t).name
for t in ['O', 'int8', 'uint8', 'int16', 'uint16',
'int32', 'uint32', 'int64', 'uint64']}
Expand Down Expand Up @@ -181,7 +178,7 @@ def is_sparse(arr):
>>> is_sparse(bsr_matrix([1, 2, 3]))
False
"""
from pandas.core.sparse.dtype import SparseDtype
from pandas.core.arrays.sparse.dtype import SparseDtype

dtype = getattr(arr, 'dtype', arr)
return isinstance(dtype, SparseDtype)
Expand Down Expand Up @@ -1928,10 +1925,13 @@ def _get_dtype_type(arr_or_dtype):
elif is_interval_dtype(arr_or_dtype):
return Interval
return _get_dtype_type(np.dtype(arr_or_dtype))
elif isinstance(arr_or_dtype, (ABCSparseSeries, ABCSparseArray,
SparseDtype)):
dtype = getattr(arr_or_dtype, 'dtype', arr_or_dtype)
return dtype.type
else:
from pandas.core.arrays.sparse.dtype import SparseDtype
if isinstance(arr_or_dtype, (ABCSparseSeries,
ABCSparseArray,
SparseDtype)):
dtype = getattr(arr_or_dtype, 'dtype', arr_or_dtype)
return dtype.type
try:
return arr_or_dtype.dtype.type
except AttributeError:
Expand Down
10 changes: 5 additions & 5 deletions pandas/core/dtypes/concat.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,15 +76,15 @@ def _get_series_result_type(result, objs=None):
if isinstance(result, dict):
# concat Series with axis 1
if all(is_sparse(c) for c in compat.itervalues(result)):
from pandas.core.sparse.api import SparseDataFrame
from pandas.core.arrays.sparse.api import SparseDataFrame
return SparseDataFrame
else:
from pandas.core.frame import DataFrame
return DataFrame

# otherwise it is a SingleBlockManager (axis = 0)
if result._block.is_sparse:
from pandas.core.sparse.api import SparseSeries
from pandas.core.arrays.sparse.api import SparseSeries
return SparseSeries
else:
return objs[0]._constructor
Expand All @@ -100,7 +100,7 @@ def _get_frame_result_type(result, objs):
if (result.blocks and (
all(is_sparse(b) for b in result.blocks) or
all(isinstance(obj, ABCSparseDataFrame) for obj in objs))):
from pandas.core.sparse.api import SparseDataFrame
from pandas.core.arrays.sparse.api import SparseDataFrame
return SparseDataFrame
else:
return next(obj for obj in objs if not isinstance(obj,
Expand All @@ -123,7 +123,7 @@ def _get_sliced_frame_result_type(data, obj):
Series or SparseSeries
"""
if is_sparse(data):
from pandas.core.sparse.api import SparseSeries
from pandas.core.arrays.sparse.api import SparseSeries
return SparseSeries
return obj._constructor_sliced

Expand Down Expand Up @@ -556,7 +556,7 @@ def _concat_sparse(to_concat, axis=0, typs=None):
a single array, preserving the combined dtypes
"""

from pandas.core.sparse.array import SparseArray
from pandas.core.arrays.sparse.array import SparseArray

fill_values = [x.fill_value for x in to_concat
if isinstance(x, SparseArray)]
Expand Down
4 changes: 2 additions & 2 deletions pandas/core/frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -1761,9 +1761,9 @@ def to_sparse(self, fill_value=None, kind='block'):
1 1.0 NaN
2 NaN 1.0
>>> type(sdf)
<class 'pandas.core.sparse.frame.SparseDataFrame'>
<class 'pandas.core.arrays.sparse.frame.SparseDataFrame'>
"""
from pandas.core.sparse.frame import SparseDataFrame
from pandas.core.arrays.sparse.frame import SparseDataFrame
return SparseDataFrame(self._series, index=self.index,
columns=self.columns, default_kind=kind,
default_fill_value=fill_value)
Expand Down
2 changes: 1 addition & 1 deletion pandas/core/groupby/generic.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
from pandas.core.dtypes.cast import maybe_downcast_to_dtype
from pandas.core.base import SpecificationError, DataError
from pandas.core.index import Index, MultiIndex, CategoricalIndex
from pandas.core.arrays.categorical import Categorical
from pandas.core.arrays import Categorical
from pandas.core.internals import BlockManager, make_block
from pandas.compat.numpy import _np_version_under1p13

Expand Down
2 changes: 1 addition & 1 deletion pandas/core/internals/managers.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

from pandas.core.base import PandasObject
import pandas.core.algorithms as algos
from pandas.core.sparse.array import _maybe_to_sparse
from pandas.core.arrays.sparse.array import _maybe_to_sparse

from pandas.core.index import Index, MultiIndex, ensure_index
from pandas.core.indexing import maybe_convert_indices
Expand Down
6 changes: 3 additions & 3 deletions pandas/core/ops.py
Original file line number Diff line number Diff line change
Expand Up @@ -2066,7 +2066,7 @@ def _cast_sparse_series_op(left, right, opname):
left : SparseArray
right : SparseArray
"""
from pandas.core.sparse.api import SparseDtype
from pandas.core.arrays.sparse.api import SparseDtype

opname = opname.strip('_')

Expand Down Expand Up @@ -2116,7 +2116,7 @@ def _sparse_series_op(left, right, op, name):
new_index = left.index
new_name = get_op_result_name(left, right)

from pandas.core.sparse.array import _sparse_array_op
from pandas.core.arrays.sparse.array import _sparse_array_op
lvalues, rvalues = _cast_sparse_series_op(left.values, right.values, name)
result = _sparse_array_op(lvalues, rvalues, op, name)
return left._constructor(result, index=new_index, name=new_name)
Expand All @@ -2130,7 +2130,7 @@ def _arith_method_SPARSE_ARRAY(cls, op, special):
op_name = _get_op_name(op, special)

def wrapper(self, other):
from pandas.core.sparse.array import (
from pandas.core.arrays.sparse.array import (
SparseArray, _sparse_array_op, _wrap_result, _get_fill)
if isinstance(other, np.ndarray):
if len(self) != len(other):
Expand Down
4 changes: 2 additions & 2 deletions pandas/core/reshape/reshape.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@
from pandas.core.series import Series
from pandas.core.frame import DataFrame

from pandas.core.sparse.api import SparseDataFrame, SparseSeries
from pandas.core.sparse.array import SparseArray
from pandas.core.arrays.sparse.api import SparseDataFrame, SparseSeries
from pandas.core.arrays.sparse.array import SparseArray
from pandas._libs.sparse import IntIndex

from pandas.core.arrays import Categorical
Expand Down
6 changes: 3 additions & 3 deletions pandas/core/series.py
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ def from_array(cls, arr, index=None, name=None, dtype=None, copy=False,
"future version. Please use the pd.Series(..) "
"constructor instead.", FutureWarning, stacklevel=2)
if isinstance(arr, ABCSparseArray):
from pandas.core.sparse.series import SparseSeries
from pandas.core.arrays.sparse.series import SparseSeries
cls = SparseSeries
return cls(arr, index=index, name=name, dtype=dtype,
copy=copy, fastpath=fastpath)
Expand Down Expand Up @@ -1383,8 +1383,8 @@ def to_sparse(self, kind='block', fill_value=None):
sp : SparseSeries
"""
# TODO: deprecate
from pandas.core.sparse.series import SparseSeries
from pandas.core.sparse.array import SparseArray
from pandas.core.arrays.sparse.series import SparseSeries
from pandas.core.arrays.sparse.array import SparseArray

values = SparseArray(self, kind=kind, fill_value=fill_value)
return SparseSeries(
Expand Down
6 changes: 0 additions & 6 deletions pandas/core/sparse/api.py

This file was deleted.

1 change: 0 additions & 1 deletion pandas/core/util/hashing.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
data hash pandas / numpy objects
"""
import itertools

import numpy as np
from pandas._libs import hashing, tslibs
from pandas.core.dtypes.generic import (
Expand Down
4 changes: 2 additions & 2 deletions pandas/io/packers.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@
from pandas.core.arrays import IntervalArray
from pandas.core.generic import NDFrame
from pandas.core.internals import BlockManager, make_block, _safe_reshape
from pandas.core.sparse.api import SparseSeries, SparseDataFrame
from pandas.core.sparse.array import BlockIndex, IntIndex
from pandas.core.arrays.sparse.api import SparseSeries, SparseDataFrame
from pandas.core.arrays.sparse.array import BlockIndex, IntIndex
from pandas.io.common import get_filepath_or_buffer, _stringify_path
from pandas.io.msgpack import Unpacker as _Unpacker, Packer as _Packer, ExtType

Expand Down
2 changes: 1 addition & 1 deletion pandas/io/pytables.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
from pandas.core.internals import (BlockManager, make_block,
_block2d_to_blocknd,
_factor_indexer, _block_shape)
from pandas.core.sparse.array import BlockIndex, IntIndex
from pandas.core.arrays.sparse.array import BlockIndex, IntIndex

from pandas.io.common import _stringify_path
from pandas.io.formats.printing import adjoin, pprint_thing
Expand Down
File renamed without changes.
File renamed without changes.
Loading