PageRenderTime 65ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 1ms

/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

Large files files are truncated, but you can click here to view the full file

  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.p

Large files files are truncated, but you can click here to view the full file