PageRenderTime 63ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/pandas/tests/test_panel.py

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