PageRenderTime 68ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/pandas/tests/test_panel.py

http://github.com/wesm/pandas
Python | 2558 lines | 1827 code | 557 blank | 174 comment | 96 complexity | 2ade495abdddf1bddcae962754764de4 MD5 | raw file
Possible License(s): BSD-3-Clause, Apache-2.0
  1. # -*- coding: utf-8 -*-
  2. # pylint: disable=W0612,E1101
  3. from datetime import datetime
  4. import operator
  5. import nose
  6. import numpy as np
  7. import pandas as pd
  8. from pandas.types.common import is_float_dtype
  9. from pandas import Series, DataFrame, Index, isnull, notnull, pivot, MultiIndex
  10. from pandas.core.datetools import bday
  11. from pandas.core.nanops import nanall, nanany
  12. from pandas.core.panel import Panel
  13. from pandas.core.series import remove_na
  14. from pandas.formats.printing import pprint_thing
  15. from pandas import compat
  16. from pandas.compat import range, lrange, StringIO, OrderedDict, signature
  17. from pandas.util.testing import (assert_panel_equal, assert_frame_equal,
  18. assert_series_equal, assert_almost_equal,
  19. ensure_clean, assertRaisesRegexp,
  20. makeCustomDataframe as mkdf,
  21. makeMixedDataFrame)
  22. import pandas.core.panel as panelm
  23. import pandas.util.testing as tm
  24. class PanelTests(object):
  25. panel = None
  26. def test_pickle(self):
  27. unpickled = self.round_trip_pickle(self.panel)
  28. assert_frame_equal(unpickled['ItemA'], self.panel['ItemA'])
  29. def test_rank(self):
  30. self.assertRaises(NotImplementedError, lambda: self.panel.rank())
  31. def test_cumsum(self):
  32. cumsum = self.panel.cumsum()
  33. assert_frame_equal(cumsum['ItemA'], self.panel['ItemA'].cumsum())
  34. def not_hashable(self):
  35. c_empty = Panel()
  36. c = Panel(Panel([[[1]]]))
  37. self.assertRaises(TypeError, hash, c_empty)
  38. self.assertRaises(TypeError, hash, c)
  39. class SafeForLongAndSparse(object):
  40. _multiprocess_can_split_ = True
  41. def test_repr(self):
  42. repr(self.panel)
  43. def test_copy_names(self):
  44. for attr in ('major_axis', 'minor_axis'):
  45. getattr(self.panel, attr).name = None
  46. cp = self.panel.copy()
  47. getattr(cp, attr).name = 'foo'
  48. self.assertIsNone(getattr(self.panel, attr).name)
  49. def test_iter(self):
  50. tm.equalContents(list(self.panel), self.panel.items)
  51. def test_count(self):
  52. f = lambda s: notnull(s).sum()
  53. self._check_stat_op('count', f, obj=self.panel, has_skipna=False)
  54. def test_sum(self):
  55. self._check_stat_op('sum', np.sum)
  56. def test_mean(self):
  57. self._check_stat_op('mean', np.mean)
  58. def test_prod(self):
  59. self._check_stat_op('prod', np.prod)
  60. def test_median(self):
  61. def wrapper(x):
  62. if isnull(x).any():
  63. return np.nan
  64. return np.median(x)
  65. self._check_stat_op('median', wrapper)
  66. def test_min(self):
  67. self._check_stat_op('min', np.min)
  68. def test_max(self):
  69. self._check_stat_op('max', np.max)
  70. def test_skew(self):
  71. try:
  72. from scipy.stats import skew
  73. except ImportError:
  74. raise nose.SkipTest("no scipy.stats.skew")
  75. def this_skew(x):
  76. if len(x) < 3:
  77. return np.nan
  78. return skew(x, bias=False)
  79. self._check_stat_op('skew', this_skew)
  80. # def test_mad(self):
  81. # f = lambda x: np.abs(x - x.mean()).mean()
  82. # self._check_stat_op('mad', f)
  83. def test_var(self):
  84. def alt(x):
  85. if len(x) < 2:
  86. return np.nan
  87. return np.var(x, ddof=1)
  88. self._check_stat_op('var', alt)
  89. def test_std(self):
  90. def alt(x):
  91. if len(x) < 2:
  92. return np.nan
  93. return np.std(x, ddof=1)
  94. self._check_stat_op('std', alt)
  95. def test_sem(self):
  96. def alt(x):
  97. if len(x) < 2:
  98. return np.nan
  99. return np.std(x, ddof=1) / np.sqrt(len(x))
  100. self._check_stat_op('sem', alt)
  101. def _check_stat_op(self, name, alternative, obj=None, has_skipna=True):
  102. if obj is None:
  103. obj = self.panel
  104. # # set some NAs
  105. # obj.ix[5:10] = np.nan
  106. # obj.ix[15:20, -2:] = np.nan
  107. f = getattr(obj, name)
  108. if has_skipna:
  109. def skipna_wrapper(x):
  110. nona = remove_na(x)
  111. if len(nona) == 0:
  112. return np.nan
  113. return alternative(nona)
  114. def wrapper(x):
  115. return alternative(np.asarray(x))
  116. for i in range(obj.ndim):
  117. result = f(axis=i, skipna=False)
  118. assert_frame_equal(result, obj.apply(wrapper, axis=i))
  119. else:
  120. skipna_wrapper = alternative
  121. wrapper = alternative
  122. for i in range(obj.ndim):
  123. result = f(axis=i)
  124. if not tm._incompat_bottleneck_version(name):
  125. assert_frame_equal(result, obj.apply(skipna_wrapper, axis=i))
  126. self.assertRaises(Exception, f, axis=obj.ndim)
  127. # Unimplemented numeric_only parameter.
  128. if 'numeric_only' in signature(f).args:
  129. self.assertRaisesRegexp(NotImplementedError, name, f,
  130. numeric_only=True)
  131. class SafeForSparse(object):
  132. _multiprocess_can_split_ = True
  133. @classmethod
  134. def assert_panel_equal(cls, x, y):
  135. assert_panel_equal(x, y)
  136. def test_get_axis(self):
  137. assert (self.panel._get_axis(0) is self.panel.items)
  138. assert (self.panel._get_axis(1) is self.panel.major_axis)
  139. assert (self.panel._get_axis(2) is self.panel.minor_axis)
  140. def test_set_axis(self):
  141. new_items = Index(np.arange(len(self.panel.items)))
  142. new_major = Index(np.arange(len(self.panel.major_axis)))
  143. new_minor = Index(np.arange(len(self.panel.minor_axis)))
  144. # ensure propagate to potentially prior-cached items too
  145. item = self.panel['ItemA']
  146. self.panel.items = new_items
  147. if hasattr(self.panel, '_item_cache'):
  148. self.assertNotIn('ItemA', self.panel._item_cache)
  149. self.assertIs(self.panel.items, new_items)
  150. # TODO: unused?
  151. item = self.panel[0] # noqa
  152. self.panel.major_axis = new_major
  153. self.assertIs(self.panel[0].index, new_major)
  154. self.assertIs(self.panel.major_axis, new_major)
  155. # TODO: unused?
  156. item = self.panel[0] # noqa
  157. self.panel.minor_axis = new_minor
  158. self.assertIs(self.panel[0].columns, new_minor)
  159. self.assertIs(self.panel.minor_axis, new_minor)
  160. def test_get_axis_number(self):
  161. self.assertEqual(self.panel._get_axis_number('items'), 0)
  162. self.assertEqual(self.panel._get_axis_number('major'), 1)
  163. self.assertEqual(self.panel._get_axis_number('minor'), 2)
  164. with tm.assertRaisesRegexp(ValueError, "No axis named foo"):
  165. self.panel._get_axis_number('foo')
  166. with tm.assertRaisesRegexp(ValueError, "No axis named foo"):
  167. self.panel.__ge__(self.panel, axis='foo')
  168. def test_get_axis_name(self):
  169. self.assertEqual(self.panel._get_axis_name(0), 'items')
  170. self.assertEqual(self.panel._get_axis_name(1), 'major_axis')
  171. self.assertEqual(self.panel._get_axis_name(2), 'minor_axis')
  172. def test_get_plane_axes(self):
  173. # what to do here?
  174. index, columns = self.panel._get_plane_axes('items')
  175. index, columns = self.panel._get_plane_axes('major_axis')
  176. index, columns = self.panel._get_plane_axes('minor_axis')
  177. index, columns = self.panel._get_plane_axes(0)
  178. def test_truncate(self):
  179. dates = self.panel.major_axis
  180. start, end = dates[1], dates[5]
  181. trunced = self.panel.truncate(start, end, axis='major')
  182. expected = self.panel['ItemA'].truncate(start, end)
  183. assert_frame_equal(trunced['ItemA'], expected)
  184. trunced = self.panel.truncate(before=start, axis='major')
  185. expected = self.panel['ItemA'].truncate(before=start)
  186. assert_frame_equal(trunced['ItemA'], expected)
  187. trunced = self.panel.truncate(after=end, axis='major')
  188. expected = self.panel['ItemA'].truncate(after=end)
  189. assert_frame_equal(trunced['ItemA'], expected)
  190. # XXX test other axes
  191. def test_arith(self):
  192. self._test_op(self.panel, operator.add)
  193. self._test_op(self.panel, operator.sub)
  194. self._test_op(self.panel, operator.mul)
  195. self._test_op(self.panel, operator.truediv)
  196. self._test_op(self.panel, operator.floordiv)
  197. self._test_op(self.panel, operator.pow)
  198. self._test_op(self.panel, lambda x, y: y + x)
  199. self._test_op(self.panel, lambda x, y: y - x)
  200. self._test_op(self.panel, lambda x, y: y * x)
  201. self._test_op(self.panel, lambda x, y: y / x)
  202. self._test_op(self.panel, lambda x, y: y ** x)
  203. self._test_op(self.panel, lambda x, y: x + y) # panel + 1
  204. self._test_op(self.panel, lambda x, y: x - y) # panel - 1
  205. self._test_op(self.panel, lambda x, y: x * y) # panel * 1
  206. self._test_op(self.panel, lambda x, y: x / y) # panel / 1
  207. self._test_op(self.panel, lambda x, y: x ** y) # panel ** 1
  208. self.assertRaises(Exception, self.panel.__add__, self.panel['ItemA'])
  209. @staticmethod
  210. def _test_op(panel, op):
  211. result = op(panel, 1)
  212. assert_frame_equal(result['ItemA'], op(panel['ItemA'], 1))
  213. def test_keys(self):
  214. tm.equalContents(list(self.panel.keys()), self.panel.items)
  215. def test_iteritems(self):
  216. # Test panel.iteritems(), aka panel.iteritems()
  217. # just test that it works
  218. for k, v in self.panel.iteritems():
  219. pass
  220. self.assertEqual(len(list(self.panel.iteritems())),
  221. len(self.panel.items))
  222. def test_combineFrame(self):
  223. def check_op(op, name):
  224. # items
  225. df = self.panel['ItemA']
  226. func = getattr(self.panel, name)
  227. result = func(df, axis='items')
  228. assert_frame_equal(result['ItemB'], op(self.panel['ItemB'], df))
  229. # major
  230. xs = self.panel.major_xs(self.panel.major_axis[0])
  231. result = func(xs, axis='major')
  232. idx = self.panel.major_axis[1]
  233. assert_frame_equal(result.major_xs(idx),
  234. op(self.panel.major_xs(idx), xs))
  235. # minor
  236. xs = self.panel.minor_xs(self.panel.minor_axis[0])
  237. result = func(xs, axis='minor')
  238. idx = self.panel.minor_axis[1]
  239. assert_frame_equal(result.minor_xs(idx),
  240. op(self.panel.minor_xs(idx), xs))
  241. ops = ['add', 'sub', 'mul', 'truediv', 'floordiv', 'pow', 'mod']
  242. if not compat.PY3:
  243. ops.append('div')
  244. for op in ops:
  245. try:
  246. check_op(getattr(operator, op), op)
  247. except:
  248. pprint_thing("Failing operation: %r" % op)
  249. raise
  250. if compat.PY3:
  251. try:
  252. check_op(operator.truediv, 'div')
  253. except:
  254. pprint_thing("Failing operation: %r" % 'div')
  255. raise
  256. def test_combinePanel(self):
  257. result = self.panel.add(self.panel)
  258. self.assert_panel_equal(result, self.panel * 2)
  259. def test_neg(self):
  260. self.assert_panel_equal(-self.panel, self.panel * -1)
  261. # issue 7692
  262. def test_raise_when_not_implemented(self):
  263. p = Panel(np.arange(3 * 4 * 5).reshape(3, 4, 5),
  264. items=['ItemA', 'ItemB', 'ItemC'],
  265. major_axis=pd.date_range('20130101', periods=4),
  266. minor_axis=list('ABCDE'))
  267. d = p.sum(axis=1).ix[0]
  268. ops = ['add', 'sub', 'mul', 'truediv', 'floordiv', 'div', 'mod', 'pow']
  269. for op in ops:
  270. with self.assertRaises(NotImplementedError):
  271. getattr(p, op)(d, axis=0)
  272. def test_select(self):
  273. p = self.panel
  274. # select items
  275. result = p.select(lambda x: x in ('ItemA', 'ItemC'), axis='items')
  276. expected = p.reindex(items=['ItemA', 'ItemC'])
  277. self.assert_panel_equal(result, expected)
  278. # select major_axis
  279. result = p.select(lambda x: x >= datetime(2000, 1, 15), axis='major')
  280. new_major = p.major_axis[p.major_axis >= datetime(2000, 1, 15)]
  281. expected = p.reindex(major=new_major)
  282. self.assert_panel_equal(result, expected)
  283. # select minor_axis
  284. result = p.select(lambda x: x in ('D', 'A'), axis=2)
  285. expected = p.reindex(minor=['A', 'D'])
  286. self.assert_panel_equal(result, expected)
  287. # corner case, empty thing
  288. result = p.select(lambda x: x in ('foo', ), axis='items')
  289. self.assert_panel_equal(result, p.reindex(items=[]))
  290. def test_get_value(self):
  291. for item in self.panel.items:
  292. for mjr in self.panel.major_axis[::2]:
  293. for mnr in self.panel.minor_axis:
  294. result = self.panel.get_value(item, mjr, mnr)
  295. expected = self.panel[item][mnr][mjr]
  296. assert_almost_equal(result, expected)
  297. def test_abs(self):
  298. result = self.panel.abs()
  299. result2 = abs(self.panel)
  300. expected = np.abs(self.panel)
  301. self.assert_panel_equal(result, expected)
  302. self.assert_panel_equal(result2, expected)
  303. df = self.panel['ItemA']
  304. result = df.abs()
  305. result2 = abs(df)
  306. expected = np.abs(df)
  307. assert_frame_equal(result, expected)
  308. assert_frame_equal(result2, expected)
  309. s = df['A']
  310. result = s.abs()
  311. result2 = abs(s)
  312. expected = np.abs(s)
  313. assert_series_equal(result, expected)
  314. assert_series_equal(result2, expected)
  315. self.assertEqual(result.name, 'A')
  316. self.assertEqual(result2.name, 'A')
  317. class CheckIndexing(object):
  318. _multiprocess_can_split_ = True
  319. def test_getitem(self):
  320. self.assertRaises(Exception, self.panel.__getitem__, 'ItemQ')
  321. def test_delitem_and_pop(self):
  322. expected = self.panel['ItemA']
  323. result = self.panel.pop('ItemA')
  324. assert_frame_equal(expected, result)
  325. self.assertNotIn('ItemA', self.panel.items)
  326. del self.panel['ItemB']
  327. self.assertNotIn('ItemB', self.panel.items)
  328. self.assertRaises(Exception, self.panel.__delitem__, 'ItemB')
  329. values = np.empty((3, 3, 3))
  330. values[0] = 0
  331. values[1] = 1
  332. values[2] = 2
  333. panel = Panel(values, lrange(3), lrange(3), lrange(3))
  334. # did we delete the right row?
  335. panelc = panel.copy()
  336. del panelc[0]
  337. assert_frame_equal(panelc[1], panel[1])
  338. assert_frame_equal(panelc[2], panel[2])
  339. panelc = panel.copy()
  340. del panelc[1]
  341. assert_frame_equal(panelc[0], panel[0])
  342. assert_frame_equal(panelc[2], panel[2])
  343. panelc = panel.copy()
  344. del panelc[2]
  345. assert_frame_equal(panelc[1], panel[1])
  346. assert_frame_equal(panelc[0], panel[0])
  347. def test_setitem(self):
  348. # LongPanel with one item
  349. lp = self.panel.filter(['ItemA', 'ItemB']).to_frame()
  350. with tm.assertRaises(ValueError):
  351. self.panel['ItemE'] = lp
  352. # DataFrame
  353. df = self.panel['ItemA'][2:].filter(items=['A', 'B'])
  354. self.panel['ItemF'] = df
  355. self.panel['ItemE'] = df
  356. df2 = self.panel['ItemF']
  357. assert_frame_equal(df, df2.reindex(index=df.index, columns=df.columns))
  358. # scalar
  359. self.panel['ItemG'] = 1
  360. self.panel['ItemE'] = True
  361. self.assertEqual(self.panel['ItemG'].values.dtype, np.int64)
  362. self.assertEqual(self.panel['ItemE'].values.dtype, np.bool_)
  363. # object dtype
  364. self.panel['ItemQ'] = 'foo'
  365. self.assertEqual(self.panel['ItemQ'].values.dtype, np.object_)
  366. # boolean dtype
  367. self.panel['ItemP'] = self.panel['ItemA'] > 0
  368. self.assertEqual(self.panel['ItemP'].values.dtype, np.bool_)
  369. self.assertRaises(TypeError, self.panel.__setitem__, 'foo',
  370. self.panel.ix[['ItemP']])
  371. # bad shape
  372. p = Panel(np.random.randn(4, 3, 2))
  373. with tm.assertRaisesRegexp(ValueError,
  374. "shape of value must be \(3, 2\), "
  375. "shape of given object was \(4, 2\)"):
  376. p[0] = np.random.randn(4, 2)
  377. def test_setitem_ndarray(self):
  378. from pandas import date_range, datetools
  379. timeidx = date_range(start=datetime(2009, 1, 1),
  380. end=datetime(2009, 12, 31),
  381. freq=datetools.MonthEnd())
  382. lons_coarse = np.linspace(-177.5, 177.5, 72)
  383. lats_coarse = np.linspace(-87.5, 87.5, 36)
  384. P = Panel(items=timeidx, major_axis=lons_coarse,
  385. minor_axis=lats_coarse)
  386. data = np.random.randn(72 * 36).reshape((72, 36))
  387. key = datetime(2009, 2, 28)
  388. P[key] = data
  389. assert_almost_equal(P[key].values, data)
  390. def test_set_minor_major(self):
  391. # GH 11014
  392. df1 = DataFrame(['a', 'a', 'a', np.nan, 'a', np.nan])
  393. df2 = DataFrame([1.0, np.nan, 1.0, np.nan, 1.0, 1.0])
  394. panel = Panel({'Item1': df1, 'Item2': df2})
  395. newminor = notnull(panel.iloc[:, :, 0])
  396. panel.loc[:, :, 'NewMinor'] = newminor
  397. assert_frame_equal(panel.loc[:, :, 'NewMinor'],
  398. newminor.astype(object))
  399. newmajor = notnull(panel.iloc[:, 0, :])
  400. panel.loc[:, 'NewMajor', :] = newmajor
  401. assert_frame_equal(panel.loc[:, 'NewMajor', :],
  402. newmajor.astype(object))
  403. def test_major_xs(self):
  404. ref = self.panel['ItemA']
  405. idx = self.panel.major_axis[5]
  406. xs = self.panel.major_xs(idx)
  407. result = xs['ItemA']
  408. assert_series_equal(result, ref.xs(idx), check_names=False)
  409. self.assertEqual(result.name, 'ItemA')
  410. # not contained
  411. idx = self.panel.major_axis[0] - bday
  412. self.assertRaises(Exception, self.panel.major_xs, idx)
  413. def test_major_xs_mixed(self):
  414. self.panel['ItemD'] = 'foo'
  415. xs = self.panel.major_xs(self.panel.major_axis[0])
  416. self.assertEqual(xs['ItemA'].dtype, np.float64)
  417. self.assertEqual(xs['ItemD'].dtype, np.object_)
  418. def test_minor_xs(self):
  419. ref = self.panel['ItemA']
  420. idx = self.panel.minor_axis[1]
  421. xs = self.panel.minor_xs(idx)
  422. assert_series_equal(xs['ItemA'], ref[idx], check_names=False)
  423. # not contained
  424. self.assertRaises(Exception, self.panel.minor_xs, 'E')
  425. def test_minor_xs_mixed(self):
  426. self.panel['ItemD'] = 'foo'
  427. xs = self.panel.minor_xs('D')
  428. self.assertEqual(xs['ItemA'].dtype, np.float64)
  429. self.assertEqual(xs['ItemD'].dtype, np.object_)
  430. def test_xs(self):
  431. itemA = self.panel.xs('ItemA', axis=0)
  432. expected = self.panel['ItemA']
  433. assert_frame_equal(itemA, expected)
  434. # get a view by default
  435. itemA_view = self.panel.xs('ItemA', axis=0)
  436. itemA_view.values[:] = np.nan
  437. self.assertTrue(np.isnan(self.panel['ItemA'].values).all())
  438. # mixed-type yields a copy
  439. self.panel['strings'] = 'foo'
  440. result = self.panel.xs('D', axis=2)
  441. self.assertIsNotNone(result.is_copy)
  442. def test_getitem_fancy_labels(self):
  443. p = self.panel
  444. items = p.items[[1, 0]]
  445. dates = p.major_axis[::2]
  446. cols = ['D', 'C', 'F']
  447. # all 3 specified
  448. assert_panel_equal(p.ix[items, dates, cols],
  449. p.reindex(items=items, major=dates, minor=cols))
  450. # 2 specified
  451. assert_panel_equal(p.ix[:, dates, cols],
  452. p.reindex(major=dates, minor=cols))
  453. assert_panel_equal(p.ix[items, :, cols],
  454. p.reindex(items=items, minor=cols))
  455. assert_panel_equal(p.ix[items, dates, :],
  456. p.reindex(items=items, major=dates))
  457. # only 1
  458. assert_panel_equal(p.ix[items, :, :], p.reindex(items=items))
  459. assert_panel_equal(p.ix[:, dates, :], p.reindex(major=dates))
  460. assert_panel_equal(p.ix[:, :, cols], p.reindex(minor=cols))
  461. def test_getitem_fancy_slice(self):
  462. pass
  463. def test_getitem_fancy_ints(self):
  464. p = self.panel
  465. # #1603
  466. result = p.ix[:, -1, :]
  467. expected = p.ix[:, p.major_axis[-1], :]
  468. assert_frame_equal(result, expected)
  469. def test_getitem_fancy_xs(self):
  470. p = self.panel
  471. item = 'ItemB'
  472. date = p.major_axis[5]
  473. col = 'C'
  474. # get DataFrame
  475. # item
  476. assert_frame_equal(p.ix[item], p[item])
  477. assert_frame_equal(p.ix[item, :], p[item])
  478. assert_frame_equal(p.ix[item, :, :], p[item])
  479. # major axis, axis=1
  480. assert_frame_equal(p.ix[:, date], p.major_xs(date))
  481. assert_frame_equal(p.ix[:, date, :], p.major_xs(date))
  482. # minor axis, axis=2
  483. assert_frame_equal(p.ix[:, :, 'C'], p.minor_xs('C'))
  484. # get Series
  485. assert_series_equal(p.ix[item, date], p[item].ix[date])
  486. assert_series_equal(p.ix[item, date, :], p[item].ix[date])
  487. assert_series_equal(p.ix[item, :, col], p[item][col])
  488. assert_series_equal(p.ix[:, date, col], p.major_xs(date).ix[col])
  489. def test_getitem_fancy_xs_check_view(self):
  490. item = 'ItemB'
  491. date = self.panel.major_axis[5]
  492. # make sure it's always a view
  493. NS = slice(None, None)
  494. # DataFrames
  495. comp = assert_frame_equal
  496. self._check_view(item, comp)
  497. self._check_view((item, NS), comp)
  498. self._check_view((item, NS, NS), comp)
  499. self._check_view((NS, date), comp)
  500. self._check_view((NS, date, NS), comp)
  501. self._check_view((NS, NS, 'C'), comp)
  502. # Series
  503. comp = assert_series_equal
  504. self._check_view((item, date), comp)
  505. self._check_view((item, date, NS), comp)
  506. self._check_view((item, NS, 'C'), comp)
  507. self._check_view((NS, date, 'C'), comp)
  508. def test_getitem_callable(self):
  509. p = self.panel
  510. # GH 12533
  511. assert_frame_equal(p[lambda x: 'ItemB'], p.loc['ItemB'])
  512. assert_panel_equal(p[lambda x: ['ItemB', 'ItemC']],
  513. p.loc[['ItemB', 'ItemC']])
  514. def test_ix_setitem_slice_dataframe(self):
  515. a = Panel(items=[1, 2, 3], major_axis=[11, 22, 33],
  516. minor_axis=[111, 222, 333])
  517. b = DataFrame(np.random.randn(2, 3), index=[111, 333],
  518. columns=[1, 2, 3])
  519. a.ix[:, 22, [111, 333]] = b
  520. assert_frame_equal(a.ix[:, 22, [111, 333]], b)
  521. def test_ix_align(self):
  522. from pandas import Series
  523. b = Series(np.random.randn(10), name=0)
  524. b.sort()
  525. df_orig = Panel(np.random.randn(3, 10, 2))
  526. df = df_orig.copy()
  527. df.ix[0, :, 0] = b
  528. assert_series_equal(df.ix[0, :, 0].reindex(b.index), b)
  529. df = df_orig.swapaxes(0, 1)
  530. df.ix[:, 0, 0] = b
  531. assert_series_equal(df.ix[:, 0, 0].reindex(b.index), b)
  532. df = df_orig.swapaxes(1, 2)
  533. df.ix[0, 0, :] = b
  534. assert_series_equal(df.ix[0, 0, :].reindex(b.index), b)
  535. def test_ix_frame_align(self):
  536. p_orig = tm.makePanel()
  537. df = p_orig.ix[0].copy()
  538. assert_frame_equal(p_orig['ItemA'], df)
  539. p = p_orig.copy()
  540. p.ix[0, :, :] = df
  541. assert_panel_equal(p, p_orig)
  542. p = p_orig.copy()
  543. p.ix[0] = df
  544. assert_panel_equal(p, p_orig)
  545. p = p_orig.copy()
  546. p.iloc[0, :, :] = df
  547. assert_panel_equal(p, p_orig)
  548. p = p_orig.copy()
  549. p.iloc[0] = df
  550. assert_panel_equal(p, p_orig)
  551. p = p_orig.copy()
  552. p.loc['ItemA'] = df
  553. assert_panel_equal(p, p_orig)
  554. p = p_orig.copy()
  555. p.loc['ItemA', :, :] = df
  556. assert_panel_equal(p, p_orig)
  557. p = p_orig.copy()
  558. p['ItemA'] = df
  559. assert_panel_equal(p, p_orig)
  560. p = p_orig.copy()
  561. p.ix[0, [0, 1, 3, 5], -2:] = df
  562. out = p.ix[0, [0, 1, 3, 5], -2:]
  563. assert_frame_equal(out, df.iloc[[0, 1, 3, 5], [2, 3]])
  564. # GH3830, panel assignent by values/frame
  565. for dtype in ['float64', 'int64']:
  566. panel = Panel(np.arange(40).reshape((2, 4, 5)),
  567. items=['a1', 'a2'], dtype=dtype)
  568. df1 = panel.iloc[0]
  569. df2 = panel.iloc[1]
  570. tm.assert_frame_equal(panel.loc['a1'], df1)
  571. tm.assert_frame_equal(panel.loc['a2'], df2)
  572. # Assignment by Value Passes for 'a2'
  573. panel.loc['a2'] = df1.values
  574. tm.assert_frame_equal(panel.loc['a1'], df1)
  575. tm.assert_frame_equal(panel.loc['a2'], df1)
  576. # Assignment by DataFrame Ok w/o loc 'a2'
  577. panel['a2'] = df2
  578. tm.assert_frame_equal(panel.loc['a1'], df1)
  579. tm.assert_frame_equal(panel.loc['a2'], df2)
  580. # Assignment by DataFrame Fails for 'a2'
  581. panel.loc['a2'] = df2
  582. tm.assert_frame_equal(panel.loc['a1'], df1)
  583. tm.assert_frame_equal(panel.loc['a2'], df2)
  584. def _check_view(self, indexer, comp):
  585. cp = self.panel.copy()
  586. obj = cp.ix[indexer]
  587. obj.values[:] = 0
  588. self.assertTrue((obj.values == 0).all())
  589. comp(cp.ix[indexer].reindex_like(obj), obj)
  590. def test_logical_with_nas(self):
  591. d = Panel({'ItemA': {'a': [np.nan, False]},
  592. 'ItemB': {'a': [True, True]}})
  593. result = d['ItemA'] | d['ItemB']
  594. expected = DataFrame({'a': [np.nan, True]})
  595. assert_frame_equal(result, expected)
  596. # this is autodowncasted here
  597. result = d['ItemA'].fillna(False) | d['ItemB']
  598. expected = DataFrame({'a': [True, True]})
  599. assert_frame_equal(result, expected)
  600. def test_neg(self):
  601. # what to do?
  602. assert_panel_equal(-self.panel, -1 * self.panel)
  603. def test_invert(self):
  604. assert_panel_equal(-(self.panel < 0), ~(self.panel < 0))
  605. def test_comparisons(self):
  606. p1 = tm.makePanel()
  607. p2 = tm.makePanel()
  608. tp = p1.reindex(items=p1.items + ['foo'])
  609. df = p1[p1.items[0]]
  610. def test_comp(func):
  611. # versus same index
  612. result = func(p1, p2)
  613. self.assert_numpy_array_equal(result.values,
  614. func(p1.values, p2.values))
  615. # versus non-indexed same objs
  616. self.assertRaises(Exception, func, p1, tp)
  617. # versus different objs
  618. self.assertRaises(Exception, func, p1, df)
  619. # versus scalar
  620. result3 = func(self.panel, 0)
  621. self.assert_numpy_array_equal(result3.values,
  622. func(self.panel.values, 0))
  623. test_comp(operator.eq)
  624. test_comp(operator.ne)
  625. test_comp(operator.lt)
  626. test_comp(operator.gt)
  627. test_comp(operator.ge)
  628. test_comp(operator.le)
  629. def test_get_value(self):
  630. for item in self.panel.items:
  631. for mjr in self.panel.major_axis[::2]:
  632. for mnr in self.panel.minor_axis:
  633. result = self.panel.get_value(item, mjr, mnr)
  634. expected = self.panel[item][mnr][mjr]
  635. assert_almost_equal(result, expected)
  636. with tm.assertRaisesRegexp(TypeError,
  637. "There must be an argument for each axis"):
  638. self.panel.get_value('a')
  639. def test_set_value(self):
  640. for item in self.panel.items:
  641. for mjr in self.panel.major_axis[::2]:
  642. for mnr in self.panel.minor_axis:
  643. self.panel.set_value(item, mjr, mnr, 1.)
  644. assert_almost_equal(self.panel[item][mnr][mjr], 1.)
  645. # resize
  646. res = self.panel.set_value('ItemE', 'foo', 'bar', 1.5)
  647. tm.assertIsInstance(res, Panel)
  648. self.assertIsNot(res, self.panel)
  649. self.assertEqual(res.get_value('ItemE', 'foo', 'bar'), 1.5)
  650. res3 = self.panel.set_value('ItemE', 'foobar', 'baz', 5)
  651. self.assertTrue(is_float_dtype(res3['ItemE'].values))
  652. with tm.assertRaisesRegexp(TypeError,
  653. "There must be an argument for each axis"
  654. " plus the value provided"):
  655. self.panel.set_value('a')
  656. _panel = tm.makePanel()
  657. tm.add_nans(_panel)
  658. class TestPanel(tm.TestCase, PanelTests, CheckIndexing, SafeForLongAndSparse,
  659. SafeForSparse):
  660. _multiprocess_can_split_ = True
  661. @classmethod
  662. def assert_panel_equal(cls, x, y):
  663. assert_panel_equal(x, y)
  664. def setUp(self):
  665. self.panel = _panel.copy()
  666. self.panel.major_axis.name = None
  667. self.panel.minor_axis.name = None
  668. self.panel.items.name = None
  669. def test_panel_warnings(self):
  670. with tm.assert_produces_warning(FutureWarning):
  671. shifted1 = self.panel.shift(lags=1)
  672. with tm.assert_produces_warning(False):
  673. shifted2 = self.panel.shift(periods=1)
  674. tm.assert_panel_equal(shifted1, shifted2)
  675. with tm.assert_produces_warning(False):
  676. shifted3 = self.panel.shift()
  677. tm.assert_panel_equal(shifted1, shifted3)
  678. def test_constructor(self):
  679. # with BlockManager
  680. wp = Panel(self.panel._data)
  681. self.assertIs(wp._data, self.panel._data)
  682. wp = Panel(self.panel._data, copy=True)
  683. self.assertIsNot(wp._data, self.panel._data)
  684. assert_panel_equal(wp, self.panel)
  685. # strings handled prop
  686. wp = Panel([[['foo', 'foo', 'foo', ], ['foo', 'foo', 'foo']]])
  687. self.assertEqual(wp.values.dtype, np.object_)
  688. vals = self.panel.values
  689. # no copy
  690. wp = Panel(vals)
  691. self.assertIs(wp.values, vals)
  692. # copy
  693. wp = Panel(vals, copy=True)
  694. self.assertIsNot(wp.values, vals)
  695. # GH #8285, test when scalar data is used to construct a Panel
  696. # if dtype is not passed, it should be inferred
  697. value_and_dtype = [(1, 'int64'), (3.14, 'float64'),
  698. ('foo', np.object_)]
  699. for (val, dtype) in value_and_dtype:
  700. wp = Panel(val, items=range(2), major_axis=range(3),
  701. minor_axis=range(4))
  702. vals = np.empty((2, 3, 4), dtype=dtype)
  703. vals.fill(val)
  704. assert_panel_equal(wp, Panel(vals, dtype=dtype))
  705. # test the case when dtype is passed
  706. wp = Panel(1, items=range(2), major_axis=range(3), minor_axis=range(4),
  707. dtype='float32')
  708. vals = np.empty((2, 3, 4), dtype='float32')
  709. vals.fill(1)
  710. assert_panel_equal(wp, Panel(vals, dtype='float32'))
  711. def test_constructor_cast(self):
  712. zero_filled = self.panel.fillna(0)
  713. casted = Panel(zero_filled._data, dtype=int)
  714. casted2 = Panel(zero_filled.values, dtype=int)
  715. exp_values = zero_filled.values.astype(int)
  716. assert_almost_equal(casted.values, exp_values)
  717. assert_almost_equal(casted2.values, exp_values)
  718. casted = Panel(zero_filled._data, dtype=np.int32)
  719. casted2 = Panel(zero_filled.values, dtype=np.int32)
  720. exp_values = zero_filled.values.astype(np.int32)
  721. assert_almost_equal(casted.values, exp_values)
  722. assert_almost_equal(casted2.values, exp_values)
  723. # can't cast
  724. data = [[['foo', 'bar', 'baz']]]
  725. self.assertRaises(ValueError, Panel, data, dtype=float)
  726. def test_constructor_empty_panel(self):
  727. empty = Panel()
  728. self.assertEqual(len(empty.items), 0)
  729. self.assertEqual(len(empty.major_axis), 0)
  730. self.assertEqual(len(empty.minor_axis), 0)
  731. def test_constructor_observe_dtype(self):
  732. # GH #411
  733. panel = Panel(items=lrange(3), major_axis=lrange(3),
  734. minor_axis=lrange(3), dtype='O')
  735. self.assertEqual(panel.values.dtype, np.object_)
  736. def test_constructor_dtypes(self):
  737. # GH #797
  738. def _check_dtype(panel, dtype):
  739. for i in panel.items:
  740. self.assertEqual(panel[i].values.dtype.name, dtype)
  741. # only nan holding types allowed here
  742. for dtype in ['float64', 'float32', 'object']:
  743. panel = Panel(items=lrange(2), major_axis=lrange(10),
  744. minor_axis=lrange(5), dtype=dtype)
  745. _check_dtype(panel, dtype)
  746. for dtype in ['float64', 'float32', 'int64', 'int32', 'object']:
  747. panel = Panel(np.array(np.random.randn(2, 10, 5), dtype=dtype),
  748. items=lrange(2),
  749. major_axis=lrange(10),
  750. minor_axis=lrange(5), dtype=dtype)
  751. _check_dtype(panel, dtype)
  752. for dtype in ['float64', 'float32', 'int64', 'int32', 'object']:
  753. panel = Panel(np.array(np.random.randn(2, 10, 5), dtype='O'),
  754. items=lrange(2),
  755. major_axis=lrange(10),
  756. minor_axis=lrange(5), dtype=dtype)
  757. _check_dtype(panel, dtype)
  758. for dtype in ['float64', 'float32', 'int64', 'int32', 'object']:
  759. panel = Panel(np.random.randn(2, 10, 5), items=lrange(
  760. 2), major_axis=lrange(10), minor_axis=lrange(5), dtype=dtype)
  761. _check_dtype(panel, dtype)
  762. for dtype in ['float64', 'float32', 'int64', 'int32', 'object']:
  763. df1 = DataFrame(np.random.randn(2, 5),
  764. index=lrange(2), columns=lrange(5))
  765. df2 = DataFrame(np.random.randn(2, 5),
  766. index=lrange(2), columns=lrange(5))
  767. panel = Panel.from_dict({'a': df1, 'b': df2}, dtype=dtype)
  768. _check_dtype(panel, dtype)
  769. def test_constructor_fails_with_not_3d_input(self):
  770. with tm.assertRaisesRegexp(ValueError,
  771. "The number of dimensions required is 3"):
  772. Panel(np.random.randn(10, 2))
  773. def test_consolidate(self):
  774. self.assertTrue(self.panel._data.is_consolidated())
  775. self.panel['foo'] = 1.
  776. self.assertFalse(self.panel._data.is_consolidated())
  777. panel = self.panel.consolidate()
  778. self.assertTrue(panel._data.is_consolidated())
  779. def test_ctor_dict(self):
  780. itema = self.panel['ItemA']
  781. itemb = self.panel['ItemB']
  782. d = {'A': itema, 'B': itemb[5:]}
  783. d2 = {'A': itema._series, 'B': itemb[5:]._series}
  784. d3 = {'A': None,
  785. 'B': DataFrame(itemb[5:]._series),
  786. 'C': DataFrame(itema._series)}
  787. wp = Panel.from_dict(d)
  788. wp2 = Panel.from_dict(d2) # nested Dict
  789. # TODO: unused?
  790. wp3 = Panel.from_dict(d3) # noqa
  791. self.assert_index_equal(wp.major_axis, self.panel.major_axis)
  792. assert_panel_equal(wp, wp2)
  793. # intersect
  794. wp = Panel.from_dict(d, intersect=True)
  795. self.assert_index_equal(wp.major_axis, itemb.index[5:])
  796. # use constructor
  797. assert_panel_equal(Panel(d), Panel.from_dict(d))
  798. assert_panel_equal(Panel(d2), Panel.from_dict(d2))
  799. assert_panel_equal(Panel(d3), Panel.from_dict(d3))
  800. # a pathological case
  801. d4 = {'A': None, 'B': None}
  802. # TODO: unused?
  803. wp4 = Panel.from_dict(d4) # noqa
  804. assert_panel_equal(Panel(d4), Panel(items=['A', 'B']))
  805. # cast
  806. dcasted = dict((k, v.reindex(wp.major_axis).fillna(0))
  807. for k, v in compat.iteritems(d))
  808. result = Panel(dcasted, dtype=int)
  809. expected = Panel(dict((k, v.astype(int))
  810. for k, v in compat.iteritems(dcasted)))
  811. assert_panel_equal(result, expected)
  812. result = Panel(dcasted, dtype=np.int32)
  813. expected = Panel(dict((k, v.astype(np.int32))
  814. for k, v in compat.iteritems(dcasted)))
  815. assert_panel_equal(result, expected)
  816. def test_constructor_dict_mixed(self):
  817. data = dict((k, v.values) for k, v in self.panel.iteritems())
  818. result = Panel(data)
  819. exp_major = Index(np.arange(len(self.panel.major_axis)))
  820. self.assert_index_equal(result.major_axis, exp_major)
  821. result = Panel(data, items=self.panel.items,
  822. major_axis=self.panel.major_axis,
  823. minor_axis=self.panel.minor_axis)
  824. assert_panel_equal(result, self.panel)
  825. data['ItemC'] = self.panel['ItemC']
  826. result = Panel(data)
  827. assert_panel_equal(result, self.panel)
  828. # corner, blow up
  829. data['ItemB'] = data['ItemB'][:-1]
  830. self.assertRaises(Exception, Panel, data)
  831. data['ItemB'] = self.panel['ItemB'].values[:, :-1]
  832. self.assertRaises(Exception, Panel, data)
  833. def test_ctor_orderedDict(self):
  834. keys = list(set(np.random.randint(0, 5000, 100)))[
  835. :50] # unique random int keys
  836. d = OrderedDict([(k, mkdf(10, 5)) for k in keys])
  837. p = Panel(d)
  838. self.assertTrue(list(p.items) == keys)
  839. p = Panel.from_dict(d)
  840. self.assertTrue(list(p.items) == keys)
  841. def test_constructor_resize(self):
  842. data = self.panel._data
  843. items = self.panel.items[:-1]
  844. major = self.panel.major_axis[:-1]
  845. minor = self.panel.minor_axis[:-1]
  846. result = Panel(data, items=items, major_axis=major, minor_axis=minor)
  847. expected = self.panel.reindex(items=items, major=major, minor=minor)
  848. assert_panel_equal(result, expected)
  849. result = Panel(data, items=items, major_axis=major)
  850. expected = self.panel.reindex(items=items, major=major)
  851. assert_panel_equal(result, expected)
  852. result = Panel(data, items=items)
  853. expected = self.panel.reindex(items=items)
  854. assert_panel_equal(result, expected)
  855. result = Panel(data, minor_axis=minor)
  856. expected = self.panel.reindex(minor=minor)
  857. assert_panel_equal(result, expected)
  858. def test_from_dict_mixed_orient(self):
  859. df = tm.makeDataFrame()
  860. df['foo'] = 'bar'
  861. data = {'k1': df, 'k2': df}
  862. panel = Panel.from_dict(data, orient='minor')
  863. self.assertEqual(panel['foo'].values.dtype, np.object_)
  864. self.assertEqual(panel['A'].values.dtype, np.float64)
  865. def test_constructor_error_msgs(self):
  866. def testit():
  867. Panel(np.random.randn(3, 4, 5), lrange(4), lrange(5), lrange(5))
  868. assertRaisesRegexp(ValueError,
  869. "Shape of passed values is \(3, 4, 5\), "
  870. "indices imply \(4, 5, 5\)",
  871. testit)
  872. def testit():
  873. Panel(np.random.randn(3, 4, 5), lrange(5), lrange(4), lrange(5))
  874. assertRaisesRegexp(ValueError,
  875. "Shape of passed values is \(3, 4, 5\), "
  876. "indices imply \(5, 4, 5\)",
  877. testit)
  878. def testit():
  879. Panel(np.random.randn(3, 4, 5), lrange(5), lrange(5), lrange(4))
  880. assertRaisesRegexp(ValueError,
  881. "Shape of passed values is \(3, 4, 5\), "
  882. "indices imply \(5, 5, 4\)",
  883. testit)
  884. def test_conform(self):
  885. df = self.panel['ItemA'][:-5].filter(items=['A', 'B'])
  886. conformed = self.panel.conform(df)
  887. tm.assert_index_equal(conformed.index, self.panel.major_axis)
  888. tm.assert_index_equal(conformed.columns, self.panel.minor_axis)
  889. def test_convert_objects(self):
  890. # GH 4937
  891. p = Panel(dict(A=dict(a=['1', '1.0'])))
  892. expected = Panel(dict(A=dict(a=[1, 1.0])))
  893. result = p._convert(numeric=True, coerce=True)
  894. assert_panel_equal(result, expected)
  895. def test_dtypes(self):
  896. result = self.panel.dtypes
  897. expected = Series(np.dtype('float64'), index=self.panel.items)
  898. assert_series_equal(result, expected)
  899. def test_astype(self):
  900. # GH7271
  901. data = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
  902. panel = Panel(data, ['a', 'b'], ['c', 'd'], ['e', 'f'])
  903. str_data = np.array([[['1', '2'], ['3', '4']],
  904. [['5', '6'], ['7', '8']]])
  905. expected = Panel(str_data, ['a', 'b'], ['c', 'd'], ['e', 'f'])
  906. assert_panel_equal(panel.astype(str), expected)
  907. self.assertRaises(NotImplementedError, panel.astype, {0: str})
  908. def test_apply(self):
  909. # GH1148
  910. # ufunc
  911. applied = self.panel.apply(np.sqrt)
  912. self.assertTrue(assert_almost_equal(applied.values, np.sqrt(
  913. self.panel.values)))
  914. # ufunc same shape
  915. result = self.panel.apply(lambda x: x * 2, axis='items')
  916. expected = self.panel * 2
  917. assert_panel_equal(result, expected)
  918. result = self.panel.apply(lambda x: x * 2, axis='major_axis')
  919. expected = self.panel * 2
  920. assert_panel_equal(result, expected)
  921. result = self.panel.apply(lambda x: x * 2, axis='minor_axis')
  922. expected = self.panel * 2
  923. assert_panel_equal(result, expected)
  924. # reduction to DataFrame
  925. result = self.panel.apply(lambda x: x.dtype, axis='items')
  926. expected = DataFrame(np.dtype('float64'), index=self.panel.major_axis,
  927. columns=self.panel.minor_axis)
  928. assert_frame_equal(result, expected)
  929. result = self.panel.apply(lambda x: x.dtype, axis='major_axis')
  930. expected = DataFrame(np.dtype('float64'), index=self.panel.minor_axis,
  931. columns=self.panel.items)
  932. assert_frame_equal(result, expected)
  933. result = self.panel.apply(lambda x: x.dtype, axis='minor_axis')
  934. expected = DataFrame(np.dtype('float64'), index=self.panel.major_axis,
  935. columns=self.panel.items)
  936. assert_frame_equal(result, expected)
  937. # reductions via other dims
  938. expected = self.panel.sum(0)
  939. result = self.panel.apply(lambda x: x.sum(), axis='items')
  940. assert_frame_equal(result, expected)
  941. expected = self.panel.sum(1)
  942. result = self.panel.apply(lambda x: x.sum(), axis='major_axis')
  943. assert_frame_equal(result, expected)
  944. expected = self.panel.sum(2)
  945. result = self.panel.apply(lambda x: x.sum(), axis='minor_axis')
  946. assert_frame_equal(result, expected)
  947. # pass kwargs
  948. result = self.panel.apply(lambda x, y: x.sum() + y, axis='items', y=5)
  949. expected = self.panel.sum(0) + 5
  950. assert_frame_equal(result, expected)
  951. def test_apply_slabs(self):
  952. # same shape as original
  953. result = self.panel.apply(lambda x: x * 2,
  954. axis=['items', 'major_axis'])
  955. expected = (self.panel * 2).transpose('minor_axis', 'major_axis',
  956. 'items')
  957. assert_panel_equal(result, expected)
  958. result = self.panel.apply(lambda x: x * 2,
  959. axis=['major_axis', 'items'])
  960. assert_panel_equal(result, expected)
  961. result = self.panel.apply(lambda x: x * 2,
  962. axis=['items', 'minor_axis'])
  963. expected = (self.panel * 2).transpose('major_axis', 'minor_axis',
  964. 'items')
  965. assert_panel_equal(result, expected)
  966. result = self.panel.apply(lambda x: x * 2,
  967. axis=['minor_axis', 'items'])
  968. assert_panel_equal(result, expected)
  969. result = self.panel.apply(lambda x: x * 2,
  970. axis=['major_axis', 'minor_axis'])
  971. expected = self.panel * 2
  972. assert_panel_equal(result, expected)
  973. result = self.panel.apply(lambda x: x * 2,
  974. axis=['minor_axis', 'major_axis'])
  975. assert_panel_equal(result, expected)
  976. # reductions
  977. result = self.panel.apply(lambda x: x.sum(0), axis=[
  978. 'items', 'major_axis'
  979. ])
  980. expected = self.panel.sum(1).T
  981. assert_frame_equal(result, expected)
  982. result = self.panel.apply(lambda x: x.sum(1), axis=[
  983. 'items', 'major_axis'
  984. ])
  985. expected = self.panel.sum(0)
  986. assert_frame_equal(result, expected)
  987. # transforms
  988. f = lambda x: ((x.T - x.mean(1)) / x.std(1)).T
  989. # make sure that we don't trigger any warnings
  990. with tm.assert_produces_warning(False):
  991. result = self.panel.apply(f, axis=['items', 'major_axis'])
  992. expected = Panel(dict([(ax, f(self.panel.loc[:, :, ax]))
  993. for ax in self.panel.minor_axis]))
  994. assert_panel_equal(result, expected)
  995. result = self.panel.apply(f, axis=['major_axis', 'minor_axis'])
  996. expected = Panel(dict([(ax, f(self.panel.loc[ax]))
  997. for ax in self.panel.items]))
  998. assert_panel_equal(result, expected)
  999. result = self.panel.apply(f, axis=['minor_axis', 'items'])
  1000. expected = Panel(dict([(ax, f(self.panel.loc[:, ax]))
  1001. for ax in self.panel.major_axis]))
  1002. assert_panel_equal(result, expected)
  1003. # with multi-indexes
  1004. # GH7469
  1005. index = MultiIndex.from_tuples([('one', 'a'), ('one', 'b'), (
  1006. 'two', 'a'), ('two', 'b')])
  1007. dfa = DataFrame(np.array(np.arange(12, dtype='int64')).reshape(
  1008. 4, 3), columns=list("ABC"), index=index)
  1009. dfb = DataFrame(np.array(np.arange(10, 22, dtype='int64')).reshape(
  1010. 4, 3), columns=list("ABC"), index=index)
  1011. p = Panel({'f': dfa, 'g': dfb})
  1012. result = p.apply(lambda x: x.sum(), axis=0)
  1013. # on windows this will be in32
  1014. result = result.astype('int64')
  1015. expected = p.sum(0)
  1016. assert_frame_equal(result, expected)
  1017. def test_apply_no_or_zero_ndim(self):
  1018. # GH10332
  1019. self.panel = Panel(np.random.rand(5, 5, 5))
  1020. result_int = self.panel.apply(lambda df: 0, axis=[1, 2])
  1021. result_float = self.panel.apply(lambda df: 0.0, axis=[1, 2])
  1022. result_int64 = self.panel.apply(lambda df: np.int64(0), axis=[1, 2])
  1023. result_float64 = self.panel.apply(lambda df: np.float64(0.0),
  1024. axis=[1, 2])
  1025. expected_int = expected_int64 = Series([0] * 5)
  1026. expected_float = expected_float64 = Series([0.0] * 5)
  1027. assert_series_equal(result_int, expected_int)
  1028. assert_series_equal(result_int64, expected_int64)
  1029. assert_series_equal(result_float, expected_float)
  1030. assert_series_equal(result_float64, expected_float64)
  1031. def test_reindex(self):
  1032. ref = self.panel['ItemB']
  1033. # items
  1034. result = self.panel.reindex(items=['ItemA', 'ItemB'])
  1035. assert_frame_equal(result['ItemB'], ref)
  1036. # major
  1037. new_major = list(self.panel.major_axis[:10])
  1038. result = self.panel.reindex(major=new_major)
  1039. assert_frame_equal(result['ItemB'], ref.reindex(index=new_major))
  1040. # raise exception put both major and major_axis
  1041. self.assertRaises(Exception, self.panel.reindex, major_axis=new_major,
  1042. major=new_major)
  1043. # minor
  1044. new_minor = list(self.panel.minor_axis[:2])
  1045. result = self.panel.reindex(minor=new_minor)
  1046. assert_frame_equal(result['ItemB'], ref.reindex(columns=new_minor))
  1047. # this ok
  1048. result = self.panel.reindex()
  1049. assert_panel_equal(result, self.panel)
  1050. self.assertFalse(result is self.panel)
  1051. # with filling
  1052. smaller_major = self.panel.major_axis[::5]
  1053. smaller = self.panel.reindex(major=smaller_major)
  1054. larger = smaller.reindex(major=self.panel.major_axis, method='pad')
  1055. assert_frame_equal(larger.major_xs(self.panel.major_axis[1]),
  1056. smaller.major_xs(smaller_major[0]))
  1057. # don't necessarily copy
  1058. result = self.panel.reindex(major=self.panel.major_axis, copy=False)
  1059. assert_panel_equal(result, self.panel)
  1060. self.assertTrue(result is self.panel)
  1061. def test_reindex_multi(self):
  1062. # with and without copy full reindexing
  1063. result = self.panel.reindex(items=self.panel.items,
  1064. major=self.panel.major_axis,
  1065. minor=self.panel.minor_axis, copy=False)
  1066. self.assertIs(result.items, self.panel.items)
  1067. self.assertIs(result.major_axis, self.panel.major_axis)
  1068. self.assertIs(result.minor_axis, self.panel.minor_axis)
  1069. result = self.panel.reindex(items=self.panel.items,
  1070. major=self.panel.major_axis,
  1071. minor=self.panel.minor_axis, copy=False)
  1072. assert_panel_equal(result, self.panel)
  1073. # multi-axis indexing consistency
  1074. # GH 5900
  1075. df = DataFrame(np.random.randn(4, 3))
  1076. p = Panel({'Item1': df})
  1077. expected = Panel({'Item1': df})
  1078. expected['Item2'] = np.nan
  1079. items = ['Item1', 'Item2']
  1080. major_axis = np.arange(4)
  1081. minor_axis = np.arange(3)
  1082. results = []
  1083. results.append(p.reindex(items=items, major_axis=major_axis,
  1084. copy=True))
  1085. results.append(p.reindex(items=items, major_axis=major_axis,
  1086. copy=False))
  1087. results.append(p.reindex(items=items, minor_axis=minor_axis,
  1088. copy=True))
  1089. results.append(p.reindex(items=items, minor_axis=minor_axis,
  1090. copy=False))
  1091. results.append(p.reindex(items=items, major_axis=major_axis,
  1092. minor_axis=minor_axis, copy=True))
  1093. results.append(p.reindex(items=items, major_axis=major_axis,
  1094. minor_axis=minor_axis, copy=False))
  1095. for i, r in enumerate(results):
  1096. assert_panel_equal(expected, r)
  1097. def test_reindex_like(self):
  1098. # reindex_like
  1099. smaller = self.panel.reindex(items=self.panel.items[:-1],
  1100. major=self.panel.major_axis[:-1],
  1101. minor=self.panel.minor_axis[:-1])
  1102. smaller_like = self.panel.reindex_like(smaller)
  1103. assert_panel_equal(smaller, smaller_like)
  1104. def test_take(self):
  1105. # axis == 0
  1106. result = self.panel.take([2, 0, 1], axis=0)
  1107. expected = self.panel.reindex(items=['ItemC', 'ItemA', 'ItemB'])
  1108. assert_panel_equal(result, expected)
  1109. # axis >= 1
  1110. result = self.panel.take([3, 0, 1, 2], axis=2)
  1111. expected = self.panel.reindex(minor=['D', 'A', 'B', 'C'])
  1112. assert_panel_equal(result, expected)
  1113. # neg indicies ok
  1114. expected = self.panel.reindex(minor=['D', 'D', 'B', 'C'])
  1115. result = self.panel.take([3, -1, 1, 2], axis=2)
  1116. assert_panel_equal(result, expected)
  1117. self.assertRaises(Exception, self.panel.take, [4, 0, 1, 2], axis=2)
  1118. def test_sort_index(self):
  1119. import random
  1120. ritems = list(self.panel.items)
  1121. rmajor = list(self.panel.major_axis)
  1122. rminor = list(self.panel.minor_axis)
  1123. random.shuffle(ritems)
  1124. random.shuffle(rmajor)
  1125. random.shuffle(rminor)
  1126. random_order = self.panel.reindex(items=ritems)
  1127. sorted_panel = random_order.sort_index(axis=0)
  1128. assert_panel_equal(sorted_panel, self.panel)
  1129. # descending
  1130. random_order = self.panel.reindex(items=ritems)
  1131. sorted_panel = random_order.sort_index(axis=0, ascending=False)
  1132. assert_panel_equal(sorted_panel,
  1133. self.panel.reindex(items=self.panel.items[::-1]))
  1134. random_order = self.panel.reindex(major=rmajor)
  1135. sorted_panel = random_order.sort_index(axis=1)
  1136. assert_panel_equal(sorted_panel, self.panel)
  1137. random_order = self.panel.reindex(minor=rminor)
  1138. sorted_panel = random_order.sort_index(axis=2)
  1139. assert_panel_equal(sorted_panel, self.panel)
  1140. def test_fillna(self):
  1141. filled = self.panel.fillna(0)
  1142. self.assertTrue(np.isfinite(filled.values).all())
  1143. filled = self.panel.fillna(method='backfill')
  1144. assert_frame_equal(filled['ItemA'],
  1145. self.panel['ItemA'].fillna(method='backfill'))
  1146. panel = self.panel.copy()
  1147. panel['str'] = 'foo'
  1148. filled = panel.fillna(method='backfill')
  1149. assert_frame_equal(filled['ItemA'],
  1150. panel['ItemA'].fillna(method='backfill'))
  1151. empty = self.panel.reindex(items=[])
  1152. filled = empty.fillna(0)
  1153. assert_panel_equal(filled, empty)
  1154. self.assertRaises(ValueError, self.panel.fillna)
  1155. self.assertRaises(ValueError, self.panel.fillna, 5, method='ffill')
  1156. self.assertRaises(TypeError, self.panel.fillna, [1, 2])
  1157. self.assertRaises(TypeError, self.panel.fillna, (1, 2))
  1158. # limit not implemented when only value is specified
  1159. p = Panel(np.random.randn(3, 4, 5))
  1160. p.iloc[0:2, 0:2, 0:2] = np.nan
  1161. self.assertRaises(NotImplementedError, lambda: p.fillna(999, limit=1))
  1162. # Test in place fillNA
  1163. # Expected result
  1164. expected = Panel([[[0, 1], [2, 1]], [[10, 11], [12, 11]]],
  1165. items=['a', 'b'], minor_axis=['x', 'y'],
  1166. dtype=np.float64)
  1167. # method='ffill'
  1168. p1 = Panel([[[0, 1], [2, np.nan]], [[10, 11], [12, np.nan]]],
  1169. items=['a', 'b'], minor_axis=['x', 'y'],
  1170. dtype=np.float64)
  1171. p1.fillna(method='ffill', inplace=True)
  1172. assert_panel_equal(p1, expected)
  1173. # method='bfill'
  1174. p2 = Panel([[[0, np.nan], [2, 1]], [[10, np.nan], [12, 11]]],
  1175. items=['a', 'b'], minor_axis=['x', 'y'], dtype=np.float64)
  1176. p2.fillna(method='bfill', inplace=True)
  1177. assert_panel_equal(p2, expected)
  1178. def test_ffill_bfill(self):
  1179. assert_panel_equal(self.panel.ffill(),
  1180. self.panel.fillna(method='ffill'))
  1181. assert_panel_equal(self.panel.bfill(),
  1182. self.panel.fillna(method='bfill'))
  1183. def test_truncate_fillna_bug(self):
  1184. # #1823
  1185. result = self.panel.truncate(before=None, after=None, axis='items')
  1186. # it works!
  1187. result.fillna(value=0.0)
  1188. def test_swapaxes(self):
  1189. result = self.panel.swapaxes('items', 'minor')
  1190. self.assertIs(result.items, self.panel.minor_axis)
  1191. result = self.panel.swapaxes('items', 'major')
  1192. self.assertIs(result.items, self.panel.major_axis)
  1193. result = self.panel.swapaxes('major', 'minor')
  1194. self.assertIs(result.major_axis, self.panel.minor_axis)
  1195. panel = self.panel.copy()
  1196. result = panel.swapaxes('major', 'minor')
  1197. panel.values[0, 0, 1] = np.nan
  1198. expected = panel.swapaxes('major', 'minor')
  1199. assert_panel_equal(result, expected)
  1200. # this should also work
  1201. result = self.panel.swapaxes(0, 1)
  1202. self.assertIs(result.items, self.panel.major_axis)
  1203. # this works, but return a copy
  1204. result = self.panel.swapaxes('items', 'items')
  1205. assert_panel_equal(self.panel, result)
  1206. self.assertNotEqual(id(self.panel), id(result))
  1207. def test_transpose(self):
  1208. result = self.panel.transpose('minor', 'major', 'items')
  1209. expected = self.panel.swapaxes('items', 'minor')
  1210. assert_panel_equal(result, expected)
  1211. # test kwargs
  1212. result = self.panel.transpose(items='minor', major='major',
  1213. minor='items')
  1214. expected = self.panel.swapaxes('items', 'minor')
  1215. assert_panel_equal(result, expected)
  1216. # text mixture of args
  1217. result = self.panel.transpose('minor', major='major', minor='items')
  1218. expected = self.panel.swapaxes('items', 'minor')
  1219. assert_panel_equal(result, expected)
  1220. result = self.panel.transpose('minor', 'major', minor='items')
  1221. expected = self.panel.swapaxes('items', 'minor')
  1222. assert_panel_equal(result, expected)
  1223. # duplicate axes
  1224. with tm.assertRaisesRegexp(TypeError,
  1225. 'not enough/duplicate arguments'):
  1226. self.panel.transpose('minor', maj='major', minor='items')
  1227. with tm.assertRaisesRegexp(ValueError, 'repeated axis in transpose'):
  1228. self.panel.transpose('minor', 'major', major='minor',
  1229. minor='items')
  1230. result = self.panel.transpose(2, 1, 0)
  1231. assert_panel_equal(result, expected)
  1232. result = self.panel.transpose('minor', 'items', 'major')
  1233. expected = self.panel.swapaxes('items', 'minor')
  1234. expected = expected.swapaxes('major', 'minor')
  1235. assert_panel_equal(result, expected)
  1236. result = self.panel.transpose(2, 0, 1)
  1237. assert_panel_equal(result, expected)
  1238. self.assertRaises(ValueError, self.panel.transpose, 0, 0, 1)
  1239. def test_transpose_copy(self):
  1240. panel = self.panel.copy()
  1241. result = panel.transpose(2, 0, 1, copy=True)
  1242. expected = panel.swapaxes('items', 'minor')
  1243. expected = expected.swapaxes('major', 'minor')
  1244. assert_panel_equal(result, expected)
  1245. panel.values[0, 1, 1] = np.nan
  1246. self.assertTrue(notnull(result.values[1, 0, 1]))
  1247. def test_to_frame(self):
  1248. # filtered
  1249. filtered = self.panel.to_frame()
  1250. expected = self.panel.to_frame().dropna(how='any')
  1251. assert_frame_equal(filtered, expected)
  1252. # unfiltered
  1253. unfiltered = self.panel.to_frame(filter_observations=False)
  1254. assert_panel_equal(unfiltered.to_panel(), self.panel)
  1255. # names
  1256. self.assertEqual(unfiltered.index.names, ('major', 'minor'))
  1257. # unsorted, round trip
  1258. df = self.panel.to_frame(filter_observations=False)
  1259. unsorted = df.take(np.random.permutation(len(df)))
  1260. pan = unsorted.to_panel()
  1261. assert_panel_equal(pan, self.panel)
  1262. # preserve original index names
  1263. df = DataFrame(np.random.randn(6, 2),
  1264. index=[['a', 'a', 'b', 'b', 'c', 'c'],
  1265. [0, 1, 0, 1, 0, 1]],
  1266. columns=['one', 'two'])
  1267. df.index.names = ['foo', 'bar']
  1268. df.columns.name = 'baz'
  1269. rdf = df.to_panel().to_frame()
  1270. self.assertEqual(rdf.index.names, df.index.names)
  1271. self.assertEqual(rdf.columns.names, df.columns.names)
  1272. def test_to_frame_mixed(self):
  1273. panel = self.panel.fillna(0)
  1274. panel['str'] = 'foo'
  1275. panel['bool'] = panel['ItemA'] > 0
  1276. lp = panel.to_frame()
  1277. wp = lp.to_panel()
  1278. self.assertEqual(wp['bool'].values.dtype, np.bool_)
  1279. # Previously, this was mutating the underlying index and changing its
  1280. # name
  1281. assert_frame_equal(wp['bool'], panel['bool'], check_names=False)
  1282. # GH 8704
  1283. # with categorical
  1284. df = panel.to_frame()
  1285. df['category'] = df['str'].astype('category')
  1286. # to_panel
  1287. # TODO: this converts back to object
  1288. p = df.to_panel()
  1289. expected = panel.copy()
  1290. expected['category'] = 'foo'
  1291. assert_panel_equal(p, expected)
  1292. def test_to_frame_multi_major(self):
  1293. idx = MultiIndex.from_tuples([(1, 'one'), (1, 'two'), (2, 'one'), (
  1294. 2, 'two')])
  1295. df = DataFrame([[1, 'a', 1], [2, 'b', 1], [3, 'c', 1], [4, 'd', 1]],
  1296. columns=['A', 'B', 'C'], index=idx)
  1297. wp = Panel({'i1': df, 'i2': df})
  1298. expected_idx = MultiIndex.from_tuples(
  1299. [
  1300. (1, 'one', 'A'), (1, 'one', 'B'),
  1301. (1, 'one', 'C'), (1, 'two', 'A'),
  1302. (1, 'two', 'B'), (1, 'two', 'C'),
  1303. (2, 'one', 'A'), (2, 'one', 'B'),
  1304. (2, 'one', 'C'), (2, 'two', 'A'),
  1305. (2, 'two', 'B'), (2, 'two', 'C')
  1306. ],
  1307. names=[None, None, 'minor'])
  1308. expected = DataFrame({'i1': [1, 'a', 1, 2, 'b', 1, 3,
  1309. 'c', 1, 4, 'd', 1],
  1310. 'i2': [1, 'a', 1, 2, 'b',
  1311. 1, 3, 'c', 1, 4, 'd', 1]},
  1312. index=expected_idx)
  1313. result = wp.to_frame()
  1314. assert_frame_equal(result, expected)
  1315. wp.iloc[0, 0].iloc[0] = np.nan # BUG on setting. GH #5773
  1316. result = wp.to_frame()
  1317. assert_frame_equal(result, expected[1:])
  1318. idx = MultiIndex.from_tuples([(1, 'two'), (1, 'one'), (2, 'one'), (
  1319. np.nan, 'two')])
  1320. df = DataFrame([[1, 'a', 1], [2, 'b', 1], [3, 'c', 1], [4, 'd', 1]],
  1321. columns=['A', 'B', 'C'], index=idx)
  1322. wp = Panel({'i1': df, 'i2': df})
  1323. ex_idx = MultiIndex.from_tuples([(1, 'two', 'A'), (1, 'two', 'B'),
  1324. (1, 'two', 'C'),
  1325. (1, 'one', 'A'),
  1326. (1, 'one', 'B'),
  1327. (1, 'one', 'C'),
  1328. (2, 'one', 'A'),
  1329. (2, 'one', 'B'),
  1330. (2, 'one', 'C'),
  1331. (np.nan, 'two', 'A'),
  1332. (np.nan, 'two', 'B'),
  1333. (np.nan, 'two', 'C')],
  1334. names=[None, None, 'minor'])
  1335. expected.index = ex_idx
  1336. result = wp.to_frame()
  1337. assert_frame_equal(result, expected)
  1338. def test_to_frame_multi_major_minor(self):
  1339. cols = MultiIndex(levels=[['C_A', 'C_B'], ['C_1', 'C_2']],
  1340. labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
  1341. idx = MultiIndex.from_tuples([(1, 'one'), (1, 'two'), (2, 'one'), (
  1342. 2, 'two'), (3, 'three'), (4, 'four')])
  1343. df = DataFrame([[1, 2, 11, 12], [3, 4, 13, 14],
  1344. ['a', 'b', 'w', 'x'],
  1345. ['c', 'd', 'y', 'z'], [-1, -2, -3, -4],
  1346. [-5, -6, -7, -8]], columns=cols, index=idx)
  1347. wp = Panel({'i1': df, 'i2': df})
  1348. exp_idx = MultiIndex.from_tuples(
  1349. [(1, 'one', 'C_A', 'C_1'), (1, 'one', 'C_A', 'C_2'),
  1350. (1, 'one', 'C_B', 'C_1'), (1, 'one', 'C_B', 'C_2'),
  1351. (1, 'two', 'C_A', 'C_1'), (1, 'two', 'C_A', 'C_2'),
  1352. (1, 'two', 'C_B', 'C_1'), (1, 'two', 'C_B', 'C_2'),
  1353. (2, 'one', 'C_A', 'C_1'), (2, 'one', 'C_A', 'C_2'),
  1354. (2, 'one', 'C_B', 'C_1'), (2, 'one', 'C_B', 'C_2'),
  1355. (2, 'two', 'C_A', 'C_1'), (2, 'two', 'C_A', 'C_2'),
  1356. (2, 'two', 'C_B', 'C_1'), (2, 'two', 'C_B', 'C_2'),
  1357. (3, 'three', 'C_A', 'C_1'), (3, 'three', 'C_A', 'C_2'),
  1358. (3, 'three', 'C_B', 'C_1'), (3, 'three', 'C_B', 'C_2'),
  1359. (4, 'four', 'C_A', 'C_1'), (4, 'four', 'C_A', 'C_2'),
  1360. (4, 'four', 'C_B', 'C_1'), (4, 'four', 'C_B', 'C_2')],
  1361. names=[None, None, None, None])
  1362. exp_val = [[1, 1], [2, 2], [11, 11], [12, 12], [3, 3], [4, 4],
  1363. [13, 13], [14, 14], ['a', 'a'], ['b', 'b'], ['w', 'w'],
  1364. ['x', 'x'], ['c', 'c'], ['d', 'd'], ['y', 'y'], ['z', 'z'],
  1365. [-1, -1], [-2, -2], [-3, -3], [-4, -4], [-5, -5], [-6, -6],
  1366. [-7, -7], [-8, -8]]
  1367. result = wp.to_frame()
  1368. expected = DataFrame(exp_val, columns=['i1', 'i2'], index=exp_idx)
  1369. assert_frame_equal(result, expected)
  1370. def test_to_frame_multi_drop_level(self):
  1371. idx = MultiIndex.from_tuples([(1, 'one'), (2, 'one'), (2, 'two')])
  1372. df = DataFrame({'A': [np.nan, 1, 2]}, index=idx)
  1373. wp = Panel({'i1': df, 'i2': df})
  1374. result = wp.to_frame()
  1375. exp_idx = MultiIndex.from_tuples([(2, 'one', 'A'), (2, 'two', 'A')],
  1376. names=[None, None, 'minor'])
  1377. expected = DataFrame({'i1': [1., 2], 'i2': [1., 2]}, index=exp_idx)
  1378. assert_frame_equal(result, expected)
  1379. def test_to_panel_na_handling(self):
  1380. df = DataFrame(np.random.randint(0, 10, size=20).reshape((10, 2)),
  1381. index=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
  1382. [0, 1, 2, 3, 4, 5, 2, 3, 4, 5]])
  1383. panel = df.to_panel()
  1384. self.assertTrue(isnull(panel[0].ix[1, [0, 1]]).all())
  1385. def test_to_panel_duplicates(self):
  1386. # #2441
  1387. df = DataFrame({'a': [0, 0, 1], 'b': [1, 1, 1], 'c': [1, 2, 3]})
  1388. idf = df.set_index(['a', 'b'])
  1389. assertRaisesRegexp(ValueError, 'non-uniquely indexed', idf.to_panel)
  1390. def test_panel_dups(self):
  1391. # GH 4960
  1392. # duplicates in an index
  1393. # items
  1394. data = np.random.randn(5, 100, 5)
  1395. no_dup_panel = Panel(data, items=list("ABCDE"))
  1396. panel = Panel(data, items=list("AACDE"))
  1397. expected = no_dup_panel['A']
  1398. result = panel.iloc[0]
  1399. assert_frame_equal(result, expected)
  1400. expected = no_dup_panel['E']
  1401. result = panel.loc['E']
  1402. assert_frame_equal(result, expected)
  1403. expected = no_dup_panel.loc[['A', 'B']]
  1404. expected.items = ['A', 'A']
  1405. result = panel.loc['A']
  1406. assert_panel_equal(result, expected)
  1407. # major
  1408. data = np.random.randn(5, 5, 5)
  1409. no_dup_panel = Panel(data, major_axis=list("ABCDE"))
  1410. panel = Panel(data, major_axis=list("AACDE"))
  1411. expected = no_dup_panel.loc[:, 'A']
  1412. result = panel.iloc[:, 0]
  1413. assert_frame_equal(result, expected)
  1414. expected = no_dup_panel.loc[:, 'E']
  1415. result = panel.loc[:, 'E']
  1416. assert_frame_equal(result, expected)
  1417. expected = no_dup_panel.loc[:, ['A', 'B']]
  1418. expected.major_axis = ['A', 'A']
  1419. result = panel.loc[:, 'A']
  1420. assert_panel_equal(result, expected)
  1421. # minor
  1422. data = np.random.randn(5, 100, 5)
  1423. no_dup_panel = Panel(data, minor_axis=list("ABCDE"))
  1424. panel = Panel(data, minor_axis=list("AACDE"))
  1425. expected = no_dup_panel.loc[:, :, 'A']
  1426. result = panel.iloc[:, :, 0]
  1427. assert_frame_equal(result, expected)
  1428. expected = no_dup_panel.loc[:, :, 'E']
  1429. result = panel.loc[:, :, 'E']
  1430. assert_frame_equal(result, expected)
  1431. expected = no_dup_panel.loc[:, :, ['A', 'B']]
  1432. expected.minor_axis = ['A', 'A']
  1433. result = panel.loc[:, :, 'A']
  1434. assert_panel_equal(result, expected)
  1435. def test_filter(self):
  1436. pass
  1437. def test_compound(self):
  1438. compounded = self.panel.compound()
  1439. assert_series_equal(compounded['ItemA'],
  1440. (1 + self.panel['ItemA']).product(0) - 1,
  1441. check_names=False)
  1442. def test_shift(self):
  1443. # major
  1444. idx = self.panel.major_axis[0]
  1445. idx_lag = self.panel.major_axis[1]
  1446. shifted = self.panel.shift(1)
  1447. assert_frame_equal(self.panel.major_xs(idx), shifted.major_xs(idx_lag))
  1448. # minor
  1449. idx = self.panel.minor_axis[0]
  1450. idx_lag = self.panel.minor_axis[1]
  1451. shifted = self.panel.shift(1, axis='minor')
  1452. assert_frame_equal(self.panel.minor_xs(idx), shifted.minor_xs(idx_lag))
  1453. # items
  1454. idx = self.panel.items[0]
  1455. idx_lag = self.panel.items[1]
  1456. shifted = self.panel.shift(1, axis='items')
  1457. assert_frame_equal(self.panel[idx], shifted[idx_lag])
  1458. # negative numbers, #2164
  1459. result = self.panel.shift(-1)
  1460. expected = Panel(dict((i, f.shift(-1)[:-1])
  1461. for i, f in self.panel.iteritems()))
  1462. assert_panel_equal(result, expected)
  1463. # mixed dtypes #6959
  1464. data = [('item ' + ch, makeMixedDataFrame()) for ch in list('abcde')]
  1465. data = dict(data)
  1466. mixed_panel = Panel.from_dict(data, orient='minor')
  1467. shifted = mixed_panel.shift(1)
  1468. assert_series_equal(mixed_panel.dtypes, shifted.dtypes)
  1469. def test_tshift(self):
  1470. # PeriodIndex
  1471. ps = tm.makePeriodPanel()
  1472. shifted = ps.tshift(1)
  1473. unshifted = shifted.tshift(-1)
  1474. assert_panel_equal(unshifted, ps)
  1475. shifted2 = ps.tshift(freq='B')
  1476. assert_panel_equal(shifted, shifted2)
  1477. shifted3 = ps.tshift(freq=bday)
  1478. assert_panel_equal(shifted, shifted3)
  1479. assertRaisesRegexp(ValueError, 'does not match', ps.tshift, freq='M')
  1480. # DatetimeIndex
  1481. panel = _panel
  1482. shifted = panel.tshift(1)
  1483. unshifted = shifted.tshift(-1)
  1484. assert_panel_equal(panel, unshifted)
  1485. shifted2 = panel.tshift(freq=panel.major_axis.freq)
  1486. assert_panel_equal(shifted, shifted2)
  1487. inferred_ts = Panel(panel.values, items=panel.items,
  1488. major_axis=Index(np.asarray(panel.major_axis)),
  1489. minor_axis=panel.minor_axis)
  1490. shifted = inferred_ts.tshift(1)
  1491. unshifted = shifted.tshift(-1)
  1492. assert_panel_equal(shifted, panel.tshift(1))
  1493. assert_panel_equal(unshifted, inferred_ts)
  1494. no_freq = panel.ix[:, [0, 5, 7], :]
  1495. self.assertRaises(ValueError, no_freq.tshift)
  1496. def test_pct_change(self):
  1497. df1 = DataFrame({'c1': [1, 2, 5], 'c2': [3, 4, 6]})
  1498. df2 = df1 + 1
  1499. df3 = DataFrame({'c1': [3, 4, 7], 'c2': [5, 6, 8]})
  1500. wp = Panel({'i1': df1, 'i2': df2, 'i3': df3})
  1501. # major, 1
  1502. result = wp.pct_change() # axis='major'
  1503. expected = Panel({'i1': df1.pct_change(),
  1504. 'i2': df2.pct_change(),
  1505. 'i3': df3.pct_change()})
  1506. assert_panel_equal(result, expected)
  1507. result = wp.pct_change(axis=1)
  1508. assert_panel_equal(result, expected)
  1509. # major, 2
  1510. result = wp.pct_change(periods=2)
  1511. expected = Panel({'i1': df1.pct_change(2),
  1512. 'i2': df2.pct_change(2),
  1513. 'i3': df3.pct_change(2)})
  1514. assert_panel_equal(result, expected)
  1515. # minor, 1
  1516. result = wp.pct_change(axis='minor')
  1517. expected = Panel({'i1': df1.pct_change(axis=1),
  1518. 'i2': df2.pct_change(axis=1),
  1519. 'i3': df3.pct_change(axis=1)})
  1520. assert_panel_equal(result, expected)
  1521. result = wp.pct_change(axis=2)
  1522. assert_panel_equal(result, expected)
  1523. # minor, 2
  1524. result = wp.pct_change(periods=2, axis='minor')
  1525. expected = Panel({'i1': df1.pct_change(periods=2, axis=1),
  1526. 'i2': df2.pct_change(periods=2, axis=1),
  1527. 'i3': df3.pct_change(periods=2, axis=1)})
  1528. assert_panel_equal(result, expected)
  1529. # items, 1
  1530. result = wp.pct_change(axis='items')
  1531. expected = Panel({'i1': DataFrame({'c1': [np.nan, np.nan, np.nan],
  1532. 'c2': [np.nan, np.nan, np.nan]}),
  1533. 'i2': DataFrame({'c1': [1, 0.5, .2],
  1534. 'c2': [1. / 3, 0.25, 1. / 6]}),
  1535. 'i3': DataFrame({'c1': [.5, 1. / 3, 1. / 6],
  1536. 'c2': [.25, .2, 1. / 7]})})
  1537. assert_panel_equal(result, expected)
  1538. result = wp.pct_change(axis=0)
  1539. assert_panel_equal(result, expected)
  1540. # items, 2
  1541. result = wp.pct_change(periods=2, axis='items')
  1542. expected = Panel({'i1': DataFrame({'c1': [np.nan, np.nan, np.nan],
  1543. 'c2': [np.nan, np.nan, np.nan]}),
  1544. 'i2': DataFrame({'c1': [np.nan, np.nan, np.nan],
  1545. 'c2': [np.nan, np.nan, np.nan]}),
  1546. 'i3': DataFrame({'c1': [2, 1, .4],
  1547. 'c2': [2. / 3, .5, 1. / 3]})})
  1548. assert_panel_equal(result, expected)
  1549. def test_round(self):
  1550. values = [[[-3.2, 2.2], [0, -4.8213], [3.123, 123.12],
  1551. [-1566.213, 88.88], [-12, 94.5]],
  1552. [[-5.82, 3.5], [6.21, -73.272], [-9.087, 23.12],
  1553. [272.212, -99.99], [23, -76.5]]]
  1554. evalues = [[[float(np.around(i)) for i in j] for j in k]
  1555. for k in values]
  1556. p = Panel(values, items=['Item1', 'Item2'],
  1557. major_axis=pd.date_range('1/1/2000', periods=5),
  1558. minor_axis=['A', 'B'])
  1559. expected = Panel(evalues, items=['Item1', 'Item2'],
  1560. major_axis=pd.date_range('1/1/2000', periods=5),
  1561. minor_axis=['A', 'B'])
  1562. result = p.round()
  1563. self.assert_panel_equal(expected, result)
  1564. def test_numpy_round(self):
  1565. values = [[[-3.2, 2.2], [0, -4.8213], [3.123, 123.12],
  1566. [-1566.213, 88.88], [-12, 94.5]],
  1567. [[-5.82, 3.5], [6.21, -73.272], [-9.087, 23.12],
  1568. [272.212, -99.99], [23, -76.5]]]
  1569. evalues = [[[float(np.around(i)) for i in j] for j in k]
  1570. for k in values]
  1571. p = Panel(values, items=['Item1', 'Item2'],
  1572. major_axis=pd.date_range('1/1/2000', periods=5),
  1573. minor_axis=['A', 'B'])
  1574. expected = Panel(evalues, items=['Item1', 'Item2'],
  1575. major_axis=pd.date_range('1/1/2000', periods=5),
  1576. minor_axis=['A', 'B'])
  1577. result = np.round(p)
  1578. self.assert_panel_equal(expected, result)
  1579. msg = "the 'out' parameter is not supported"
  1580. tm.assertRaisesRegexp(ValueError, msg, np.round, p, out=p)
  1581. def test_multiindex_get(self):
  1582. ind = MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1), ('b', 2)],
  1583. names=['first', 'second'])
  1584. wp = Panel(np.random.random((4, 5, 5)),
  1585. items=ind,
  1586. major_axis=np.arange(5),
  1587. minor_axis=np.arange(5))
  1588. f1 = wp['a']
  1589. f2 = wp.ix['a']
  1590. assert_panel_equal(f1, f2)
  1591. self.assertTrue((f1.items == [1, 2]).all())
  1592. self.assertTrue((f2.items == [1, 2]).all())
  1593. ind = MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1)],
  1594. names=['first', 'second'])
  1595. def test_multiindex_blocks(self):
  1596. ind = MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1)],
  1597. names=['first', 'second'])
  1598. wp = Panel(self.panel._data)
  1599. wp.items = ind
  1600. f1 = wp['a']
  1601. self.assertTrue((f1.items == [1, 2]).all())
  1602. f1 = wp[('b', 1)]
  1603. self.assertTrue((f1.columns == ['A', 'B', 'C', 'D']).all())
  1604. def test_repr_empty(self):
  1605. empty = Panel()
  1606. repr(empty)
  1607. def test_rename(self):
  1608. mapper = {'ItemA': 'foo', 'ItemB': 'bar', 'ItemC': 'baz'}
  1609. renamed = self.panel.rename_axis(mapper, axis=0)
  1610. exp = Index(['foo', 'bar', 'baz'])
  1611. self.assert_index_equal(renamed.items, exp)
  1612. renamed = self.panel.rename_axis(str.lower, axis=2)
  1613. exp = Index(['a', 'b', 'c', 'd'])
  1614. self.assert_index_equal(renamed.minor_axis, exp)
  1615. # don't copy
  1616. renamed_nocopy = self.panel.rename_axis(mapper, axis=0, copy=False)
  1617. renamed_nocopy['foo'] = 3.
  1618. self.assertTrue((self.panel['ItemA'].values == 3).all())
  1619. def test_get_attr(self):
  1620. assert_frame_equal(self.panel['ItemA'], self.panel.ItemA)
  1621. # specific cases from #3440
  1622. self.panel['a'] = self.panel['ItemA']
  1623. assert_frame_equal(self.panel['a'], self.panel.a)
  1624. self.panel['i'] = self.panel['ItemA']
  1625. assert_frame_equal(self.panel['i'], self.panel.i)
  1626. def test_from_frame_level1_unsorted(self):
  1627. tuples = [('MSFT', 3), ('MSFT', 2), ('AAPL', 2), ('AAPL', 1),
  1628. ('MSFT', 1)]
  1629. midx = MultiIndex.from_tuples(tuples)
  1630. df = DataFrame(np.random.rand(5, 4), index=midx)
  1631. p = df.to_panel()
  1632. assert_frame_equal(p.minor_xs(2), df.xs(2, level=1).sort_index())
  1633. def test_to_excel(self):
  1634. try:
  1635. import xlwt # noqa
  1636. import xlrd # noqa
  1637. import openpyxl # noqa
  1638. from pandas.io.excel import ExcelFile
  1639. except ImportError:
  1640. raise nose.SkipTest("need xlwt xlrd openpyxl")
  1641. for ext in ['xls', 'xlsx']:
  1642. with ensure_clean('__tmp__.' + ext) as path:
  1643. self.panel.to_excel(path)
  1644. try:
  1645. reader = ExcelFile(path)
  1646. except ImportError:
  1647. raise nose.SkipTest("need xlwt xlrd openpyxl")
  1648. for item, df in self.panel.iteritems():
  1649. recdf = reader.parse(str(item), index_col=0)
  1650. assert_frame_equal(df, recdf)
  1651. def test_to_excel_xlsxwriter(self):
  1652. try:
  1653. import xlrd # noqa
  1654. import xlsxwriter # noqa
  1655. from pandas.io.excel import ExcelFile
  1656. except ImportError:
  1657. raise nose.SkipTest("Requires xlrd and xlsxwriter. Skipping test.")
  1658. with ensure_clean('__tmp__.xlsx') as path:
  1659. self.panel.to_excel(path, engine='xlsxwriter')
  1660. try:
  1661. reader = ExcelFile(path)
  1662. except ImportError as e:
  1663. raise nose.SkipTest("cannot write excel file: %s" % e)
  1664. for item, df in self.panel.iteritems():
  1665. recdf = reader.parse(str(item), index_col=0)
  1666. assert_frame_equal(df, recdf)
  1667. def test_dropna(self):
  1668. p = Panel(np.random.randn(4, 5, 6), major_axis=list('abcde'))
  1669. p.ix[:, ['b', 'd'], 0] = np.nan
  1670. result = p.dropna(axis=1)
  1671. exp = p.ix[:, ['a', 'c', 'e'], :]
  1672. assert_panel_equal(result, exp)
  1673. inp = p.copy()
  1674. inp.dropna(axis=1, inplace=True)
  1675. assert_panel_equal(inp, exp)
  1676. result = p.dropna(axis=1, how='all')
  1677. assert_panel_equal(result, p)
  1678. p.ix[:, ['b', 'd'], :] = np.nan
  1679. result = p.dropna(axis=1, how='all')
  1680. exp = p.ix[:, ['a', 'c', 'e'], :]
  1681. assert_panel_equal(result, exp)
  1682. p = Panel(np.random.randn(4, 5, 6), items=list('abcd'))
  1683. p.ix[['b'], :, 0] = np.nan
  1684. result = p.dropna()
  1685. exp = p.ix[['a', 'c', 'd']]
  1686. assert_panel_equal(result, exp)
  1687. result = p.dropna(how='all')
  1688. assert_panel_equal(result, p)
  1689. p.ix['b'] = np.nan
  1690. result = p.dropna(how='all')
  1691. exp = p.ix[['a', 'c', 'd']]
  1692. assert_panel_equal(result, exp)
  1693. def test_drop(self):
  1694. df = DataFrame({"A": [1, 2], "B": [3, 4]})
  1695. panel = Panel({"One": df, "Two": df})
  1696. def check_drop(drop_val, axis_number, aliases, expected):
  1697. try:
  1698. actual = panel.drop(drop_val, axis=axis_number)
  1699. assert_panel_equal(actual, expected)
  1700. for alias in aliases:
  1701. actual = panel.drop(drop_val, axis=alias)
  1702. assert_panel_equal(actual, expected)
  1703. except AssertionError:
  1704. pprint_thing("Failed with axis_number %d and aliases: %s" %
  1705. (axis_number, aliases))
  1706. raise
  1707. # Items
  1708. expected = Panel({"One": df})
  1709. check_drop('Two', 0, ['items'], expected)
  1710. self.assertRaises(ValueError, panel.drop, 'Three')
  1711. # errors = 'ignore'
  1712. dropped = panel.drop('Three', errors='ignore')
  1713. assert_panel_equal(dropped, panel)
  1714. dropped = panel.drop(['Two', 'Three'], errors='ignore')
  1715. expected = Panel({"One": df})
  1716. assert_panel_equal(dropped, expected)
  1717. # Major
  1718. exp_df = DataFrame({"A": [2], "B": [4]}, index=[1])
  1719. expected = Panel({"One": exp_df, "Two": exp_df})
  1720. check_drop(0, 1, ['major_axis', 'major'], expected)
  1721. exp_df = DataFrame({"A": [1], "B": [3]}, index=[0])
  1722. expected = Panel({"One": exp_df, "Two": exp_df})
  1723. check_drop([1], 1, ['major_axis', 'major'], expected)
  1724. # Minor
  1725. exp_df = df[['B']]
  1726. expected = Panel({"One": exp_df, "Two": exp_df})
  1727. check_drop(["A"], 2, ['minor_axis', 'minor'], expected)
  1728. exp_df = df[['A']]
  1729. expected = Panel({"One": exp_df, "Two": exp_df})
  1730. check_drop("B", 2, ['minor_axis', 'minor'], expected)
  1731. def test_update(self):
  1732. pan = Panel([[[1.5, np.nan, 3.], [1.5, np.nan, 3.], [1.5, np.nan, 3.],
  1733. [1.5, np.nan, 3.]],
  1734. [[1.5, np.nan, 3.], [1.5, np.nan, 3.], [1.5, np.nan, 3.],
  1735. [1.5, np.nan, 3.]]])
  1736. other = Panel([[[3.6, 2., np.nan], [np.nan, np.nan, 7]]], items=[1])
  1737. pan.update(other)
  1738. expected = Panel([[[1.5, np.nan, 3.], [1.5, np.nan, 3.],
  1739. [1.5, np.nan, 3.], [1.5, np.nan, 3.]],
  1740. [[3.6, 2., 3], [1.5, np.nan, 7], [1.5, np.nan, 3.],
  1741. [1.5, np.nan, 3.]]])
  1742. assert_panel_equal(pan, expected)
  1743. def test_update_from_dict(self):
  1744. pan = Panel({'one': DataFrame([[1.5, np.nan, 3], [1.5, np.nan, 3],
  1745. [1.5, np.nan, 3.], [1.5, np.nan, 3.]]),
  1746. 'two': DataFrame([[1.5, np.nan, 3.], [1.5, np.nan, 3.],
  1747. [1.5, np.nan, 3.], [1.5, np.nan, 3.]])})
  1748. other = {'two': DataFrame([[3.6, 2., np.nan], [np.nan, np.nan, 7]])}
  1749. pan.update(other)
  1750. expected = Panel(
  1751. {'two': DataFrame([[3.6, 2., 3], [1.5, np.nan, 7],
  1752. [1.5, np.nan, 3.], [1.5, np.nan, 3.]]),
  1753. 'one': DataFrame([[1.5, np.nan, 3.], [1.5, np.nan, 3.],
  1754. [1.5, np.nan, 3.], [1.5, np.nan, 3.]])})
  1755. assert_panel_equal(pan, expected)
  1756. def test_update_nooverwrite(self):
  1757. pan = Panel([[[1.5, np.nan, 3.], [1.5, np.nan, 3.], [1.5, np.nan, 3.],
  1758. [1.5, np.nan, 3.]],
  1759. [[1.5, np.nan, 3.], [1.5, np.nan, 3.], [1.5, np.nan, 3.],
  1760. [1.5, np.nan, 3.]]])
  1761. other = Panel([[[3.6, 2., np.nan], [np.nan, np.nan, 7]]], items=[1])
  1762. pan.update(other, overwrite=False)
  1763. expected = Panel([[[1.5, np.nan, 3], [1.5, np.nan, 3],
  1764. [1.5, np.nan, 3.], [1.5, np.nan, 3.]],
  1765. [[1.5, 2., 3.], [1.5, np.nan, 3.], [1.5, np.nan, 3.],
  1766. [1.5, np.nan, 3.]]])
  1767. assert_panel_equal(pan, expected)
  1768. def test_update_filtered(self):
  1769. pan = Panel([[[1.5, np.nan, 3.], [1.5, np.nan, 3.], [1.5, np.nan, 3.],
  1770. [1.5, np.nan, 3.]],
  1771. [[1.5, np.nan, 3.], [1.5, np.nan, 3.], [1.5, np.nan, 3.],
  1772. [1.5, np.nan, 3.]]])
  1773. other = Panel([[[3.6, 2., np.nan], [np.nan, np.nan, 7]]], items=[1])
  1774. pan.update(other, filter_func=lambda x: x > 2)
  1775. expected = Panel([[[1.5, np.nan, 3.], [1.5, np.nan, 3.],
  1776. [1.5, np.nan, 3.], [1.5, np.nan, 3.]],
  1777. [[1.5, np.nan, 3], [1.5, np.nan, 7],
  1778. [1.5, np.nan, 3.], [1.5, np.nan, 3.]]])
  1779. assert_panel_equal(pan, expected)
  1780. def test_update_raise(self):
  1781. pan = Panel([[[1.5, np.nan, 3.], [1.5, np.nan, 3.], [1.5, np.nan, 3.],
  1782. [1.5, np.nan, 3.]],
  1783. [[1.5, np.nan, 3.], [1.5, np.nan, 3.], [1.5, np.nan, 3.],
  1784. [1.5, np.nan, 3.]]])
  1785. self.assertRaises(Exception, pan.update, *(pan, ),
  1786. **{'raise_conflict': True})
  1787. def test_all_any(self):
  1788. self.assertTrue((self.panel.all(axis=0).values == nanall(
  1789. self.panel, axis=0)).all())
  1790. self.assertTrue((self.panel.all(axis=1).values == nanall(
  1791. self.panel, axis=1).T).all())
  1792. self.assertTrue((self.panel.all(axis=2).values == nanall(
  1793. self.panel, axis=2).T).all())
  1794. self.assertTrue((self.panel.any(axis=0).values == nanany(
  1795. self.panel, axis=0)).all())
  1796. self.assertTrue((self.panel.any(axis=1).values == nanany(
  1797. self.panel, axis=1).T).all())
  1798. self.assertTrue((self.panel.any(axis=2).values == nanany(
  1799. self.panel, axis=2).T).all())
  1800. def test_all_any_unhandled(self):
  1801. self.assertRaises(NotImplementedError, self.panel.all, bool_only=True)
  1802. self.assertRaises(NotImplementedError, self.panel.any, bool_only=True)
  1803. class TestLongPanel(tm.TestCase):
  1804. """
  1805. LongPanel no longer exists, but...
  1806. """
  1807. _multiprocess_can_split_ = True
  1808. def setUp(self):
  1809. import warnings
  1810. warnings.filterwarnings(action='ignore', category=FutureWarning)
  1811. panel = tm.makePanel()
  1812. tm.add_nans(panel)
  1813. self.panel = panel.to_frame()
  1814. self.unfiltered_panel = panel.to_frame(filter_observations=False)
  1815. def test_ops_differently_indexed(self):
  1816. # trying to set non-identically indexed panel
  1817. wp = self.panel.to_panel()
  1818. wp2 = wp.reindex(major=wp.major_axis[:-1])
  1819. lp2 = wp2.to_frame()
  1820. result = self.panel + lp2
  1821. assert_frame_equal(result.reindex(lp2.index), lp2 * 2)
  1822. # careful, mutation
  1823. self.panel['foo'] = lp2['ItemA']
  1824. assert_series_equal(self.panel['foo'].reindex(lp2.index), lp2['ItemA'],
  1825. check_names=False)
  1826. def test_ops_scalar(self):
  1827. result = self.panel.mul(2)
  1828. expected = DataFrame.__mul__(self.panel, 2)
  1829. assert_frame_equal(result, expected)
  1830. def test_combineFrame(self):
  1831. wp = self.panel.to_panel()
  1832. result = self.panel.add(wp['ItemA'].stack(), axis=0)
  1833. assert_frame_equal(result.to_panel()['ItemA'], wp['ItemA'] * 2)
  1834. def test_combinePanel(self):
  1835. wp = self.panel.to_panel()
  1836. result = self.panel.add(self.panel)
  1837. wide_result = result.to_panel()
  1838. assert_frame_equal(wp['ItemA'] * 2, wide_result['ItemA'])
  1839. # one item
  1840. result = self.panel.add(self.panel.filter(['ItemA']))
  1841. def test_combine_scalar(self):
  1842. result = self.panel.mul(2)
  1843. expected = DataFrame(self.panel._data) * 2
  1844. assert_frame_equal(result, expected)
  1845. def test_combine_series(self):
  1846. s = self.panel['ItemA'][:10]
  1847. result = self.panel.add(s, axis=0)
  1848. expected = DataFrame.add(self.panel, s, axis=0)
  1849. assert_frame_equal(result, expected)
  1850. s = self.panel.ix[5]
  1851. result = self.panel + s
  1852. expected = DataFrame.add(self.panel, s, axis=1)
  1853. assert_frame_equal(result, expected)
  1854. def test_operators(self):
  1855. wp = self.panel.to_panel()
  1856. result = (self.panel + 1).to_panel()
  1857. assert_frame_equal(wp['ItemA'] + 1, result['ItemA'])
  1858. def test_arith_flex_panel(self):
  1859. ops = ['add', 'sub', 'mul', 'div', 'truediv', 'pow', 'floordiv', 'mod']
  1860. if not compat.PY3:
  1861. aliases = {}
  1862. else:
  1863. aliases = {'div': 'truediv'}
  1864. self.panel = self.panel.to_panel()
  1865. for n in [np.random.randint(-50, -1), np.random.randint(1, 50), 0]:
  1866. for op in ops:
  1867. alias = aliases.get(op, op)
  1868. f = getattr(operator, alias)
  1869. exp = f(self.panel, n)
  1870. result = getattr(self.panel, op)(n)
  1871. assert_panel_equal(result, exp, check_panel_type=True)
  1872. # rops
  1873. r_f = lambda x, y: f(y, x)
  1874. exp = r_f(self.panel, n)
  1875. result = getattr(self.panel, 'r' + op)(n)
  1876. assert_panel_equal(result, exp)
  1877. def test_sort(self):
  1878. def is_sorted(arr):
  1879. return (arr[1:] > arr[:-1]).any()
  1880. sorted_minor = self.panel.sortlevel(level=1)
  1881. self.assertTrue(is_sorted(sorted_minor.index.labels[1]))
  1882. sorted_major = sorted_minor.sortlevel(level=0)
  1883. self.assertTrue(is_sorted(sorted_major.index.labels[0]))
  1884. def test_to_string(self):
  1885. buf = StringIO()
  1886. self.panel.to_string(buf)
  1887. def test_to_sparse(self):
  1888. if isinstance(self.panel, Panel):
  1889. msg = 'sparsifying is not supported'
  1890. tm.assertRaisesRegexp(NotImplementedError, msg,
  1891. self.panel.to_sparse)
  1892. def test_truncate(self):
  1893. dates = self.panel.index.levels[0]
  1894. start, end = dates[1], dates[5]
  1895. trunced = self.panel.truncate(start, end).to_panel()
  1896. expected = self.panel.to_panel()['ItemA'].truncate(start, end)
  1897. # TODO trucate drops index.names
  1898. assert_frame_equal(trunced['ItemA'], expected, check_names=False)
  1899. trunced = self.panel.truncate(before=start).to_panel()
  1900. expected = self.panel.to_panel()['ItemA'].truncate(before=start)
  1901. # TODO trucate drops index.names
  1902. assert_frame_equal(trunced['ItemA'], expected, check_names=False)
  1903. trunced = self.panel.truncate(after=end).to_panel()
  1904. expected = self.panel.to_panel()['ItemA'].truncate(after=end)
  1905. # TODO trucate drops index.names
  1906. assert_frame_equal(trunced['ItemA'], expected, check_names=False)
  1907. # truncate on dates that aren't in there
  1908. wp = self.panel.to_panel()
  1909. new_index = wp.major_axis[::5]
  1910. wp2 = wp.reindex(major=new_index)
  1911. lp2 = wp2.to_frame()
  1912. lp_trunc = lp2.truncate(wp.major_axis[2], wp.major_axis[-2])
  1913. wp_trunc = wp2.truncate(wp.major_axis[2], wp.major_axis[-2])
  1914. assert_panel_equal(wp_trunc, lp_trunc.to_panel())
  1915. # throw proper exception
  1916. self.assertRaises(Exception, lp2.truncate, wp.major_axis[-2],
  1917. wp.major_axis[2])
  1918. def test_axis_dummies(self):
  1919. from pandas.core.reshape import make_axis_dummies
  1920. minor_dummies = make_axis_dummies(self.panel, 'minor')
  1921. self.assertEqual(len(minor_dummies.columns),
  1922. len(self.panel.index.levels[1]))
  1923. major_dummies = make_axis_dummies(self.panel, 'major')
  1924. self.assertEqual(len(major_dummies.columns),
  1925. len(self.panel.index.levels[0]))
  1926. mapping = {'A': 'one', 'B': 'one', 'C': 'two', 'D': 'two'}
  1927. transformed = make_axis_dummies(self.panel, 'minor',
  1928. transform=mapping.get)
  1929. self.assertEqual(len(transformed.columns), 2)
  1930. self.assert_index_equal(transformed.columns, Index(['one', 'two']))
  1931. # TODO: test correctness
  1932. def test_get_dummies(self):
  1933. from pandas.core.reshape import get_dummies, make_axis_dummies
  1934. self.panel['Label'] = self.panel.index.labels[1]
  1935. minor_dummies = make_axis_dummies(self.panel, 'minor')
  1936. dummies = get_dummies(self.panel['Label'])
  1937. self.assert_numpy_array_equal(dummies.values, minor_dummies.values)
  1938. def test_mean(self):
  1939. means = self.panel.mean(level='minor')
  1940. # test versus Panel version
  1941. wide_means = self.panel.to_panel().mean('major')
  1942. assert_frame_equal(means, wide_means)
  1943. def test_sum(self):
  1944. sums = self.panel.sum(level='minor')
  1945. # test versus Panel version
  1946. wide_sums = self.panel.to_panel().sum('major')
  1947. assert_frame_equal(sums, wide_sums)
  1948. def test_count(self):
  1949. index = self.panel.index
  1950. major_count = self.panel.count(level=0)['ItemA']
  1951. labels = index.labels[0]
  1952. for i, idx in enumerate(index.levels[0]):
  1953. self.assertEqual(major_count[i], (labels == i).sum())
  1954. minor_count = self.panel.count(level=1)['ItemA']
  1955. labels = index.labels[1]
  1956. for i, idx in enumerate(index.levels[1]):
  1957. self.assertEqual(minor_count[i], (labels == i).sum())
  1958. def test_join(self):
  1959. lp1 = self.panel.filter(['ItemA', 'ItemB'])
  1960. lp2 = self.panel.filter(['ItemC'])
  1961. joined = lp1.join(lp2)
  1962. self.assertEqual(len(joined.columns), 3)
  1963. self.assertRaises(Exception, lp1.join,
  1964. self.panel.filter(['ItemB', 'ItemC']))
  1965. def test_pivot(self):
  1966. from pandas.core.reshape import _slow_pivot
  1967. one, two, three = (np.array([1, 2, 3, 4, 5]),
  1968. np.array(['a', 'b', 'c', 'd', 'e']),
  1969. np.array([1, 2, 3, 5, 4.]))
  1970. df = pivot(one, two, three)
  1971. self.assertEqual(df['a'][1], 1)
  1972. self.assertEqual(df['b'][2], 2)
  1973. self.assertEqual(df['c'][3], 3)
  1974. self.assertEqual(df['d'][4], 5)
  1975. self.assertEqual(df['e'][5], 4)
  1976. assert_frame_equal(df, _slow_pivot(one, two, three))
  1977. # weird overlap, TODO: test?
  1978. a, b, c = (np.array([1, 2, 3, 4, 4]),
  1979. np.array(['a', 'a', 'a', 'a', 'a']),
  1980. np.array([1., 2., 3., 4., 5.]))
  1981. self.assertRaises(Exception, pivot, a, b, c)
  1982. # corner case, empty
  1983. df = pivot(np.array([]), np.array([]), np.array([]))
  1984. def test_monotonic():
  1985. pos = np.array([1, 2, 3, 5])
  1986. def _monotonic(arr):
  1987. return not (arr[1:] < arr[:-1]).any()
  1988. assert _monotonic(pos)
  1989. neg = np.array([1, 2, 3, 4, 3])
  1990. assert not _monotonic(neg)
  1991. neg2 = np.array([5, 1, 2, 3, 4, 5])
  1992. assert not _monotonic(neg2)
  1993. def test_panel_index():
  1994. index = panelm.panel_index([1, 2, 3, 4], [1, 2, 3])
  1995. expected = MultiIndex.from_arrays([np.tile([1, 2, 3, 4], 3),
  1996. np.repeat([1, 2, 3], 4)],
  1997. names=['time', 'panel'])
  1998. tm.assert_index_equal(index, expected)
  1999. if __name__ == '__main__':
  2000. nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'],
  2001. exit=False)