Skip to content

Commit d41aeba

Browse files
authored
Merge pull request #218 from bashtage/final-panel-removal
MAINT: Remove pd.Panel
2 parents 8e7293b + 7f540f6 commit d41aeba

File tree

4 files changed

+28
-13
lines changed

4 files changed

+28
-13
lines changed

doc/source/spelling_wordlist.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,5 @@ csc
114114
tstats
115115
np
116116
orthogonalize
117+
MultiIndex
118+
multiindex

examples/panel_data-formats.ipynb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"cell_type": "markdown",
1919
"metadata": {},
2020
"source": [
21-
"## Multi Index DataFrames\n",
21+
"## MultiIndex DataFrames\n",
2222
"The most precise data format to use is a MultiIndex `DataFrame`. This is the most precise since only single columns can preserve all types within a panel. For example, it is not possible to span a single Categorical variable across multiple columns when using a pandas `Panel`. \n",
2323
"\n",
2424
"This example uses the job training data to construct a MultiIndex `DataFrame` using the `set_index` command. The entity index is `fcode` and the time index is `year`."
@@ -39,7 +39,7 @@
3939
"cell_type": "markdown",
4040
"metadata": {},
4141
"source": [
42-
"Here `set_index` is used to set the multi index using the firm code (entity) and year (time)."
42+
"Here `set_index` is used to set the MultiIndex using the firm code (entity) and year (time)."
4343
]
4444
},
4545
{

linearmodels/tests/test_utility.py

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -185,23 +185,34 @@ def test_format_wide():
185185
assert max(map(lambda v: len(v), out)) <= 80
186186

187187

188-
@pytest.mark.skipif(MISSING_PANEL, reason='pd.Panel is not installed')
189-
@pytest.mark.filterwarnings('ignore::FutureWarning')
190-
@pytest.mark.filterwarnings('ignore::DeprecationWarning')
191188
def test_panel_to_midf():
192189
x = np.random.standard_normal((3, 7, 100))
193-
expected = pd.Panel(x).to_frame()
194190
df = panel_to_frame(x, list(range(3)), list(range(7)), list(range(100)))
191+
mi = pd.MultiIndex.from_product([list(range(7)), list(range(100))])
192+
expected = pd.DataFrame(index=mi, columns=[0, 1, 2])
193+
for i in range(3):
194+
expected[i] = x[i].ravel()
195+
expected.index.names = ["major", "minor"]
195196
pd.testing.assert_frame_equal(df, expected)
196197

197-
expected = pd.Panel(x).swapaxes(1, 2).to_frame(filter_observations=False)
198-
df = panel_to_frame(x, list(range(3)), list(range(7)), list(range(100)), True)
199-
pd.testing.assert_frame_equal(df, expected)
198+
expected2 = expected.copy()
199+
expected2 = expected2.sort_index(level=[1, 0])
200+
expected2.index = expected2.index.swaplevel(0, 1)
201+
expected2.index.names = ["major", "minor"]
202+
df2 = panel_to_frame(x, list(range(3)), list(range(7)), list(range(100)), True)
203+
pd.testing.assert_frame_equal(df2, expected2)
204+
200205
entities = list(map(''.join, [[random.choice(string.ascii_lowercase) for __ in range(10)]
201206
for _ in range(100)]))
202207
times = pd.date_range('1999-12-31', freq='A-DEC', periods=7)
203208
var_names = ['x.{0}'.format(i) for i in range(1, 4)]
204-
expected = pd.Panel(x, items=var_names, major_axis=times, minor_axis=entities)
205-
expected = expected.swapaxes(1, 2).to_frame(filter_observations=False)
206-
df = panel_to_frame(x, var_names, times, entities, True)
207-
pd.testing.assert_frame_equal(df, expected)
209+
df3 = panel_to_frame(x, var_names, times, entities, True)
210+
mi = pd.MultiIndex.from_product([times, entities])
211+
expected3 = pd.DataFrame(index=mi, columns=var_names)
212+
for i in range(1, 4):
213+
expected3['x.{0}'.format(i)] = x[i-1].ravel()
214+
expected3.index = expected3.index.swaplevel(0, 1)
215+
mi = pd.MultiIndex.from_product([entities, times])
216+
expected3 = expected3.loc[mi]
217+
expected3.index.names = ["major", "minor"]
218+
pd.testing.assert_frame_equal(df3, expected3)

linearmodels/utility.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,8 @@ def panel_to_frame(x, items, major_axis, minor_axis, swap=False):
555555
List like object with major_axis labels
556556
minor_axis : list-like
557557
List like object with minor_axis labels
558+
swap : bool
559+
Swap is major and minor axes
558560
559561
Notes
560562
-----

0 commit comments

Comments
 (0)