Skip to content

Commit 776530c

Browse files
jbrockmendeljreback
authored andcommittedFeb 6, 2019
DEPR: remove PanelGroupBy, disable DataFrame.to_panel (#25047)
1 parent efa23ca commit 776530c

File tree

15 files changed

+14
-541
lines changed

15 files changed

+14
-541
lines changed
 

‎doc/source/whatsnew/v0.25.0.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ Deprecations
5151

5252
Removal of prior version deprecations/changes
5353
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
54-
54+
- Removed (parts of) :class:`Panel` (:issue:`25047`)
5555
-
5656
-
5757
-

‎pandas/core/frame.py

Lines changed: 1 addition & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1974,45 +1974,7 @@ def to_panel(self):
19741974
-------
19751975
panel : Panel
19761976
"""
1977-
# only support this kind for now
1978-
if (not isinstance(self.index, MultiIndex) or # pragma: no cover
1979-
len(self.index.levels) != 2):
1980-
raise NotImplementedError('Only 2-level MultiIndex are supported.')
1981-
1982-
if not self.index.is_unique:
1983-
raise ValueError("Can't convert non-uniquely indexed "
1984-
"DataFrame to Panel")
1985-
1986-
self._consolidate_inplace()
1987-
1988-
# minor axis must be sorted
1989-
if self.index.lexsort_depth < 2:
1990-
selfsorted = self.sort_index(level=0)
1991-
else:
1992-
selfsorted = self
1993-
1994-
major_axis, minor_axis = selfsorted.index.levels
1995-
major_codes, minor_codes = selfsorted.index.codes
1996-
shape = len(major_axis), len(minor_axis)
1997-
1998-
# preserve names, if any
1999-
major_axis = major_axis.copy()
2000-
major_axis.name = self.index.names[0]
2001-
2002-
minor_axis = minor_axis.copy()
2003-
minor_axis.name = self.index.names[1]
2004-
2005-
# create new axes
2006-
new_axes = [selfsorted.columns, major_axis, minor_axis]
2007-
2008-
# create new manager
2009-
new_mgr = selfsorted._data.reshape_nd(axes=new_axes,
2010-
labels=[major_codes,
2011-
minor_codes],
2012-
shape=shape,
2013-
ref_items=selfsorted.columns)
2014-
2015-
return self._constructor_expanddim(new_mgr)
1977+
raise NotImplementedError("Panel is being removed in pandas 0.25.0.")
20161978

20171979
@deprecate_kwarg(old_arg_name='encoding', new_arg_name=None)
20181980
def to_stata(self, fname, convert_dates=None, write_index=True,

‎pandas/core/groupby/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
from pandas.core.groupby.groupby import GroupBy # noqa: F401
22
from pandas.core.groupby.generic import ( # noqa: F401
3-
SeriesGroupBy, DataFrameGroupBy, PanelGroupBy)
3+
SeriesGroupBy, DataFrameGroupBy)
44
from pandas.core.groupby.grouper import Grouper # noqa: F401

‎pandas/core/groupby/generic.py

Lines changed: 1 addition & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""
2-
Define the SeriesGroupBy, DataFrameGroupBy, and PanelGroupBy
2+
Define the SeriesGroupBy and DataFrameGroupBy
33
classes that hold the groupby interfaces (and some implementations).
44
55
These are user facing as the result of the ``df.groupby(...)`` operations,
@@ -39,7 +39,6 @@
3939
from pandas.core.index import CategoricalIndex, Index, MultiIndex
4040
import pandas.core.indexes.base as ibase
4141
from pandas.core.internals import BlockManager, make_block
42-
from pandas.core.panel import Panel
4342
from pandas.core.series import Series
4443

4544
from pandas.plotting._core import boxplot_frame_groupby
@@ -1586,90 +1585,3 @@ def groupby_series(obj, col=None):
15861585
return results
15871586

15881587
boxplot = boxplot_frame_groupby
1589-
1590-
1591-
class PanelGroupBy(NDFrameGroupBy):
1592-
1593-
def aggregate(self, arg, *args, **kwargs):
1594-
return super(PanelGroupBy, self).aggregate(arg, *args, **kwargs)
1595-
1596-
agg = aggregate
1597-
1598-
def _iterate_slices(self):
1599-
if self.axis == 0:
1600-
# kludge
1601-
if self._selection is None:
1602-
slice_axis = self._selected_obj.items
1603-
else:
1604-
slice_axis = self._selection_list
1605-
slicer = lambda x: self._selected_obj[x]
1606-
else:
1607-
raise NotImplementedError("axis other than 0 is not supported")
1608-
1609-
for val in slice_axis:
1610-
if val in self.exclusions:
1611-
continue
1612-
1613-
yield val, slicer(val)
1614-
1615-
def aggregate(self, arg, *args, **kwargs):
1616-
"""
1617-
Aggregate using input function or dict of {column -> function}
1618-
1619-
Parameters
1620-
----------
1621-
arg : function or dict
1622-
Function to use for aggregating groups. If a function, must either
1623-
work when passed a Panel or when passed to Panel.apply. If
1624-
pass a dict, the keys must be DataFrame column names
1625-
1626-
Returns
1627-
-------
1628-
aggregated : Panel
1629-
"""
1630-
if isinstance(arg, compat.string_types):
1631-
return getattr(self, arg)(*args, **kwargs)
1632-
1633-
return self._aggregate_generic(arg, *args, **kwargs)
1634-
1635-
def _wrap_generic_output(self, result, obj):
1636-
if self.axis == 0:
1637-
new_axes = list(obj.axes)
1638-
new_axes[0] = self.grouper.result_index
1639-
elif self.axis == 1:
1640-
x, y, z = obj.axes
1641-
new_axes = [self.grouper.result_index, z, x]
1642-
else:
1643-
x, y, z = obj.axes
1644-
new_axes = [self.grouper.result_index, y, x]
1645-
1646-
result = Panel._from_axes(result, new_axes)
1647-
1648-
if self.axis == 1:
1649-
result = result.swapaxes(0, 1).swapaxes(0, 2)
1650-
elif self.axis == 2:
1651-
result = result.swapaxes(0, 2)
1652-
1653-
return result
1654-
1655-
def _aggregate_item_by_item(self, func, *args, **kwargs):
1656-
obj = self._obj_with_exclusions
1657-
result = {}
1658-
1659-
if self.axis > 0:
1660-
for item in obj:
1661-
try:
1662-
itemg = DataFrameGroupBy(obj[item],
1663-
axis=self.axis - 1,
1664-
grouper=self.grouper)
1665-
result[item] = itemg.aggregate(func, *args, **kwargs)
1666-
except (ValueError, TypeError):
1667-
raise
1668-
new_axes = list(obj.axes)
1669-
new_axes[self.axis] = self.grouper.result_index
1670-
return Panel._from_axes(result, new_axes)
1671-
else:
1672-
raise ValueError("axis value must be greater than 0")
1673-
1674-
def _wrap_aggregated_output(self, output, names=None):
1675-
raise AbstractMethodError(self)

‎pandas/core/panel.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -917,9 +917,7 @@ def groupby(self, function, axis='major'):
917917
-------
918918
grouped : PanelGroupBy
919919
"""
920-
from pandas.core.groupby import PanelGroupBy
921-
axis = self._get_axis_number(axis)
922-
return PanelGroupBy(self, function, axis=axis)
920+
raise NotImplementedError("Panel is removed in pandas 0.25.0")
923921

924922
def to_frame(self, filter_observations=True):
925923
"""

‎pandas/core/resample.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import pandas.core.algorithms as algos
2121
from pandas.core.generic import _shared_docs
2222
from pandas.core.groupby.base import GroupByMixin
23-
from pandas.core.groupby.generic import PanelGroupBy, SeriesGroupBy
23+
from pandas.core.groupby.generic import SeriesGroupBy
2424
from pandas.core.groupby.groupby import (
2525
GroupBy, _GroupBy, _pipe_template, groupby)
2626
from pandas.core.groupby.grouper import Grouper
@@ -340,12 +340,7 @@ def _groupby_and_aggregate(self, how, grouper=None, *args, **kwargs):
340340

341341
obj = self._selected_obj
342342

343-
try:
344-
grouped = groupby(obj, by=None, grouper=grouper, axis=self.axis)
345-
except TypeError:
346-
347-
# panel grouper
348-
grouped = PanelGroupBy(obj, grouper=grouper, axis=self.axis)
343+
grouped = groupby(obj, by=None, grouper=grouper, axis=self.axis)
349344

350345
try:
351346
if isinstance(obj, ABCDataFrame) and compat.callable(how):

‎pandas/io/pytables.py

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
PeriodIndex, Series, SparseDataFrame, SparseSeries, TimedeltaIndex, compat,
3232
concat, isna, to_datetime)
3333
from pandas.core import config
34-
from pandas.core.algorithms import match, unique
34+
from pandas.core.algorithms import unique
3535
from pandas.core.arrays.categorical import (
3636
Categorical, _factorize_from_iterables)
3737
from pandas.core.arrays.sparse import BlockIndex, IntIndex
@@ -3944,29 +3944,7 @@ def read(self, where=None, columns=None, **kwargs):
39443944
objs.append(obj)
39453945

39463946
else:
3947-
warnings.warn(duplicate_doc, DuplicateWarning, stacklevel=5)
3948-
3949-
# reconstruct
3950-
long_index = MultiIndex.from_arrays(
3951-
[i.values for i in self.index_axes])
3952-
3953-
for c in self.values_axes:
3954-
lp = DataFrame(c.data, index=long_index, columns=c.values)
3955-
3956-
# need a better algorithm
3957-
tuple_index = long_index.values
3958-
3959-
unique_tuples = unique(tuple_index)
3960-
unique_tuples = com.asarray_tuplesafe(unique_tuples)
3961-
3962-
indexer = match(unique_tuples, tuple_index)
3963-
indexer = ensure_platform_int(indexer)
3964-
3965-
new_index = long_index.take(indexer)
3966-
new_values = lp.values.take(indexer, axis=0)
3967-
3968-
lp = DataFrame(new_values, index=new_index, columns=lp.columns)
3969-
objs.append(lp.to_panel())
3947+
raise NotImplementedError("Panel is removed in pandas 0.25.0")
39703948

39713949
# create the composite object
39723950
if len(objs) == 1:
@@ -4875,16 +4853,3 @@ def select_coords(self):
48754853
return self.coordinates
48764854

48774855
return np.arange(start, stop)
4878-
4879-
# utilities ###
4880-
4881-
4882-
def timeit(key, df, fn=None, remove=True, **kwargs):
4883-
if fn is None:
4884-
fn = 'timeit.h5'
4885-
store = HDFStore(fn, mode='w')
4886-
store.append(key, df, **kwargs)
4887-
store.close()
4888-
4889-
if remove:
4890-
os.remove(fn)

‎pandas/tests/dtypes/test_generic.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# -*- coding: utf-8 -*-
22

3-
from warnings import catch_warnings, simplefilter
3+
from warnings import catch_warnings
44

55
import numpy as np
66

@@ -39,9 +39,6 @@ def test_abc_types(self):
3939
assert isinstance(pd.Int64Index([1, 2, 3]), gt.ABCIndexClass)
4040
assert isinstance(pd.Series([1, 2, 3]), gt.ABCSeries)
4141
assert isinstance(self.df, gt.ABCDataFrame)
42-
with catch_warnings(record=True):
43-
simplefilter('ignore', FutureWarning)
44-
assert isinstance(self.df.to_panel(), gt.ABCPanel)
4542
assert isinstance(self.sparse_series, gt.ABCSparseSeries)
4643
assert isinstance(self.sparse_array, gt.ABCSparseArray)
4744
assert isinstance(self.sparse_frame, gt.ABCSparseDataFrame)

‎pandas/tests/frame/test_subclass.py

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import pytest
77

88
import pandas as pd
9-
from pandas import DataFrame, Index, MultiIndex, Panel, Series
9+
from pandas import DataFrame, Index, MultiIndex, Series
1010
from pandas.tests.frame.common import TestData
1111
import pandas.util.testing as tm
1212

@@ -125,29 +125,6 @@ def test_indexing_sliced(self):
125125
tm.assert_series_equal(res, exp)
126126
assert isinstance(res, tm.SubclassedSeries)
127127

128-
@pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning")
129-
def test_to_panel_expanddim(self):
130-
# GH 9762
131-
132-
class SubclassedFrame(DataFrame):
133-
134-
@property
135-
def _constructor_expanddim(self):
136-
return SubclassedPanel
137-
138-
class SubclassedPanel(Panel):
139-
pass
140-
141-
index = MultiIndex.from_tuples([(0, 0), (0, 1), (0, 2)])
142-
df = SubclassedFrame({'X': [1, 2, 3], 'Y': [4, 5, 6]}, index=index)
143-
result = df.to_panel()
144-
assert isinstance(result, SubclassedPanel)
145-
expected = SubclassedPanel([[[1, 2, 3]], [[4, 5, 6]]],
146-
items=['X', 'Y'], major_axis=[0],
147-
minor_axis=[0, 1, 2],
148-
dtype='int64')
149-
tm.assert_panel_equal(result, expected)
150-
151128
def test_subclass_attr_err_propagation(self):
152129
# GH 11808
153130
class A(DataFrame):

‎pandas/tests/groupby/test_groupby.py

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,31 +1239,6 @@ def _check_work(gp):
12391239
# _check_work(panel.groupby(lambda x: x.month, axis=1))
12401240

12411241

1242-
@pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning")
1243-
def test_panel_groupby():
1244-
panel = tm.makePanel()
1245-
tm.add_nans(panel)
1246-
grouped = panel.groupby({'ItemA': 0, 'ItemB': 0, 'ItemC': 1},
1247-
axis='items')
1248-
agged = grouped.mean()
1249-
agged2 = grouped.agg(lambda x: x.mean('items'))
1250-
1251-
tm.assert_panel_equal(agged, agged2)
1252-
1253-
tm.assert_index_equal(agged.items, Index([0, 1]))
1254-
1255-
grouped = panel.groupby(lambda x: x.month, axis='major')
1256-
agged = grouped.mean()
1257-
1258-
exp = Index(sorted(list(set(panel.major_axis.month))))
1259-
tm.assert_index_equal(agged.major_axis, exp)
1260-
1261-
grouped = panel.groupby({'A': 0, 'B': 0, 'C': 1, 'D': 1},
1262-
axis='minor')
1263-
agged = grouped.mean()
1264-
tm.assert_index_equal(agged.minor_axis, Index([0, 1]))
1265-
1266-
12671242
def test_groupby_2d_malformed():
12681243
d = DataFrame(index=lrange(2))
12691244
d['group'] = ['g1', 'g2']

‎pandas/tests/groupby/test_grouping.py

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@
1414
from pandas.core.groupby.grouper import Grouping
1515
import pandas.util.testing as tm
1616
from pandas.util.testing import (
17-
assert_almost_equal, assert_frame_equal, assert_panel_equal,
18-
assert_series_equal)
17+
assert_almost_equal, assert_frame_equal, assert_series_equal)
1918

2019
# selection
2120
# --------------------------------
@@ -563,17 +562,7 @@ def test_list_grouper_with_nat(self):
563562
# --------------------------------
564563

565564
class TestGetGroup():
566-
567-
@pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning")
568565
def test_get_group(self):
569-
wp = tm.makePanel()
570-
grouped = wp.groupby(lambda x: x.month, axis='major')
571-
572-
gp = grouped.get_group(1)
573-
expected = wp.reindex(
574-
major=[x for x in wp.major_axis if x.month == 1])
575-
assert_panel_equal(gp, expected)
576-
577566
# GH 5267
578567
# be datelike friendly
579568
df = DataFrame({'DATE': pd.to_datetime(
@@ -755,19 +744,6 @@ def test_multi_iter_frame(self, three_group):
755744
for key, group in grouped:
756745
pass
757746

758-
@pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning")
759-
def test_multi_iter_panel(self):
760-
wp = tm.makePanel()
761-
grouped = wp.groupby([lambda x: x.month, lambda x: x.weekday()],
762-
axis=1)
763-
764-
for (month, wd), group in grouped:
765-
exp_axis = [x
766-
for x in wp.major_axis
767-
if x.month == month and x.weekday() == wd]
768-
expected = wp.reindex(major=exp_axis)
769-
assert_panel_equal(group, expected)
770-
771747
def test_dictify(self, df):
772748
dict(iter(df.groupby('A')))
773749
dict(iter(df.groupby(['A', 'B'])))

‎pandas/tests/io/test_pytables.py

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3050,29 +3050,6 @@ def test_select_with_dups(self):
30503050
result = store.select('df', columns=['B', 'A'])
30513051
assert_frame_equal(result, expected, by_blocks=True)
30523052

3053-
@pytest.mark.filterwarnings(
3054-
"ignore:\\nduplicate:pandas.io.pytables.DuplicateWarning"
3055-
)
3056-
def test_wide_table_dups(self):
3057-
with ensure_clean_store(self.path) as store:
3058-
with catch_warnings(record=True):
3059-
3060-
wp = tm.makePanel()
3061-
store.put('panel', wp, format='table')
3062-
store.put('panel', wp, format='table', append=True)
3063-
3064-
recons = store['panel']
3065-
3066-
assert_panel_equal(recons, wp)
3067-
3068-
def test_long(self):
3069-
def _check(left, right):
3070-
assert_panel_equal(left.to_panel(), right.to_panel())
3071-
3072-
with catch_warnings(record=True):
3073-
wp = tm.makePanel()
3074-
self._check_roundtrip(wp.to_frame(), _check)
3075-
30763053
def test_overwrite_node(self):
30773054

30783055
with ensure_clean_store(self.path) as store:

‎pandas/tests/resample/test_datetime_index.py

Lines changed: 1 addition & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from datetime import datetime, timedelta
22
from functools import partial
3-
from warnings import catch_warnings, simplefilter
43

54
import numpy as np
65
import pytest
@@ -10,7 +9,7 @@
109
from pandas.errors import UnsupportedFunctionCall
1110

1211
import pandas as pd
13-
from pandas import DataFrame, Panel, Series, Timedelta, Timestamp, isna, notna
12+
from pandas import DataFrame, Series, Timedelta, Timestamp, isna, notna
1413
from pandas.core.indexes.datetimes import date_range
1514
from pandas.core.indexes.period import Period, period_range
1615
from pandas.core.resample import (
@@ -692,56 +691,6 @@ def test_resample_axis1():
692691
tm.assert_frame_equal(result, expected)
693692

694693

695-
def test_resample_panel():
696-
rng = date_range('1/1/2000', '6/30/2000')
697-
n = len(rng)
698-
699-
with catch_warnings(record=True):
700-
simplefilter("ignore", FutureWarning)
701-
panel = Panel(np.random.randn(3, n, 5),
702-
items=['one', 'two', 'three'],
703-
major_axis=rng,
704-
minor_axis=['a', 'b', 'c', 'd', 'e'])
705-
706-
result = panel.resample('M', axis=1).mean()
707-
708-
def p_apply(panel, f):
709-
result = {}
710-
for item in panel.items:
711-
result[item] = f(panel[item])
712-
return Panel(result, items=panel.items)
713-
714-
expected = p_apply(panel, lambda x: x.resample('M').mean())
715-
tm.assert_panel_equal(result, expected)
716-
717-
panel2 = panel.swapaxes(1, 2)
718-
result = panel2.resample('M', axis=2).mean()
719-
expected = p_apply(panel2,
720-
lambda x: x.resample('M', axis=1).mean())
721-
tm.assert_panel_equal(result, expected)
722-
723-
724-
@pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning")
725-
def test_resample_panel_numpy():
726-
rng = date_range('1/1/2000', '6/30/2000')
727-
n = len(rng)
728-
729-
with catch_warnings(record=True):
730-
panel = Panel(np.random.randn(3, n, 5),
731-
items=['one', 'two', 'three'],
732-
major_axis=rng,
733-
minor_axis=['a', 'b', 'c', 'd', 'e'])
734-
735-
result = panel.resample('M', axis=1).apply(lambda x: x.mean(1))
736-
expected = panel.resample('M', axis=1).mean()
737-
tm.assert_panel_equal(result, expected)
738-
739-
panel = panel.swapaxes(1, 2)
740-
result = panel.resample('M', axis=2).apply(lambda x: x.mean(2))
741-
expected = panel.resample('M', axis=2).mean()
742-
tm.assert_panel_equal(result, expected)
743-
744-
745694
def test_resample_anchored_ticks():
746695
# If a fixed delta (5 minute, 4 hour) evenly divides a day, we should
747696
# "anchor" the origin at midnight so we get regular intervals rather

‎pandas/tests/resample/test_time_grouper.py

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import pytest
66

77
import pandas as pd
8-
from pandas import DataFrame, Panel, Series
8+
from pandas import DataFrame, Series
99
from pandas.core.indexes.datetimes import date_range
1010
from pandas.core.resample import TimeGrouper
1111
import pandas.util.testing as tm
@@ -79,27 +79,6 @@ def f(df):
7979
tm.assert_index_equal(result.index, df.index)
8080

8181

82-
@pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning")
83-
def test_panel_aggregation():
84-
ind = pd.date_range('1/1/2000', periods=100)
85-
data = np.random.randn(2, len(ind), 4)
86-
87-
wp = Panel(data, items=['Item1', 'Item2'], major_axis=ind,
88-
minor_axis=['A', 'B', 'C', 'D'])
89-
90-
tg = TimeGrouper('M', axis=1)
91-
_, grouper, _ = tg._get_grouper(wp)
92-
bingrouped = wp.groupby(grouper)
93-
binagg = bingrouped.mean()
94-
95-
def f(x):
96-
assert (isinstance(x, Panel))
97-
return x.mean(1)
98-
99-
result = bingrouped.agg(f)
100-
tm.assert_panel_equal(result, binagg)
101-
102-
10382
@pytest.mark.parametrize('name, func', [
10483
('Int64Index', tm.makeIntIndex),
10584
('Index', tm.makeUnicodeIndex),

‎pandas/tests/test_panel.py

Lines changed: 0 additions & 189 deletions
Original file line numberDiff line numberDiff line change
@@ -1653,61 +1653,6 @@ def test_transpose_copy(self):
16531653
panel.values[0, 1, 1] = np.nan
16541654
assert notna(result.values[1, 0, 1])
16551655

1656-
def test_to_frame(self):
1657-
# filtered
1658-
filtered = self.panel.to_frame()
1659-
expected = self.panel.to_frame().dropna(how='any')
1660-
assert_frame_equal(filtered, expected)
1661-
1662-
# unfiltered
1663-
unfiltered = self.panel.to_frame(filter_observations=False)
1664-
assert_panel_equal(unfiltered.to_panel(), self.panel)
1665-
1666-
# names
1667-
assert unfiltered.index.names == ('major', 'minor')
1668-
1669-
# unsorted, round trip
1670-
df = self.panel.to_frame(filter_observations=False)
1671-
unsorted = df.take(np.random.permutation(len(df)))
1672-
pan = unsorted.to_panel()
1673-
assert_panel_equal(pan, self.panel)
1674-
1675-
# preserve original index names
1676-
df = DataFrame(np.random.randn(6, 2),
1677-
index=[['a', 'a', 'b', 'b', 'c', 'c'],
1678-
[0, 1, 0, 1, 0, 1]],
1679-
columns=['one', 'two'])
1680-
df.index.names = ['foo', 'bar']
1681-
df.columns.name = 'baz'
1682-
1683-
rdf = df.to_panel().to_frame()
1684-
assert rdf.index.names == df.index.names
1685-
assert rdf.columns.names == df.columns.names
1686-
1687-
def test_to_frame_mixed(self):
1688-
panel = self.panel.fillna(0)
1689-
panel['str'] = 'foo'
1690-
panel['bool'] = panel['ItemA'] > 0
1691-
1692-
lp = panel.to_frame()
1693-
wp = lp.to_panel()
1694-
assert wp['bool'].values.dtype == np.bool_
1695-
# Previously, this was mutating the underlying
1696-
# index and changing its name
1697-
assert_frame_equal(wp['bool'], panel['bool'], check_names=False)
1698-
1699-
# GH 8704
1700-
# with categorical
1701-
df = panel.to_frame()
1702-
df['category'] = df['str'].astype('category')
1703-
1704-
# to_panel
1705-
# TODO: this converts back to object
1706-
p = df.to_panel()
1707-
expected = panel.copy()
1708-
expected['category'] = 'foo'
1709-
assert_panel_equal(p, expected)
1710-
17111656
def test_to_frame_multi_major(self):
17121657
idx = MultiIndex.from_tuples(
17131658
[(1, 'one'), (1, 'two'), (2, 'one'), (2, 'two')])
@@ -1808,22 +1753,6 @@ def test_to_frame_multi_drop_level(self):
18081753
expected = DataFrame({'i1': [1., 2], 'i2': [1., 2]}, index=exp_idx)
18091754
assert_frame_equal(result, expected)
18101755

1811-
def test_to_panel_na_handling(self):
1812-
df = DataFrame(np.random.randint(0, 10, size=20).reshape((10, 2)),
1813-
index=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
1814-
[0, 1, 2, 3, 4, 5, 2, 3, 4, 5]])
1815-
1816-
panel = df.to_panel()
1817-
assert isna(panel[0].loc[1, [0, 1]]).all()
1818-
1819-
def test_to_panel_duplicates(self):
1820-
# #2441
1821-
df = DataFrame({'a': [0, 0, 1], 'b': [1, 1, 1], 'c': [1, 2, 3]})
1822-
idf = df.set_index(['a', 'b'])
1823-
1824-
with pytest.raises(ValueError, match='non-uniquely indexed'):
1825-
idf.to_panel()
1826-
18271756
def test_panel_dups(self):
18281757

18291758
# GH 4960
@@ -2121,14 +2050,6 @@ def test_get_attr(self):
21212050
self.panel['i'] = self.panel['ItemA']
21222051
assert_frame_equal(self.panel['i'], self.panel.i)
21232052

2124-
def test_from_frame_level1_unsorted(self):
2125-
tuples = [('MSFT', 3), ('MSFT', 2), ('AAPL', 2), ('AAPL', 1),
2126-
('MSFT', 1)]
2127-
midx = MultiIndex.from_tuples(tuples)
2128-
df = DataFrame(np.random.rand(5, 4), index=midx)
2129-
p = df.to_panel()
2130-
assert_frame_equal(p.minor_xs(2), df.xs(2, level=1).sort_index())
2131-
21322053
def test_to_excel(self):
21332054
try:
21342055
import xlwt # noqa
@@ -2404,40 +2325,11 @@ def setup_method(self, method):
24042325
self.panel = panel.to_frame()
24052326
self.unfiltered_panel = panel.to_frame(filter_observations=False)
24062327

2407-
def test_ops_differently_indexed(self):
2408-
# trying to set non-identically indexed panel
2409-
wp = self.panel.to_panel()
2410-
wp2 = wp.reindex(major=wp.major_axis[:-1])
2411-
lp2 = wp2.to_frame()
2412-
2413-
result = self.panel + lp2
2414-
assert_frame_equal(result.reindex(lp2.index), lp2 * 2)
2415-
2416-
# careful, mutation
2417-
self.panel['foo'] = lp2['ItemA']
2418-
assert_series_equal(self.panel['foo'].reindex(lp2.index),
2419-
lp2['ItemA'],
2420-
check_names=False)
2421-
24222328
def test_ops_scalar(self):
24232329
result = self.panel.mul(2)
24242330
expected = DataFrame.__mul__(self.panel, 2)
24252331
assert_frame_equal(result, expected)
24262332

2427-
def test_combineFrame(self):
2428-
wp = self.panel.to_panel()
2429-
result = self.panel.add(wp['ItemA'].stack(), axis=0)
2430-
assert_frame_equal(result.to_panel()['ItemA'], wp['ItemA'] * 2)
2431-
2432-
def test_combinePanel(self):
2433-
wp = self.panel.to_panel()
2434-
result = self.panel.add(self.panel)
2435-
wide_result = result.to_panel()
2436-
assert_frame_equal(wp['ItemA'] * 2, wide_result['ItemA'])
2437-
2438-
# one item
2439-
result = self.panel.add(self.panel.filter(['ItemA']))
2440-
24412333
def test_combine_scalar(self):
24422334
result = self.panel.mul(2)
24432335
expected = DataFrame(self.panel._data) * 2
@@ -2454,34 +2346,6 @@ def test_combine_series(self):
24542346
expected = DataFrame.add(self.panel, s, axis=1)
24552347
assert_frame_equal(result, expected)
24562348

2457-
def test_operators(self):
2458-
wp = self.panel.to_panel()
2459-
result = (self.panel + 1).to_panel()
2460-
assert_frame_equal(wp['ItemA'] + 1, result['ItemA'])
2461-
2462-
def test_arith_flex_panel(self):
2463-
ops = ['add', 'sub', 'mul', 'div',
2464-
'truediv', 'pow', 'floordiv', 'mod']
2465-
if not compat.PY3:
2466-
aliases = {}
2467-
else:
2468-
aliases = {'div': 'truediv'}
2469-
self.panel = self.panel.to_panel()
2470-
2471-
for n in [np.random.randint(-50, -1), np.random.randint(1, 50), 0]:
2472-
for op in ops:
2473-
alias = aliases.get(op, op)
2474-
f = getattr(operator, alias)
2475-
exp = f(self.panel, n)
2476-
result = getattr(self.panel, op)(n)
2477-
assert_panel_equal(result, exp, check_panel_type=True)
2478-
2479-
# rops
2480-
r_f = lambda x, y: f(y, x)
2481-
exp = r_f(self.panel, n)
2482-
result = getattr(self.panel, 'r' + op)(n)
2483-
assert_panel_equal(result, exp)
2484-
24852349
def test_sort(self):
24862350
def is_sorted(arr):
24872351
return (arr[1:] > arr[:-1]).any()
@@ -2502,45 +2366,6 @@ def test_to_sparse(self):
25022366
with pytest.raises(NotImplementedError, match=msg):
25032367
self.panel.to_sparse
25042368

2505-
def test_truncate(self):
2506-
dates = self.panel.index.levels[0]
2507-
start, end = dates[1], dates[5]
2508-
2509-
trunced = self.panel.truncate(start, end).to_panel()
2510-
expected = self.panel.to_panel()['ItemA'].truncate(start, end)
2511-
2512-
# TODO truncate drops index.names
2513-
assert_frame_equal(trunced['ItemA'], expected, check_names=False)
2514-
2515-
trunced = self.panel.truncate(before=start).to_panel()
2516-
expected = self.panel.to_panel()['ItemA'].truncate(before=start)
2517-
2518-
# TODO truncate drops index.names
2519-
assert_frame_equal(trunced['ItemA'], expected, check_names=False)
2520-
2521-
trunced = self.panel.truncate(after=end).to_panel()
2522-
expected = self.panel.to_panel()['ItemA'].truncate(after=end)
2523-
2524-
# TODO truncate drops index.names
2525-
assert_frame_equal(trunced['ItemA'], expected, check_names=False)
2526-
2527-
# truncate on dates that aren't in there
2528-
wp = self.panel.to_panel()
2529-
new_index = wp.major_axis[::5]
2530-
2531-
wp2 = wp.reindex(major=new_index)
2532-
2533-
lp2 = wp2.to_frame()
2534-
lp_trunc = lp2.truncate(wp.major_axis[2], wp.major_axis[-2])
2535-
2536-
wp_trunc = wp2.truncate(wp.major_axis[2], wp.major_axis[-2])
2537-
2538-
assert_panel_equal(wp_trunc, lp_trunc.to_panel())
2539-
2540-
# throw proper exception
2541-
pytest.raises(Exception, lp2.truncate, wp.major_axis[-2],
2542-
wp.major_axis[2])
2543-
25442369
def test_axis_dummies(self):
25452370
from pandas.core.reshape.reshape import make_axis_dummies
25462371

@@ -2567,20 +2392,6 @@ def test_get_dummies(self):
25672392
dummies = get_dummies(self.panel['Label'])
25682393
tm.assert_numpy_array_equal(dummies.values, minor_dummies.values)
25692394

2570-
def test_mean(self):
2571-
means = self.panel.mean(level='minor')
2572-
2573-
# test versus Panel version
2574-
wide_means = self.panel.to_panel().mean('major')
2575-
assert_frame_equal(means, wide_means)
2576-
2577-
def test_sum(self):
2578-
sums = self.panel.sum(level='minor')
2579-
2580-
# test versus Panel version
2581-
wide_sums = self.panel.to_panel().sum('major')
2582-
assert_frame_equal(sums, wide_sums)
2583-
25842395
def test_count(self):
25852396
index = self.panel.index
25862397

0 commit comments

Comments
 (0)
Please sign in to comment.