10000 Switch dataframe constructor to use dispatch by saulshanabrook · Pull Request #32844 · pandas-dev/pandas · GitHub
[go: up one dir, main page]

Skip to content

Switch dataframe constructor to use dispatch #32844

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

Closed
wants to merge 14 commits into from
Prev Previous commit
Next Next commit
rename and take class instead of instance
  • Loading branch information
saulshanabrook committed Mar 19, 2020
commit 3e4b466a20fecbda52ff6f15223cb1bdedaceaa1
64 changes: 32 additions & 32 deletions pandas/core/frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,7 @@ def __init__(
):
if dtype is not None:
dtype = self._validate_dtype(dtype)
mgr = create_block_manager(data, self, index, columns, dtype, copy)
mgr = create_dataframe(data, self, index, columns, dtype, copy)
NDFrame.__init__(self, mgr)

# ----------------------------------------------------------------------
Expand Down Expand Up @@ -8463,18 +8463,19 @@ def isin(self, values) -> "DataFrame":


@functools.singledispatch
def create_block_manager(
def create_dataframe(
data: Any,
df: DataFrame,
index: Optional[Axes],
columns: Optional[Axes],
dtype: Optional[Dtype],
copy: bool,
cls: Type[DataFrame],
) -> BlockManager:
"""
Convert an object into a BlockManager. Used inside the DataFrame constructor
so if you want to provide a custom way to convert from your objec to a DataFrame
you can register a dispatch on this method.
Create a BlockManager for some given data. Used inside the DataFrame constructor
to convert different input types.
If you want to provide a custom way to convert from your objec to a DataFrame
you can register a dispatch on this function.
"""
# Base case is to try to cast to NumPy array
try:
Expand All @@ -8492,34 +8493,33 @@ def create_block_manager(
raise ValueError("DataFrame constructor not properly called!")


@create_block_manager.register
def _create_block_manager_none(data: None, *args, **kwargs):
return create_block_manager({}, *args, **kwargs)
@create_dataframe.register
def _create_dataframe_none(data: None, *args, **kwargs):
return create_dataframe({}, *args, **kwargs)


@create_block_manager.register
def _create_block_manager_dataframe(data: DataFrame, *args, **kwargs):
return create_block_manager(data._data, *args, **kwargs)
@create_dataframe.register
def _create_dataframe_dataframe(data: DataFrame, *args, **kwargs):
return create_dataframe(data._data, *args, **kwargs)


@create_block_manager.register
def _create_block_manager_blockmanager(
data: BlockManager, df, index, columns, dtype, copy
@create_dataframe.register
def _create_dataframe_blockmanager(
data: BlockManager, index, columns, dtype, copy, cls
):
mgr = df._init_mgr(
return cls._init_mgr(
data, axes=dict(index=index, columns=columns), dtype=dtype, copy=copy
)
return mgr


@create_block_manager.register
def _create_block_manager_dict(data: dict, df, index, columns, dtype, copy):
@create_dataframe.register
def _create_dataframe_dict(data: dict, index, columns, dtype, copy, cls):
return init_dict(data, index, columns, dtype=dtype)


@create_block_manager.register
def _create_block_manager_masked_array(
data: ma.MaskedArray, df, index, columns, dtype, copy
@create_dataframe.register
def _create_dataframe_masked_array(
data: ma.MaskedArray, index, columns, dtype, copy, cls
):
mask = ma.getmaskarray(data)
if mask.any():
Expand All @@ -8531,18 +8531,18 @@ def _create_block_manager_masked_array(
return init_ndarray(data, index, columns, dtype=dtype, copy=copy)


@create_block_manager.register
def _create_block_manager_masked_record(
data: mrecords.MaskedRecords, df, index, columns, dtype, copy
@create_dataframe.register
def _create_dataframe_masked_record(
data: mrecords.MaskedRecords, index, columns, dtype, copy, cls
):
return masked_rec_array_to_mgr(data, index, columns, dtype, copy)


@create_block_manager.register(np.ndarray)
@create_block_manager.register(Series)
@create_block_manager.register(Index)
def _create_block_manager_array_series_index(
data: Union[np.ndarray, Series, Index], df, index, columns, dtype, copy
@create_dataframe.register(np.ndarray)
@create_dataframe.register(Series)
@create_dataframe.register(Index)
def _create_dataframe_array_series_index(
data: Union[np.ndarray, Series, Index], index, columns, dtype, copy, cls
):
if data.dtype.names:
data_columns = list(data.dtype.names)
Expand All @@ -8569,8 +8569,8 @@ class _IterableExceptStringOrBytes(metaclass=_IterableExceptStringOrBytesMeta):
pass


@create_block_manager.register(_IterableExceptStringOrBytes)
def _create_block_manager_iterable(data: abc.Iterable, df, index, columns, dtype, copy):
@create_dataframe.register(_IterableExceptStringOrBytes)
def _create_dataframe_iterable(data: abc.Iterable, index, columns, dtype, copy, cls):
if not isinstance(data, (abc.Sequence, ExtensionArray)):
data = list(data)
if len(data) > 0:
Expand Down
0