Skip to content

Commit 5c8347b

Browse files
JoshJosh
Josh
authored and
Josh
committed
Fixed an issue where it was not possible to subclass Panel because
various methods were calling the Panel constructor instead of the _constructor method. Also from_dict was returning Panel objects instead of __class__ objects.
1 parent 5353a7c commit 5c8347b

File tree

1 file changed

+13
-36
lines changed

1 file changed

+13
-36
lines changed

pandas/core/panel.py

Lines changed: 13 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
_try_sort, _default_index, _infer_dtype)
1212
from pandas.core.index import (Factor, Index, MultiIndex, _ensure_index,
1313
_get_combined_index, NULL_INDEX)
14-
from pandas.core.indexing import _NDFrameIndexer, _maybe_droplevels
14+
from pandas.core.indexing import _NDFrameIndexer
1515
from pandas.core.internals import BlockManager, make_block, form_blocks
1616
from pandas.core.frame import DataFrame
1717
from pandas.core.generic import NDFrame
@@ -320,30 +320,7 @@ def from_dict(cls, data, intersect=False, orient='items', dtype=None):
320320
data, index, columns = _homogenize_dict(data, intersect=intersect,
321321
dtype=dtype)
322322
items = Index(sorted(data.keys()))
323-
return Panel(data, items, index, columns)
324-
325-
def __getitem__(self, key):
326-
if isinstance(self.items, MultiIndex):
327-
return self._getitem_multilevel(key)
328-
return super(Panel, self).__getitem__(key)
329-
330-
def _getitem_multilevel(self, key):
331-
loc = self.items.get_loc(key)
332-
if isinstance(loc, (slice, np.ndarray)):
333-
new_index = self.items[loc]
334-
result_index = _maybe_droplevels(new_index, key)
335-
if self._is_mixed_type:
336-
result = self.reindex(items=new_index)
337-
result.index = result_index
338-
else:
339-
new_values = self.values[loc, :, :]
340-
result = Panel(new_values,
341-
items=self.items[loc],
342-
major_axis=self.major_axis,
343-
minor_axis=self.minor_axis)
344-
return result
345-
else:
346-
return self._get_item_cache(key)
323+
return __class__(data, items, index, columns)
347324

348325
def _init_matrix(self, data, axes, dtype=None, copy=False):
349326
values = _prep_ndarray(data, copy=copy)
@@ -438,14 +415,14 @@ def _get_plane_axes(self, axis):
438415
columns = self.minor_axis
439416

440417
return index, columns
441-
418+
442419
@property
443420
def _constructor(self):
444-
return Panel
421+
return self.__class__
445422

446423
# Fancy indexing
447424
_ix = None
448-
425+
449426
@property
450427
def ix(self):
451428
if self._ix is None:
@@ -723,7 +700,7 @@ def _combine(self, other, func, axis=0):
723700
return self._combine_frame(other, func, axis=axis)
724701
elif np.isscalar(other):
725702
new_values = func(self.values, other)
726-
return Panel(new_values, self.items, self.major_axis,
703+
return self._constructor(new_values, self.items, self.major_axis,
727704
self.minor_axis)
728705

729706
def __neg__(self):
@@ -744,7 +721,7 @@ def _combine_frame(self, other, func, axis=0):
744721
new_values = func(self.values.swapaxes(0, 2), other.values)
745722
new_values = new_values.swapaxes(0, 2)
746723

747-
return Panel(new_values, self.items, self.major_axis,
724+
return self._constructor(new_values, self.items, self.major_axis,
748725
self.minor_axis)
749726

750727
def _combine_panel(self, other, func):
@@ -758,7 +735,7 @@ def _combine_panel(self, other, func):
758735

759736
result_values = func(this.values, other.values)
760737

761-
return Panel(result_values, items, major, minor)
738+
return self._constructor(result_values, items, major, minor)
762739

763740
def fillna(self, value=None, method='pad'):
764741
"""
@@ -790,10 +767,10 @@ def fillna(self, value=None, method='pad'):
790767
for col, s in self.iterkv():
791768
result[col] = s.fillna(method=method, value=value)
792769

793-
return Panel.from_dict(result)
770+
return self._constructor.from_dict(result)
794771
else:
795772
new_data = self._data.fillna(value)
796-
return Panel(new_data)
773+
return self._constructor(new_data)
797774

798775
add = _panel_arith_method(operator.add, 'add')
799776
subtract = sub = _panel_arith_method(operator.sub, 'subtract')
@@ -882,7 +859,7 @@ def groupby(self, function, axis='major'):
882859
"""
883860
from pandas.core.groupby import PanelGroupBy
884861
axis = self._get_axis_number(axis)
885-
return PanelGroupBy(self, function, axis=axis)
862+
return self._constructorGroupBy(self, function, axis=axis)
886863

887864
def swapaxes(self, axis1='major', axis2='minor'):
888865
"""
@@ -904,7 +881,7 @@ def swapaxes(self, axis1='major', axis2='minor'):
904881
for k in range(3))
905882
new_values = self.values.swapaxes(i, j).copy()
906883

907-
return Panel(new_values, *new_axes)
884+
return self._constructor(new_values, *new_axes)
908885

909886
def to_frame(self, filter_observations=True):
910887
"""
@@ -1105,7 +1082,7 @@ def shift(self, lags, axis='major'):
11051082
else:
11061083
raise ValueError('Invalid axis')
11071084

1108-
return Panel(values, items=items, major_axis=major_axis,
1085+
return self._constructor(values, items=items, major_axis=major_axis,
11091086
minor_axis=minor_axis)
11101087

11111088
def truncate(self, before=None, after=None, axis='major'):

0 commit comments

Comments
 (0)