From 1eccec01d75e77a00d2b9657bc1e87c803bc5f63 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Fri, 7 Sep 2012 19:57:36 -0400 Subject: [PATCH 1/9] added a FDPanel object, a 4 dimensional pandas container a FDPanel is like a Panel object, but provides 4 dimensions: labels, items, major_axis, minor_axis instead of using a dict of Panels to hold data, the FDPanel provides a convenient represenation in pandas space with named dimensions to allow easy axis swapping and slicing see examples/4D Example 2.pdf for creation and usage motivation ---------- io/pytables currently provides a nice representation of a table to store a Panel object directly (assume item x major (dates) x minor) FDPanel allows many named tables to represent a collection of these tables in a single hdf5 file testing ------- tests/test_fdpanel.py provides a similar methodology to test_panel.py FDPanel is completely self contained (in core/fdpanel.py), with the exception of a single change that was needed in core/indexing.py (regarding multi indexing) all tests that are not skipped pass (some were skipped due to deprecation of some panel like terms that are somewhat confusing in a 4D representation, e.g. minor_xs,major_xs) some code in panel.py could be changed to avoid some method duplication in fdpanel.py (e.g. _prep_ndarray, hard coding of some axes) this was based originally on 0.7.3 (but currently working on 0.9.dev) --- examples/4D Example 2.pdf | Bin 0 -> 107900 bytes pandas/core/fdpanel.py | 505 ++++++++++++++++ pandas/core/indexing.py | 5 + pandas/tests/test_fdpanel.py | 1091 ++++++++++++++++++++++++++++++++++ 4 files changed, 1601 insertions(+) create mode 100755 examples/4D Example 2.pdf create mode 100755 pandas/core/fdpanel.py create mode 100755 pandas/tests/test_fdpanel.py diff --git a/examples/4D Example 2.pdf b/examples/4D Example 2.pdf new file mode 100755 index 0000000000000000000000000000000000000000..7190b17772562033dfca3c1637061bcce2cc49be GIT binary patch literal 107900 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 IHau?hA491!y8r+H literal 0 HcmV?d00001 diff --git a/pandas/core/fdpanel.py b/pandas/core/fdpanel.py new file mode 100755 index 0000000000000..cdd3ef9c3af08 --- /dev/null +++ b/pandas/core/fdpanel.py @@ -0,0 +1,505 @@ +""" FDPanel: a 4-d dict like collection of panels """ + +import operator +import sys +import numpy as np + +from pandas.core.common import (PandasError, _mut_exclusive, + _try_sort, _default_index, _infer_dtype) +from pandas.core.index import (Index, MultiIndex, _ensure_index, + _get_combined_index) +from pandas.core.indexing import _NDFrameIndexer, _maybe_droplevels, _is_null_slice +from pandas.core.internals import BlockManager, make_block, form_blocks +from pandas.core.frame import DataFrame +from pandas.core.generic import NDFrame +from pandas.core.panel import Panel +from pandas.util import py3compat +from pandas.util.decorators import deprecate, Appender, Substitution +import pandas.core.common as com +import pandas.core.nanops as nanops +import pandas.lib as lib + +class FDPanel(Panel): + _AXIS_NUMBERS = { + 'labels' : 0, + 'items' : 1, + 'major_axis' : 2, + 'minor_axis' : 3 + } + + _AXIS_ALIASES = { + 'major' : 'major_axis', + 'minor' : 'minor_axis' + } + + _AXIS_NAMES = { + 0 : 'labels', + 1 : 'items', + 2 : 'major_axis', + 3 : 'minor_axis' + } + + # major + _default_stat_axis = 2 + + labels = lib.AxisProperty(0) + items = lib.AxisProperty(1) + major_axis = lib.AxisProperty(2) + minor_axis = lib.AxisProperty(3) + + def __init__(self, data=None, labels=None, items=None, major_axis=None, minor_axis=None, copy=False, dtype=None): + """ + Represents a 4 dimensonal structured + + Parameters + ---------- + data : ndarray (labels x items x major x minor), or dict of Panels + + labels : Index or array-like : axis=0 + items : Index or array-like : axis=1 + major_axis : Index or array-like: axis=2 + minor_axis : Index or array-like: axis=3 + + dtype : dtype, default None + Data type to force, otherwise infer + copy : boolean, default False + Copy data from inputs. Only affects DataFrame / 2d ndarray input + """ + if data is None: + data = {} + + passed_axes = [labels,items, major_axis, minor_axis] + axes = None + if isinstance(data, BlockManager): + if any(x is not None for x in passed_axes): + axes = [x if x is not None else y + for x, y in zip(passed_axes, data.axes)] + mgr = data + elif isinstance(data, dict): + mgr = self._init_dict(data, passed_axes, dtype=dtype) + copy = False + dtype = None + elif isinstance(data, (np.ndarray, list)): + mgr = self._init_matrix(data, passed_axes, dtype=dtype, copy=copy) + copy = False + dtype = None + else: # pragma: no cover + raise PandasError('FDPanel constructor not properly called!') + + NDFrame.__init__(self, mgr, axes=axes, copy=copy, dtype=dtype) + + @classmethod + def from_dict(cls, data, intersect=False, orient='items', dtype=None): + """ not supporting intersect/orient arguments """ + return cls(data, dtype = dtype) + + def _init_dict(self, data, axes, dtype=None): + labels, items, major, minor = axes + + # prefilter if labels passed + if labels is not None: + labels = _ensure_index(labels) + data = dict((k, v) for k, v in data.iteritems() if k in labels) + else: + labels = Index(_try_sort(data.keys())) + + for k, v in data.iteritems(): + if isinstance(v, dict): + data[k] = Panel(v) + + if items is None: + items = _extract_axis(data, axis=0) + + if major is None: + major = _extract_axis(data, axis=1) + + if minor is None: + minor = _extract_axis(data, axis=2) + + axes = [labels, items, major, minor] + reshaped_data = data.copy() # shallow + + label_shape = len(items), len(major), len(minor) + for label in labels: + v = values = data.get(label) + if v is None: + values = np.empty(item_shape, dtype=dtype) + values.fill(np.nan) + elif isinstance(v, Panel): + v = v.reindex(items=items, major_axis=major, minor_axis=minor, copy=False) + if dtype is not None: + v = v.astype(dtype) + values = v.values + reshaped_data[label] = values + + # segregates dtypes and forms blocks matching to columns + blocks = form_blocks(reshaped_data, axes) + mgr = BlockManager(blocks, axes).consolidate() + return mgr + + def _init_matrix(self, data, axes, dtype=None, copy=False): + values = _prep_ndarray(data, copy=copy) + + if dtype is not None: + try: + values = values.astype(dtype) + except Exception: + raise ValueError('failed to cast to %s' % dtype) + + shape = values.shape + fixed_axes = [] + for i, ax in enumerate(axes): + if ax is None: + ax = _default_index(shape[i]) + else: + ax = _ensure_index(ax) + fixed_axes.append(ax) + + items = fixed_axes[0] + block = make_block(values, items, items) + return BlockManager([block], fixed_axes) + + @property + def shape(self): + return len(self.labels), len(self.items), len(self.major_axis), len(self.minor_axis) + + def __array_wrap__(self, result): + return self._constructor(result, + labels =self.labels, + items =self.items, + major_axis=self.major_axis, + minor_axis=self.minor_axis, copy=False) + + #---------------------------------------------------------------------- + # Magic methods + + def __repr__(self): + class_name = str(self.__class__) + + L, I, N, K = len(self.labels), len(self.items), len(self.major_axis), len(self.minor_axis) + + dims = 'Dimensions: %d (labels) x %d (items) x %d (major) x %d (minor)' % (L, I, N, K) + + if len(self.major_axis) > 0: + major = 'Major axis: %s to %s' % (self.major_axis[0], + self.major_axis[-1]) + else: + major = 'Major axis: None' + + if len(self.minor_axis) > 0: + minor = 'Minor axis: %s to %s' % (self.minor_axis[0], + self.minor_axis[-1]) + else: + minor = 'Minor axis: None' + + if len(self.items) > 0: + items = 'Items: %s to %s' % (self.items[0], self.items[-1]) + else: + items = 'Items: None' + + if len(self.labels) > 0: + labels= 'Labels: %s to %s' % (self.labels[0], self.labels[-1]) + else: + labels = 'Labels: None' + + output = '%s\n%s\n%s\n%s\n%s\n%s' % (class_name, dims, labels, items, major, minor) + + return output + + def __iter__(self): + return iter(self.labels) + + def iteritems(self): + for label in self.labels: + yield label, self[label] + + iterkv = iteritems + + #---------------------------------------------------------------------- + # Getting and setting elements + + def get_value(self, label, item, major, minor): + """ + Quickly retrieve single value at (labe, item, major, minor) location + + Parameters + ---------- + label : label (fdpanel item) + item : item label (fdpanel item) + major : major axis label (fdpanel item row) + minor : minor axis label (fdpanel item column) + + Returns + ------- + value : scalar value + """ + # hm, two layers to the onion + p = self._get_item_cache(label) + return p.get_value(item, major, minor) + + def set_value(self, label, item, major, minor, value): + """ + Quickly set single value at (labe, item, major, minor) location + + Parameters + ---------- + label : label (fdpanel item) + item : item label (fdpanel item) + major : major axis label (fdpanel item row) + minor : minor axis label (fdpanel item column) + + Returns + ------- + label : FDPanel + If label combo is contained, will be reference to calling Panel, + otherwise a new object + """ + try: + p = self._get_item_cache(label) + p.set_value(item, major, minor, value) + return self + except KeyError: + ax1, ax2, ax3, ax4 = self._expand_axes((label,item, major, minor)) + result = self.reindex(labels = ax1, items=ax2, major=ax3, minor=ax4, copy=False) + + likely_dtype = com._infer_dtype(value) + made_bigger = not np.array_equal(ax1, self.labels) + # how to make this logic simpler? + if made_bigger: + com._possibly_cast_item(result, label, likely_dtype) + + return result.set_value(label, item, major, minor, value) + + def _box_item_values(self, key, values): + return Panel(values, items=self.items, major_axis=self.major_axis, minor_axis=self.minor_axis) + + def __getattr__(self, name): + """After regular attribute access, try looking up the name of an item. + This allows simpler access to items for interactive use.""" + if name in self.labels: + return self[name] + raise AttributeError("'%s' object has no attribute '%s'" % + (type(self).__name__, name)) + + def __setitem__(self, key, value): + _, I, N, K = self.shape + if isinstance(value, Panel): + value = value.reindex(items =self.items, + major_axis=self.major_axis, + minor_axis=self.minor_axis) + mat = value.values + elif isinstance(value, np.ndarray): + assert(value.shape == (I, N, K)) + mat = np.asarray(value) + elif np.isscalar(value): + dtype = _infer_dtype(value) + mat = np.empty((I, N, K), dtype=dtype) + mat.fill(value) + + mat = mat.reshape((1, I, N, K)) + NDFrame._set_item(self, key, mat) + + def _get_plane_axes(self, axis): + axis = self._get_axis_name(axis) + + if axis == 'major_axis': + items = self.labels + major = self.minor_axis + minor = self.items + elif axis == 'minor_axis': + items = self.labels + major = self.major_axis + minor = self.items + elif axis == 'items': + items = self.labels + major = self.major_axis + minor = self.minor_axis + elif axis == 'labels': + items = self.items + major = self.major_axis + minor = self.minor_axis + + return items, major, minor + + def conform(self, panel, axis='labels'): + """ + Conform input Panel to align with chosen axis pair. + + Parameters + ---------- + panel : Panel + axis : {'labels', 'items', 'major', 'minor'} + + Returns + ------- + Panel + """ + items, major, minor = self._get_plane_axes(axis) + return panel.reindex(items=items,major_axis=major,minor_axis=minor) + + def reindex(self, labels=None, major=None, items=None, minor=None, method=None, + major_axis=None, minor_axis=None, copy=True): + """ + Conform fdpanel to new axis or axes + + Parameters + ---------- + labels: Index or sequence, default None + items : Index or sequence, default None + major : Index or sequence, default None + Can also use 'major_axis' keyword + minor : Index or sequence, default None + Can also use 'minor_axis' keyword + method : {'backfill', 'bfill', 'pad', 'ffill', None}, default None + Method to use for filling holes in reindexed Series + + pad / ffill: propagate last valid observation forward to next valid + backfill / bfill: use NEXT valid observation to fill gap + copy : boolean, default True + Return a new object, even if the passed indexes are the same + + Returns + ------- + FDPanel (new object) + """ + result = self + + major = _mut_exclusive(major, major_axis) + minor = _mut_exclusive(minor, minor_axis) + + if major is not None: + result = result._reindex_axis(major, method, 2, copy) + + if minor is not None: + result = result._reindex_axis(minor, method, 3, copy) + + if items is not None: + result = result._reindex_axis(items, method, 1, copy) + + if labels is not None: + result = result._reindex_axis(labels, method, 0, copy) + + if result is self and copy: + raise ValueError('Must specify at least one axis') + + return result + + def reindex_like(self, other, method=None): + """ + Reindex FDPanel to match indices of another Panel + + Parameters + ---------- + other : FDPanel + method : string or None + + Returns + ------- + reindexed : FDPanel + """ + # todo: object columns + return self.reindex(labels=other.labels, major=other.major_axis, items=other.items, minor=other.minor_axis, method=method) + + def swapaxes(self, axis1='major', axis2='minor'): + """ + Interchange axes and swap values axes appropriately + + Returns + ------- + y : FDPanel (new object) + """ + i = self._get_axis_number(axis1) + j = self._get_axis_number(axis2) + + if i == j: + raise ValueError('Cannot specify the same axis') + + mapping = {i : j, j : i} + + new_axes = (self._get_axis(mapping.get(k, k)) + for k in range(4)) + new_values = self.values.swapaxes(i, j).copy() + + return self._constructor(new_values, *new_axes) + + def xs(self, key, axis=2, copy=True): + """ + Return slice of fdpanel along selected axis + + Parameters + ---------- + key : object + Label + axis : {'labels', 'items', 'major', 'minor}, default 1/'major' + + Returns + ------- + y : Panel + """ + if axis == 0: + data = self[key] + if copy: + data = data.copy() + return data + + self._consolidate_inplace() + axis_number = self._get_axis_number(axis) + new_data = self._data.xs(key, axis=axis_number, copy=copy) + return Panel(new_data) + + ### remove operations #### + def major_xs(self, *args, **kwargs): + raise NotImplementedError + def minor_xs(self, *args, **kwargs): + raise NotImplementedError + def to_frame(self, *args, **kwargs): + raise NotImplementedError + def to_excel(self, *args, **kwargs): + raise NotImplementedError + +def _prep_ndarray(values, copy=True): + if not isinstance(values, np.ndarray): + values = np.asarray(values) + # NumPy strings are a pain, convert to object + if issubclass(values.dtype.type, basestring): + values = np.array(values, dtype=object, copy=True) + else: + if copy: + values = values.copy() + assert(values.ndim == 4) + return values + +def _extract_axis(data, axis=0, intersect=False): + from pandas.core.index import _union_indexes + + if len(data) == 0: + index = Index([]) + elif len(data) > 0: + raw_lengths = [] + indexes = [] + + have_raw_arrays = False + have_panels = False + + for v in data.values(): + if isinstance(v, Panel): + have_panels = True + indexes.append(v._get_axis(axis)) + else: + have_raw_arrays = True + raw_lengths.append(v.shape[axis]) + + if have_panels: + index = _get_combined_index(indexes, intersect=intersect) + + if have_raw_arrays: + lengths = list(set(raw_lengths)) + if len(lengths) > 1: + raise ValueError('ndarrays must match shape on axis %d' % axis) + + if have_panels: + assert(lengths[0] == len(index)) + else: + index = Index(np.arange(lengths[0])) + + return _ensure_index(index) diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 4dce75a29992b..a7423a1a58da8 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -167,11 +167,16 @@ def _multi_take_opportunity(self, tup): def _multi_take(self, tup): from pandas.core.frame import DataFrame from pandas.core.panel import Panel + from pandas.core.fdpanel import FDPanel if isinstance(self.obj, DataFrame): index = self._convert_for_reindex(tup[0], axis=0) columns = self._convert_for_reindex(tup[1], axis=1) return self.obj.reindex(index=index, columns=columns) + elif isinstance(self.obj, FDPanel): + conv = [self._convert_for_reindex(x, axis=i) + for i, x in enumerate(tup)] + return self.obj.reindex(labels=tup[0],items=tup[1], major=tup[2], minor=tup[3]) elif isinstance(self.obj, Panel): conv = [self._convert_for_reindex(x, axis=i) for i, x in enumerate(tup)] diff --git a/pandas/tests/test_fdpanel.py b/pandas/tests/test_fdpanel.py new file mode 100755 index 0000000000000..8aeb10f9b73e1 --- /dev/null +++ b/pandas/tests/test_fdpanel.py @@ -0,0 +1,1091 @@ +from datetime import datetime +import os +import operator +import unittest +import nose + +import numpy as np + +from pandas import DataFrame, Index, isnull, notnull, pivot, MultiIndex +from pandas.core.datetools import bday +from pandas.core.frame import group_agg +from pandas.core.panel import Panel +from pandas.core.fdpanel import FDPanel +from pandas.core.series import remove_na +import pandas.core.common as com +import pandas.core.panel as panelmod +from pandas.util import py3compat +from pandas.io.parsers import (ExcelFile, ExcelWriter) + +from pandas.util.testing import (assert_panel_equal, + assert_frame_equal, + assert_series_equal, + assert_almost_equal) +import pandas.util.testing as tm + +def assert_fdpanel_equal(left, right): + assert(left.labels.equals(right.labels)) + assert(left.items.equals(right.items)) + assert(left.major_axis.equals(right.major_axis)) + assert(left.minor_axis.equals(right.minor_axis)) + + for col, series in left.iterkv(): + assert(col in right) + assert_panel_equal(series, right[col]) + + for col in right: + assert(col in left) + + +def makeFDPanel(): + return FDPanel(dict(l1 = tm.makePanel(), l2 = tm.makePanel(), l3 = tm.makePanel())) + +def add_nans(fdp): + for l, label in enumerate(fdp.labels): + panel = fdp[label] + tm.add_nans(panel) + +class SafeForLongAndSparse(object): + + def test_repr(self): + foo = repr(self.panel) + + def test_iter(self): + tm.equalContents(list(self.panel), self.panel.items) + + def test_count(self): + f = lambda s: notnull(s).sum() + self._check_stat_op('count', f, obj=self.panel, has_skipna=False) + + def test_sum(self): + self._check_stat_op('sum', np.sum) + + def test_mean(self): + self._check_stat_op('mean', np.mean) + + def test_prod(self): + self._check_stat_op('prod', np.prod) + + def test_median(self): + def wrapper(x): + if isnull(x).any(): + return np.nan + return np.median(x) + + self._check_stat_op('median', wrapper) + + def test_min(self): + self._check_stat_op('min', np.min) + + def test_max(self): + self._check_stat_op('max', np.max) + + def test_skew(self): + from scipy.stats import skew + def this_skew(x): + if len(x) < 3: + return np.nan + return skew(x, bias=False) + self._check_stat_op('skew', this_skew) + + # def test_mad(self): + # f = lambda x: np.abs(x - x.mean()).mean() + # self._check_stat_op('mad', f) + + def test_var(self): + def alt(x): + if len(x) < 2: + return np.nan + return np.var(x, ddof=1) + self._check_stat_op('var', alt) + + def test_std(self): + def alt(x): + if len(x) < 2: + return np.nan + return np.std(x, ddof=1) + self._check_stat_op('std', alt) + + # def test_skew(self): + # from scipy.stats import skew + + # def alt(x): + # if len(x) < 3: + # return np.nan + # return skew(x, bias=False) + + # self._check_stat_op('skew', alt) + + def _check_stat_op(self, name, alternative, obj=None, has_skipna=True): + if obj is None: + obj = self.panel + + # # set some NAs + # obj.ix[5:10] = np.nan + # obj.ix[15:20, -2:] = np.nan + + f = getattr(obj, name) + + if has_skipna: + def skipna_wrapper(x): + nona = remove_na(x) + if len(nona) == 0: + return np.nan + return alternative(nona) + + def wrapper(x): + return alternative(np.asarray(x)) + + for i in range(obj.ndim): + result = f(axis=i, skipna=False) + assert_frame_equal(result, obj.apply(wrapper, axis=i)) + else: + skipna_wrapper = alternative + wrapper = alternative + + for i in range(obj.ndim): + result = f(axis=i) + assert_frame_equal(result, obj.apply(skipna_wrapper, axis=i)) + + self.assertRaises(Exception, f, axis=obj.ndim) + +class SafeForSparse(object): + + @classmethod + def assert_panel_equal(cls, x, y): + assert_panel_equal(x, y) + + def test_get_axis(self): + assert(self.panel._get_axis(0) is self.panel.items) + assert(self.panel._get_axis(1) is self.panel.major_axis) + assert(self.panel._get_axis(2) is self.panel.minor_axis) + + def test_set_axis(self): + new_items = Index(np.arange(len(self.panel.items))) + new_major = Index(np.arange(len(self.panel.major_axis))) + new_minor = Index(np.arange(len(self.panel.minor_axis))) + + # ensure propagate to potentially prior-cached items too + item = self.panel['ItemA'] + self.panel.items = new_items + + if hasattr(self.panel, '_item_cache'): + self.assert_('ItemA' not in self.panel._item_cache) + self.assert_(self.panel.items is new_items) + + item = self.panel[0] + self.panel.major_axis = new_major + self.assert_(self.panel[0].index is new_major) + self.assert_(self.panel.major_axis is new_major) + + item = self.panel[0] + self.panel.minor_axis = new_minor + self.assert_(self.panel[0].columns is new_minor) + self.assert_(self.panel.minor_axis is new_minor) + + def test_get_axis_number(self): + self.assertEqual(self.panel._get_axis_number('items'), 0) + self.assertEqual(self.panel._get_axis_number('major'), 1) + self.assertEqual(self.panel._get_axis_number('minor'), 2) + + def test_get_axis_name(self): + self.assertEqual(self.panel._get_axis_name(0), 'items') + self.assertEqual(self.panel._get_axis_name(1), 'major_axis') + self.assertEqual(self.panel._get_axis_name(2), 'minor_axis') + + def test_get_plane_axes(self): + # what to do here? + + index, columns = self.panel._get_plane_axes('items') + index, columns = self.panel._get_plane_axes('major_axis') + index, columns = self.panel._get_plane_axes('minor_axis') + index, columns = self.panel._get_plane_axes(0) + + def test_truncate(self): + dates = self.panel.major_axis + start, end = dates[1], dates[5] + + trunced = self.panel.truncate(start, end, axis='major') + expected = self.panel['ItemA'].truncate(start, end) + + assert_frame_equal(trunced['ItemA'], expected) + + trunced = self.panel.truncate(before=start, axis='major') + expected = self.panel['ItemA'].truncate(before=start) + + assert_frame_equal(trunced['ItemA'], expected) + + trunced = self.panel.truncate(after=end, axis='major') + expected = self.panel['ItemA'].truncate(after=end) + + assert_frame_equal(trunced['ItemA'], expected) + + # XXX test other axes + + def test_arith(self): + self._test_op(self.panel, operator.add) + self._test_op(self.panel, operator.sub) + self._test_op(self.panel, operator.mul) + self._test_op(self.panel, operator.truediv) + self._test_op(self.panel, operator.floordiv) + self._test_op(self.panel, operator.pow) + + self._test_op(self.panel, lambda x, y: y + x) + self._test_op(self.panel, lambda x, y: y - x) + self._test_op(self.panel, lambda x, y: y * x) + self._test_op(self.panel, lambda x, y: y / x) + self._test_op(self.panel, lambda x, y: y ** x) + + self.assertRaises(Exception, self.panel.__add__, self.panel['ItemA']) + + @staticmethod + def _test_op(panel, op): + result = op(panel, 1) + assert_frame_equal(result['ItemA'], op(panel['ItemA'], 1)) + + def test_keys(self): + tm.equalContents(self.panel.keys(), self.panel.items) + + def test_iteritems(self): + """Test panel.iteritems(), aka panel.iterkv()""" + # just test that it works + for k, v in self.panel.iterkv(): + pass + + self.assertEqual(len(list(self.panel.iterkv())), + len(self.panel.items)) + + def test_combineFrame(self): + def check_op(op, name): + # items + df = self.panel['ItemA'] + + func = getattr(self.panel, name) + + result = func(df, axis='items') + + assert_frame_equal(result['ItemB'], op(self.panel['ItemB'], df)) + + # major + xs = self.panel.major_xs(self.panel.major_axis[0]) + result = func(xs, axis='major') + + idx = self.panel.major_axis[1] + + assert_frame_equal(result.major_xs(idx), + op(self.panel.major_xs(idx), xs)) + + # minor + xs = self.panel.minor_xs(self.panel.minor_axis[0]) + result = func(xs, axis='minor') + + idx = self.panel.minor_axis[1] + + assert_frame_equal(result.minor_xs(idx), + op(self.panel.minor_xs(idx), xs)) + + check_op(operator.add, 'add') + check_op(operator.sub, 'subtract') + check_op(operator.mul, 'multiply') + if py3compat.PY3: + check_op(operator.truediv, 'divide') + else: + check_op(operator.div, 'divide') + + def test_combinePanel(self): + result = self.panel.add(self.panel) + self.assert_panel_equal(result, self.panel * 2) + + def test_neg(self): + self.assert_panel_equal(-self.panel, self.panel * -1) + + def test_select(self): + p = self.panel + + # select items + result = p.select(lambda x: x in ('ItemA', 'ItemC'), axis='items') + expected = p.reindex(items=['ItemA', 'ItemC']) + self.assert_panel_equal(result, expected) + + # select major_axis + result = p.select(lambda x: x >= datetime(2000, 1, 15), axis='major') + new_major = p.major_axis[p.major_axis >= datetime(2000, 1, 15)] + expected = p.reindex(major=new_major) + self.assert_panel_equal(result, expected) + + # select minor_axis + result = p.select(lambda x: x in ('D', 'A'), axis=2) + expected = p.reindex(minor=['A', 'D']) + self.assert_panel_equal(result, expected) + + # corner case, empty thing + result = p.select(lambda x: x in ('foo',), axis='items') + self.assert_panel_equal(result, p.reindex(items=[])) + + def test_get_value(self): + for item in self.panel.items: + for mjr in self.panel.major_axis[::2]: + for mnr in self.panel.minor_axis: + result = self.panel.get_value(item, mjr, mnr) + expected = self.panel[item][mnr][mjr] + assert_almost_equal(result, expected) + + def test_abs(self): + result = self.panel.abs() + expected = np.abs(self.panel) + self.assert_panel_equal(result, expected) + + df = self.panel['ItemA'] + result = df.abs() + expected = np.abs(df) + assert_frame_equal(result, expected) + + s = df['A'] + result = s.abs() + expected = np.abs(s) + assert_series_equal(result, expected) + +class CheckIndexing(object): + + + def test_getitem(self): + self.assertRaises(Exception, self.fdpanel.__getitem__, 'ItemQ') + + def test_delitem_and_pop(self): + expected = self.fdpanel['l2'] + result = self.fdpanel.pop('l2') + assert_panel_equal(expected, result) + self.assert_('l2' not in self.fdpanel.labels) + + del self.fdpanel['l3'] + self.assert_('l3' not in self.fdpanel.labels) + self.assertRaises(Exception, self.fdpanel.__delitem__, 'l3') + + values = np.empty((4, 4, 4, 4)) + values[0] = 0 + values[1] = 1 + values[2] = 2 + values[3] = 3 + + fdpanel = FDPanel(values, range(4), range(4), range(4), range(4)) + + # did we delete the right row? + + fdpanelc = fdpanel.copy() + del fdpanelc[0] + assert_panel_equal(fdpanelc[1], fdpanel[1]) + assert_panel_equal(fdpanelc[2], fdpanel[2]) + assert_panel_equal(fdpanelc[3], fdpanel[3]) + + fdpanelc = fdpanel.copy() + del fdpanelc[1] + assert_panel_equal(fdpanelc[0], fdpanel[0]) + assert_panel_equal(fdpanelc[2], fdpanel[2]) + assert_panel_equal(fdpanelc[3], fdpanel[3]) + + fdpanelc = fdpanel.copy() + del fdpanelc[2] + assert_panel_equal(fdpanelc[1], fdpanel[1]) + assert_panel_equal(fdpanelc[0], fdpanel[0]) + assert_panel_equal(fdpanelc[3], fdpanel[3]) + + fdpanelc = fdpanel.copy() + del fdpanelc[3] + assert_panel_equal(fdpanelc[1], fdpanel[1]) + assert_panel_equal(fdpanelc[2], fdpanel[2]) + assert_panel_equal(fdpanelc[0], fdpanel[0]) + + def test_setitem(self): + ## LongPanel with one item + #lp = self.panel.filter(['ItemA', 'ItemB']).to_frame() + #self.assertRaises(Exception, self.panel.__setitem__, + # 'ItemE', lp) + + # Panel + p = Panel(dict(ItemA = self.fdpanel['l1']['ItemA'][2:].filter(items=['A', 'B']))) + self.fdpanel['l4'] = p + self.fdpanel['l5'] = p + + p2 = self.fdpanel['l4'] + + assert_panel_equal(p, p2.reindex(items = p.items, + major_axis = p.major_axis, + minor_axis = p.minor_axis)) + + # scalar + self.fdpanel['lG'] = 1 + self.fdpanel['lE'] = True + self.assert_(self.fdpanel['lG'].values.dtype == np.int64) + self.assert_(self.fdpanel['lE'].values.dtype == np.bool_) + + # object dtype + self.fdpanel['lQ'] = 'foo' + self.assert_(self.fdpanel['lQ'].values.dtype == np.object_) + + # boolean dtype + self.fdpanel['lP'] = self.fdpanel['l1'] > 0 + self.assert_(self.fdpanel['lP'].values.dtype == np.bool_) + + def test_setitem_ndarray(self): + raise nose.SkipTest + # from pandas import DateRange, datetools + + # timeidx = DateRange(start=datetime(2009,1,1), + # end=datetime(2009,12,31), + # offset=datetools.MonthEnd()) + # lons_coarse = np.linspace(-177.5, 177.5, 72) + # lats_coarse = np.linspace(-87.5, 87.5, 36) + # P = Panel(items=timeidx, major_axis=lons_coarse, minor_axis=lats_coarse) + # data = np.random.randn(72*36).reshape((72,36)) + # key = datetime(2009,2,28) + # P[key] = data# + + # assert_almost_equal(P[key].values, data) + + def test_major_xs(self): + raise nose.SkipTest + # ref = self.panel['ItemA'] + + # idx = self.panel.major_axis[5] + # xs = self.panel.major_xs(idx) + + # assert_series_equal(xs['ItemA'], ref.xs(idx)) + + # # not contained + # idx = self.panel.major_axis[0] - bday + # self.assertRaises(Exception, self.panel.major_xs, idx) + + def test_major_xs_mixed(self): + raise nose.SkipTest + # self.panel['ItemD'] = 'foo' + # xs = self.panel.major_xs(self.panel.major_axis[0]) + # self.assert_(xs['ItemA'].dtype == np.float64) + # self.assert_(xs['ItemD'].dtype == np.object_) + + def test_minor_xs(self): + raise nose.SkipTest + # ref = self.panel['ItemA'] + + # idx = self.panel.minor_axis[1] + # xs = self.panel.minor_xs(idx) + + # assert_series_equal(xs['ItemA'], ref[idx]) + + # # not contained + # self.assertRaises(Exception, self.panel.minor_xs, 'E') + + def test_minor_xs_mixed(self): + raise nose.SkipTest + # self.panel['ItemD'] = 'foo' + + # xs = self.panel.minor_xs('D') + # self.assert_(xs['ItemA'].dtype == np.float64) + # self.assert_(xs['ItemD'].dtype == np.object_) + + def test_xs(self): + l1 = self.fdpanel.xs('l1', axis=0) + expected = self.fdpanel['l1'] + assert_panel_equal(l1, expected) + + # not view by default + l1.values[:] = np.nan + self.assert_(not np.isnan(self.fdpanel['l1'].values).all()) + + # but can get view + l1_view = self.fdpanel.xs('l1', axis=0, copy=False) + l1_view.values[:] = np.nan + self.assert_(np.isnan(self.fdpanel['l1'].values).all()) + + # mixed-type + self.fdpanel['strings'] = 'foo' + self.assertRaises(Exception, self.fdpanel.xs, 'D', axis=2, + copy=False) + + def test_getitem_fancy_labels(self): + fdp = self.fdpanel + + labels = fdp.labels[[1, 0]] + items = fdp.items[[1, 0]] + dates = fdp.major_axis[::2] + cols = ['D', 'C', 'F'] + + # all 4 specified + assert_fdpanel_equal(fdp.ix[labels, items, dates, cols], + fdp.reindex(labels=labels, items=items, major=dates, minor=cols)) + + # 3 specified + assert_fdpanel_equal(fdp.ix[:, items, dates, cols], + fdp.reindex(items=items, major=dates, minor=cols)) + + # 2 specified + assert_fdpanel_equal(fdp.ix[:, :, dates, cols], + fdp.reindex(major=dates, minor=cols)) + + assert_fdpanel_equal(fdp.ix[:, items, :, cols], + fdp.reindex(items=items, minor=cols)) + + assert_fdpanel_equal(fdp.ix[:, items, dates, :], + fdp.reindex(items=items, major=dates)) + + # only 1 + assert_fdpanel_equal(fdp.ix[:, items, :, :], + fdp.reindex(items=items)) + + assert_fdpanel_equal(fdp.ix[:, :, dates, :], + fdp.reindex(major=dates)) + + assert_fdpanel_equal(fdp.ix[:, :, :, cols], + fdp.reindex(minor=cols)) + + def test_getitem_fancy_slice(self): + pass + + def test_getitem_fancy_ints(self): + pass + + def test_getitem_fancy_xs(self): + self.assertRaises(NotImplementedError, self.fdpanel.major_xs) + self.assertRaises(NotImplementedError, self.fdpanel.minor_xs) + + def test_getitem_fancy_xs_check_view(self): + raise nose.SkipTest + # item = 'ItemB' + # date = self.panel.major_axis[5] + # col = 'C' + + # # make sure it's always a view + # NS = slice(None, None) + + # # DataFrames + # comp = assert_frame_equal + # self._check_view(item, comp) + # self._check_view((item, NS), comp) + # self._check_view((item, NS, NS), comp) + # self._check_view((NS, date), comp) + # self._check_view((NS, date, NS), comp) + # self._check_view((NS, NS, 'C'), comp) + + # # Series + # comp = assert_series_equal + # self._check_view((item, date), comp) + # self._check_view((item, date, NS), comp) + # self._check_view((item, NS, 'C'), comp) + # self._check_view((NS, date, 'C'), comp)# + + #def _check_view(self, indexer, comp): + # cp = self.panel.copy() + # obj = cp.ix[indexer] + # obj.values[:] = 0 + # self.assert_((obj.values == 0).all()) + # comp(cp.ix[indexer].reindex_like(obj), obj) + + def test_get_value(self): + for label in self.fdpanel.labels: + for item in self.fdpanel.items: + for mjr in self.fdpanel.major_axis[::2]: + for mnr in self.fdpanel.minor_axis: + result = self.fdpanel.get_value(label, item, mjr, mnr) + expected = self.fdpanel[label][item][mnr][mjr] + assert_almost_equal(result, expected) + + def test_set_value(self): + for label in self.fdpanel.labels: + for item in self.fdpanel.items: + for mjr in self.fdpanel.major_axis[::2]: + for mnr in self.fdpanel.minor_axis: + self.fdpanel.set_value(label, item, mjr, mnr, 1.) + assert_almost_equal(self.fdpanel[label][item][mnr][mjr], 1.) + + # resize + res = self.fdpanel.set_value('l4', 'ItemE', 'foo', 'bar', 1.5) + self.assert_(isinstance(res, FDPanel)) + self.assert_(res is not self.fdpanel) + self.assertEqual(res.get_value('l4', 'ItemE', 'foo', 'bar'), 1.5) + + res3 = self.fdpanel.set_value('l4', 'ItemE', 'foobar', 'baz', 5) + self.assert_(com.is_float_dtype(res3['l4'].values)) + +class TestFDPanel(unittest.TestCase, CheckIndexing): + + @classmethod + def assert_fdpanel_equal(cls,x, y): + assert_fdpanel_equal(x, y) + + def setUp(self): + self.fdpanel = makeFDPanel() + add_nans(self.fdpanel) + + def test_constructor(self): + # with BlockManager + fdp = FDPanel(self.fdpanel._data) + self.assert_(fdp._data is self.fdpanel._data) + + fdp = FDPanel(self.fdpanel._data, copy=True) + self.assert_(fdp._data is not self.fdpanel._data) + assert_fdpanel_equal(fdp, self.fdpanel) + + # strings handled prop + #fdp = FDPanel([[['foo', 'foo', 'foo',], + # ['foo', 'foo', 'foo']]]) + #self.assert_(wp.values.dtype == np.object_) + + vals = self.fdpanel.values + + # no copy + fdp = FDPanel(vals) + self.assert_(fdp.values is vals) + + # copy + fdp = FDPanel(vals, copy=True) + self.assert_(fdp.values is not vals) + + def test_constructor_cast(self): + zero_filled = self.fdpanel.fillna(0) + + casted = FDPanel(zero_filled._data, dtype=int) + casted2 = FDPanel(zero_filled.values, dtype=int) + + exp_values = zero_filled.values.astype(int) + assert_almost_equal(casted.values, exp_values) + assert_almost_equal(casted2.values, exp_values) + + # can't cast + data = [[['foo', 'bar', 'baz']]] + self.assertRaises(ValueError, Panel, data, dtype=float) + + def test_constructor_empty_panel(self): + empty = Panel() + self.assert_(len(empty.items) == 0) + self.assert_(len(empty.major_axis) == 0) + self.assert_(len(empty.minor_axis) == 0) + + def test_constructor_observe_dtype(self): + # GH #411 + panel = Panel(items=range(3), major_axis=range(3), + minor_axis=range(3), dtype='O') + self.assert_(panel.values.dtype == np.object_) + + def test_consolidate(self): + self.assert_(self.fdpanel._data.is_consolidated()) + + self.fdpanel['foo'] = 1. + self.assert_(not self.fdpanel._data.is_consolidated()) + + fdpanel = self.fdpanel.consolidate() + self.assert_(fdpanel._data.is_consolidated()) + + def test_ctor_dict(self): + l1 = self.fdpanel['l1'] + l2 = self.fdpanel['l2'] + + d = {'A' : l1, 'B' : l2.ix[['ItemB'],:,:] } + #d2 = {'A' : itema._series, 'B' : itemb[5:]._series} + #d3 = {'A' : DataFrame(itema._series), + # 'B' : DataFrame(itemb[5:]._series)} + + fdp = FDPanel(d) + #wp2 = Panel.from_dict(d2) # nested Dict + #wp3 = Panel.from_dict(d3) + #self.assert_(wp.major_axis.equals(self.panel.major_axis)) + assert_panel_equal(fdp['A'], self.fdpanel['l1']) + assert_frame_equal(fdp.ix['B','ItemB',:,:], self.fdpanel.ix['l2',['ItemB'],:,:]['ItemB']) + + # intersect + #wp = Panel.from_dict(d, intersect=True) + #self.assert_(wp.major_axis.equals(itemb.index[5:])) + + # use constructor + #assert_panel_equal(Panel(d), Panel.from_dict(d)) + #assert_panel_equal(Panel(d2), Panel.from_dict(d2)) + #assert_panel_equal(Panel(d3), Panel.from_dict(d3)) + + # cast + #dcasted = dict((k, v.reindex(wp.major_axis).fillna(0)) + # for k, v in d.iteritems()) + #result = Panel(dcasted, dtype=int) + #expected = Panel(dict((k, v.astype(int)) + # for k, v in dcasted.iteritems())) + #assert_panel_equal(result, expected) + + def test_constructor_dict_mixed(self): + data = dict((k, v.values) for k, v in self.fdpanel.iterkv()) + result = FDPanel(data) + exp_major = Index(np.arange(len(self.fdpanel.major_axis))) + self.assert_(result.major_axis.equals(exp_major)) + + result = FDPanel(data, + labels = self.fdpanel.labels, + items = self.fdpanel.items, + major_axis = self.fdpanel.major_axis, + minor_axis = self.fdpanel.minor_axis) + assert_fdpanel_equal(result, self.fdpanel) + + data['l2'] = self.fdpanel['l2'] + result = FDPanel(data) + assert_fdpanel_equal(result, self.fdpanel) + + # corner, blow up + data['l2'] = data['l2']['ItemB'] + self.assertRaises(Exception, FDPanel, data) + + data['l2'] = self.fdpanel['l2'].values[:, :, :-1] + self.assertRaises(Exception, FDPanel, data) + + def test_constructor_resize(self): + data = self.fdpanel._data + labels= self.fdpanel.labels[:-1] + items = self.fdpanel.items[:-1] + major = self.fdpanel.major_axis[:-1] + minor = self.fdpanel.minor_axis[:-1] + + result = FDPanel(data, labels=labels, items=items, major_axis=major, minor_axis=minor) + expected = self.fdpanel.reindex(labels=labels, items=items, major=major, minor=minor) + assert_fdpanel_equal(result, expected) + + result = FDPanel(data, items=items, major_axis=major) + expected = self.fdpanel.reindex(items=items, major=major) + assert_fdpanel_equal(result, expected) + + result = FDPanel(data, items=items) + expected = self.fdpanel.reindex(items=items) + assert_fdpanel_equal(result, expected) + + result = FDPanel(data, minor_axis=minor) + expected = self.fdpanel.reindex(minor=minor) + assert_fdpanel_equal(result, expected) + + def test_from_dict_mixed_orient(self): + raise nose.SkipTest + # df = tm.makeDataFrame() + # df['foo'] = 'bar' + + # data = {'k1' : df, + # 'k2' : df} + + # panel = Panel.from_dict(data, orient='minor') + + # self.assert_(panel['foo'].values.dtype == np.object_) + # self.assert_(panel['A'].values.dtype == np.float64) + + def test_values(self): + self.assertRaises(Exception, Panel, np.random.randn(5, 5, 5), + range(5), range(5), range(4)) + + def test_conform(self): + p = self.fdpanel['l1'].filter(items=['ItemA', 'ItemB']) + conformed = self.fdpanel.conform(p) + + assert(conformed.items.equals(self.fdpanel.items)) + assert(conformed.major_axis.equals(self.fdpanel.major_axis)) + assert(conformed.minor_axis.equals(self.fdpanel.minor_axis)) + + def test_reindex(self): + ref = self.fdpanel['l2'] + + # labels + result = self.fdpanel.reindex(labels=['l1','l2']) + assert_panel_equal(result['l2'], ref) + + # items + result = self.fdpanel.reindex(items=['ItemA', 'ItemB']) + assert_frame_equal(result['l2']['ItemB'], ref['ItemB']) + + # major + new_major = list(self.fdpanel.major_axis[:10]) + result = self.fdpanel.reindex(major=new_major) + assert_frame_equal(result['l2']['ItemB'], ref['ItemB'].reindex(index=new_major)) + + # raise exception put both major and major_axis + self.assertRaises(Exception, self.fdpanel.reindex, + major_axis=new_major, major=new_major) + + # minor + new_minor = list(self.fdpanel.minor_axis[:2]) + result = self.fdpanel.reindex(minor=new_minor) + assert_frame_equal(result['l2']['ItemB'], ref['ItemB'].reindex(columns=new_minor)) + + result = self.fdpanel.reindex(labels=self.fdpanel.labels, + items =self.fdpanel.items, + major =self.fdpanel.major_axis, + minor =self.fdpanel.minor_axis) + + assert(result.labels is self.fdpanel.labels) + assert(result.items is self.fdpanel.items) + assert(result.major_axis is self.fdpanel.major_axis) + assert(result.minor_axis is self.fdpanel.minor_axis) + + self.assertRaises(Exception, self.fdpanel.reindex) + + # with filling + smaller_major = self.fdpanel.major_axis[::5] + smaller = self.fdpanel.reindex(major=smaller_major) + + larger = smaller.reindex(major=self.fdpanel.major_axis, + method='pad') + + assert_panel_equal(larger.ix[:,:,self.fdpanel.major_axis[1],:], + smaller.ix[:,:,smaller_major[0],:]) + + # don't necessarily copy + result = self.fdpanel.reindex(major=self.fdpanel.major_axis, copy=False) + self.assert_(result is self.fdpanel) + + def test_reindex_like(self): + # reindex_like + smaller = self.fdpanel.reindex(labels=self.fdpanel.labels[:-1], + items =self.fdpanel.items[:-1], + major =self.fdpanel.major_axis[:-1], + minor =self.fdpanel.minor_axis[:-1]) + smaller_like = self.fdpanel.reindex_like(smaller) + assert_fdpanel_equal(smaller, smaller_like) + + def test_take(self): + raise nose.SkipTest + # # axis == 0 + # result = self.panel.take([2, 0, 1], axis=0) + # expected = self.panel.reindex(items=['ItemC', 'ItemA', 'ItemB']) + # assert_panel_equal(result, expected)# + + # # axis >= 1 + # result = self.panel.take([3, 0, 1, 2], axis=2) + # expected = self.panel.reindex(minor=['D', 'A', 'B', 'C']) + # assert_panel_equal(result, expected) + + # self.assertRaises(Exception, self.panel.take, [3, -1, 1, 2], axis=2) + # self.assertRaises(Exception, self.panel.take, [4, 0, 1, 2], axis=2) + + def test_sort_index(self): + import random + + rlabels= list(self.fdpanel.labels) + ritems = list(self.fdpanel.items) + rmajor = list(self.fdpanel.major_axis) + rminor = list(self.fdpanel.minor_axis) + random.shuffle(rlabels) + random.shuffle(ritems) + random.shuffle(rmajor) + random.shuffle(rminor) + + random_order = self.fdpanel.reindex(labels=rlabels) + sorted_fdpanel = random_order.sort_index(axis=0) + assert_fdpanel_equal(sorted_fdpanel, self.fdpanel) + + # descending + #random_order = self.panel.reindex(items=ritems) + #sorted_panel = random_order.sort_index(axis=0, ascending=False) + #assert_panel_equal(sorted_panel, + # self.panel.reindex(items=self.panel.items[::-1])) + + #random_order = self.panel.reindex(major=rmajor) + #sorted_panel = random_order.sort_index(axis=1) + #assert_panel_equal(sorted_panel, self.panel) + + #random_order = self.panel.reindex(minor=rminor) + #sorted_panel = random_order.sort_index(axis=2) + #assert_panel_equal(sorted_panel, self.panel) + + def test_fillna(self): + filled = self.fdpanel.fillna(0) + self.assert_(np.isfinite(filled.values).all()) + + filled = self.fdpanel.fillna(method='backfill') + assert_panel_equal(filled['l1'], + self.fdpanel['l1'].fillna(method='backfill')) + + fdpanel = self.fdpanel.copy() + fdpanel['str'] = 'foo' + + filled = fdpanel.fillna(method='backfill') + assert_panel_equal(filled['l1'], + fdpanel['l1'].fillna(method='backfill')) + + empty = self.fdpanel.reindex(labels=[]) + filled = empty.fillna(0) + assert_fdpanel_equal(filled, empty) + + def test_swapaxes(self): + result = self.fdpanel.swapaxes('labels','items') + self.assert_(result.items is self.fdpanel.labels) + + result = self.fdpanel.swapaxes('labels','minor') + self.assert_(result.labels is self.fdpanel.minor_axis) + + result = self.fdpanel.swapaxes('items', 'minor') + self.assert_(result.items is self.fdpanel.minor_axis) + + result = self.fdpanel.swapaxes('items', 'major') + self.assert_(result.items is self.fdpanel.major_axis) + + result = self.fdpanel.swapaxes('major', 'minor') + self.assert_(result.major_axis is self.fdpanel.minor_axis) + + # this should also work + result = self.fdpanel.swapaxes(0, 1) + self.assert_(result.labels is self.fdpanel.items) + + # this should also work + self.assertRaises(Exception, self.fdpanel.swapaxes, 'items', 'items') + + def test_to_frame(self): + raise nose.SkipTest + # # filtered + # filtered = self.panel.to_frame() + # expected = self.panel.to_frame().dropna(how='any') + # assert_frame_equal(filtered, expected) + + # # unfiltered + # unfiltered = self.panel.to_frame(filter_observations=False) + # assert_panel_equal(unfiltered.to_panel(), self.panel) + + # # names + # self.assertEqual(unfiltered.index.names, ['major', 'minor']) + + def test_to_frame_mixed(self): + raise nose.SkipTest + # panel = self.panel.fillna(0) + # panel['str'] = 'foo' + # panel['bool'] = panel['ItemA'] > 0 + + # lp = panel.to_frame() + # wp = lp.to_panel() + # self.assertEqual(wp['bool'].values.dtype, np.bool_) + # assert_frame_equal(wp['bool'], panel['bool']) + + def test_filter(self): + pass + + def test_apply(self): + pass + + def test_compound(self): + raise nose.SkipTest + # compounded = self.panel.compound() + + # assert_series_equal(compounded['ItemA'], + # (1 + self.panel['ItemA']).product(0) - 1) + + def test_shift(self): + raise nose.SkipTest + # # major + # idx = self.panel.major_axis[0] + # idx_lag = self.panel.major_axis[1] + + # shifted = self.panel.shift(1) + + # assert_frame_equal(self.panel.major_xs(idx), + # shifted.major_xs(idx_lag)) + + # # minor + # idx = self.panel.minor_axis[0] + # idx_lag = self.panel.minor_axis[1] + + # shifted = self.panel.shift(1, axis='minor') + + # assert_frame_equal(self.panel.minor_xs(idx), + # shifted.minor_xs(idx_lag)) + + # self.assertRaises(Exception, self.panel.shift, 1, axis='items') + + def test_multiindex_get(self): + raise nose.SkipTest + # ind = MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1), ('b',2)], + # names=['first', 'second']) + # wp = Panel(np.random.random((4,5,5)), + # items=ind, + # major_axis=np.arange(5), + # minor_axis=np.arange(5)) + # f1 = wp['a'] + # f2 = wp.ix['a'] + # assert_panel_equal(f1, f2) + + # self.assert_((f1.items == [1, 2]).all()) + # self.assert_((f2.items == [1, 2]).all()) + + # ind = MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1)], + # names=['first', 'second']) + + def test_multiindex_blocks(self): + raise nose.SkipTest + # ind = MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1)], + # names=['first', 'second']) + # wp = Panel(self.panel._data) + # wp.items = ind + # f1 = wp['a'] + # self.assert_((f1.items == [1, 2]).all()) + + # f1 = wp[('b',1)] + # self.assert_((f1.columns == ['A', 'B', 'C', 'D']).all()) + + def test_repr_empty(self): + empty = FDPanel() + repr(empty) + + def test_rename(self): + mapper = { + 'l1' : 'foo', + 'l2' : 'bar', + 'l3' : 'baz' + } + + renamed = self.fdpanel.rename_axis(mapper, axis=0) + exp = Index(['foo', 'bar', 'baz']) + self.assert_(renamed.labels.equals(exp)) + + renamed = self.fdpanel.rename_axis(str.lower, axis=3) + exp = Index(['a', 'b', 'c', 'd']) + self.assert_(renamed.minor_axis.equals(exp)) + + # don't copy + renamed_nocopy = self.fdpanel.rename_axis(mapper, axis=0, copy=False) + renamed_nocopy['foo'] = 3. + self.assert_((self.fdpanel['l1'].values == 3).all()) + + def test_get_attr(self): + assert_panel_equal(self.fdpanel['l1'], self.fdpanel.l1) + + def test_group_agg(self): + values = np.ones((10, 2)) * np.arange(10).reshape((10, 1)) + bounds = np.arange(5) * 2 + f = lambda x: x.mean(axis=0) + + agged = group_agg(values, bounds, f) + + assert(agged[1][0] == 2.5) + assert(agged[2][0] == 4.5) + + # test a function that doesn't aggregate + f2 = lambda x: np.zeros((2,2)) + self.assertRaises(Exception, group_agg, values, bounds, f2) + + def test_from_frame_level1_unsorted(self): + raise nose.SkipTest + # tuples = [('MSFT', 3), ('MSFT', 2), ('AAPL', 2), + # ('AAPL', 1), ('MSFT', 1)] + # midx = MultiIndex.from_tuples(tuples) + # df = DataFrame(np.random.rand(5,4), index=midx) + # p = df.to_panel() + # assert_frame_equal(p.minor_xs(2), df.ix[:,2].sort_index()) + + def test_to_excel(self): + raise nose.SkipTest + # try: + # import xlwt + # import xlrd + # import openpyxl + # except ImportError: + # raise nose.SkipTest + + # for ext in ['xls', 'xlsx']: + # path = '__tmp__.' + ext + # self.panel.to_excel(path) + # reader = ExcelFile(path) + # for item, df in self.panel.iteritems(): + # recdf = reader.parse(str(item),index_col=0) + # assert_frame_equal(df, recdf) + # os.remove(path) + + +if __name__ == '__main__': + import nose + nose.runmodule(argv=[__file__,'-vvs','-x','--pdb', '--pdb-failure'], + exit=False) From bffd9a0f8e5d027aa11290e67a91e822d48e5160 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Fri, 7 Sep 2012 21:55:34 -0400 Subject: [PATCH 2/9] added missing _combine,_reduce,apply methods to work correctly on arithmetic operations all tests pass (except check_stat_op on var - the apply of np.sqrt fails on the resulting panel, very odd) --- pandas/core/fdpanel.py | 71 ++++++++++- pandas/tests/test_fdpanel.py | 226 ++++++++++++++++------------------- 2 files changed, 168 insertions(+), 129 deletions(-) diff --git a/pandas/core/fdpanel.py b/pandas/core/fdpanel.py index cdd3ef9c3af08..1a7e4fe191809 100755 --- a/pandas/core/fdpanel.py +++ b/pandas/core/fdpanel.py @@ -304,12 +304,12 @@ def _get_plane_axes(self, axis): if axis == 'major_axis': items = self.labels - major = self.minor_axis - minor = self.items + major = self.items + minor = self.minor_axis elif axis == 'minor_axis': items = self.labels - major = self.major_axis - minor = self.items + major = self.items + minor = self.major_axis elif axis == 'items': items = self.labels major = self.major_axis @@ -321,6 +321,16 @@ def _get_plane_axes(self, axis): return items, major, minor + def _reduce(self, op, axis=0, skipna=True): + axis_name = self._get_axis_name(axis) + axis_number = self._get_axis_number(axis_name) + f = lambda x: op(x, axis=axis_number, skipna=skipna) + + result = f(self.values) + + items, major, minor = self._get_plane_axes(axis_name) + return Panel(result, items=items, major_axis=major, minor_axis=minor) + def conform(self, panel, axis='labels'): """ Conform input Panel to align with chosen axis pair. @@ -447,6 +457,59 @@ def xs(self, key, axis=2, copy=True): new_data = self._data.xs(key, axis=axis_number, copy=copy) return Panel(new_data) + def apply(self, func, axis='major'): + """ + Apply + + Parameters + ---------- + func : numpy function + Signature should match numpy.{sum, mean, var, std} etc. + axis : {'labels', 'major', 'minor', 'items'} + fill_value : boolean, default True + Replace NaN values with specified first + + Returns + ------- + result : Panel or FDPanel + """ + i = self._get_axis_number(axis) + result = np.apply_along_axis(func, i, self.values) + return self._wrap_result(result, axis=axis) + + def _combine(self, other, func, axis=0): + if isinstance(other, FDPanel): + return self._combine_fdpanel(other, func) + elif isinstance(other, Panel): + raise NotImplementedError + elif isinstance(other, DataFrame): + raise NotImplementedError + elif np.isscalar(other): + new_values = func(self.values, other) + return self._constructor(new_values, self.labels, self.items, self.major_axis, + self.minor_axis) + + def _combine_fdpanel(self, other, func): + labels = self.labels + other.labels + items = self.items + other.items + major = self.major_axis + other.major_axis + minor = self.minor_axis + other.minor_axis + + # could check that everything's the same size, but forget it + this = self.reindex(labels=labels, items=items, major=major, minor=minor) + other = other.reindex(labels=labels, items=items, major=major, minor=minor) + + result_values = func(this.values, other.values) + + return self._constructor(result_values, labels, items, major, minor) + + def _wrap_result(self, result, axis): + axis = self._get_axis_name(axis) + items, major, minor = self._get_plane_axes(axis) + + return Panel(result, items=items, major_axis=major, minor_axis=minor) + + ### remove operations #### def major_xs(self, *args, **kwargs): raise NotImplementedError diff --git a/pandas/tests/test_fdpanel.py b/pandas/tests/test_fdpanel.py index 8aeb10f9b73e1..382a20fb889f3 100755 --- a/pandas/tests/test_fdpanel.py +++ b/pandas/tests/test_fdpanel.py @@ -48,14 +48,14 @@ def add_nans(fdp): class SafeForLongAndSparse(object): def test_repr(self): - foo = repr(self.panel) + foo = repr(self.fdpanel) def test_iter(self): - tm.equalContents(list(self.panel), self.panel.items) + tm.equalContents(list(self.fdpanel), self.fdpanel.labels) def test_count(self): f = lambda s: notnull(s).sum() - self._check_stat_op('count', f, obj=self.panel, has_skipna=False) + self._check_stat_op('count', f, obj=self.fdpanel, has_skipna=False) def test_sum(self): self._check_stat_op('sum', np.sum) @@ -118,7 +118,7 @@ def alt(x): def _check_stat_op(self, name, alternative, obj=None, has_skipna=True): if obj is None: - obj = self.panel + obj = self.fdpanel # # set some NAs # obj.ix[5:10] = np.nan @@ -138,14 +138,14 @@ def wrapper(x): for i in range(obj.ndim): result = f(axis=i, skipna=False) - assert_frame_equal(result, obj.apply(wrapper, axis=i)) + assert_panel_equal(result, obj.apply(wrapper, axis=i)) else: skipna_wrapper = alternative wrapper = alternative for i in range(obj.ndim): result = f(axis=i) - assert_frame_equal(result, obj.apply(skipna_wrapper, axis=i)) + assert_panel_equal(result, obj.apply(skipna_wrapper, axis=i)) self.assertRaises(Exception, f, axis=obj.ndim) @@ -155,172 +155,148 @@ class SafeForSparse(object): def assert_panel_equal(cls, x, y): assert_panel_equal(x, y) + @classmethod + def assert_fdpanel_equal(cls, x, y): + assert_fdpanel_equal(x, y) + def test_get_axis(self): - assert(self.panel._get_axis(0) is self.panel.items) - assert(self.panel._get_axis(1) is self.panel.major_axis) - assert(self.panel._get_axis(2) is self.panel.minor_axis) + assert(self.fdpanel._get_axis(0) is self.fdpanel.labels) + assert(self.fdpanel._get_axis(1) is self.fdpanel.items) + assert(self.fdpanel._get_axis(2) is self.fdpanel.major_axis) + assert(self.fdpanel._get_axis(3) is self.fdpanel.minor_axis) def test_set_axis(self): - new_items = Index(np.arange(len(self.panel.items))) - new_major = Index(np.arange(len(self.panel.major_axis))) - new_minor = Index(np.arange(len(self.panel.minor_axis))) + new_labels = Index(np.arange(len(self.fdpanel.labels))) + new_items = Index(np.arange(len(self.fdpanel.items))) + new_major = Index(np.arange(len(self.fdpanel.major_axis))) + new_minor = Index(np.arange(len(self.fdpanel.minor_axis))) # ensure propagate to potentially prior-cached items too - item = self.panel['ItemA'] - self.panel.items = new_items + label = self.fdpanel['l1'] + self.fdpanel.labels = new_labels - if hasattr(self.panel, '_item_cache'): - self.assert_('ItemA' not in self.panel._item_cache) - self.assert_(self.panel.items is new_items) + if hasattr(self.fdpanel, '_item_cache'): + self.assert_('l1' not in self.fdpanel._item_cache) + self.assert_(self.fdpanel.labels is new_labels) - item = self.panel[0] - self.panel.major_axis = new_major - self.assert_(self.panel[0].index is new_major) - self.assert_(self.panel.major_axis is new_major) + self.fdpanel.major_axis = new_major + self.assert_(self.fdpanel[0].major_axis is new_major) + self.assert_(self.fdpanel.major_axis is new_major) - item = self.panel[0] - self.panel.minor_axis = new_minor - self.assert_(self.panel[0].columns is new_minor) - self.assert_(self.panel.minor_axis is new_minor) + self.fdpanel.minor_axis = new_minor + self.assert_(self.fdpanel[0].minor_axis is new_minor) + self.assert_(self.fdpanel.minor_axis is new_minor) def test_get_axis_number(self): - self.assertEqual(self.panel._get_axis_number('items'), 0) - self.assertEqual(self.panel._get_axis_number('major'), 1) - self.assertEqual(self.panel._get_axis_number('minor'), 2) + self.assertEqual(self.fdpanel._get_axis_number('labels'), 0) + self.assertEqual(self.fdpanel._get_axis_number('items'), 1) + self.assertEqual(self.fdpanel._get_axis_number('major'), 2) + self.assertEqual(self.fdpanel._get_axis_number('minor'), 3) def test_get_axis_name(self): - self.assertEqual(self.panel._get_axis_name(0), 'items') - self.assertEqual(self.panel._get_axis_name(1), 'major_axis') - self.assertEqual(self.panel._get_axis_name(2), 'minor_axis') + self.assertEqual(self.fdpanel._get_axis_name(0), 'labels') + self.assertEqual(self.fdpanel._get_axis_name(1), 'items') + self.assertEqual(self.fdpanel._get_axis_name(2), 'major_axis') + self.assertEqual(self.fdpanel._get_axis_name(3), 'minor_axis') - def test_get_plane_axes(self): - # what to do here? + #def test_get_plane_axes(self): + # # what to do here? - index, columns = self.panel._get_plane_axes('items') - index, columns = self.panel._get_plane_axes('major_axis') - index, columns = self.panel._get_plane_axes('minor_axis') - index, columns = self.panel._get_plane_axes(0) + # index, columns = self.panel._get_plane_axes('items') + # index, columns = self.panel._get_plane_axes('major_axis') + # index, columns = self.panel._get_plane_axes('minor_axis') + # index, columns = self.panel._get_plane_axes(0) def test_truncate(self): - dates = self.panel.major_axis - start, end = dates[1], dates[5] + raise nose.SkipTest + + #dates = self.panel.major_axis + #start, end = dates[1], dates[5] - trunced = self.panel.truncate(start, end, axis='major') - expected = self.panel['ItemA'].truncate(start, end) + #trunced = self.panel.truncate(start, end, axis='major') + #expected = self.panel['ItemA'].truncate(start, end) - assert_frame_equal(trunced['ItemA'], expected) + #assert_frame_equal(trunced['ItemA'], expected) - trunced = self.panel.truncate(before=start, axis='major') - expected = self.panel['ItemA'].truncate(before=start) + #trunced = self.panel.truncate(before=start, axis='major') + #expected = self.panel['ItemA'].truncate(before=start) - assert_frame_equal(trunced['ItemA'], expected) + #assert_frame_equal(trunced['ItemA'], expected) - trunced = self.panel.truncate(after=end, axis='major') - expected = self.panel['ItemA'].truncate(after=end) + #trunced = self.panel.truncate(after=end, axis='major') + #expected = self.panel['ItemA'].truncate(after=end) - assert_frame_equal(trunced['ItemA'], expected) + #assert_frame_equal(trunced['ItemA'], expected) # XXX test other axes def test_arith(self): - self._test_op(self.panel, operator.add) - self._test_op(self.panel, operator.sub) - self._test_op(self.panel, operator.mul) - self._test_op(self.panel, operator.truediv) - self._test_op(self.panel, operator.floordiv) - self._test_op(self.panel, operator.pow) + self._test_op(self.fdpanel, operator.add) + self._test_op(self.fdpanel, operator.sub) + self._test_op(self.fdpanel, operator.mul) + self._test_op(self.fdpanel, operator.truediv) + self._test_op(self.fdpanel, operator.floordiv) + self._test_op(self.fdpanel, operator.pow) - self._test_op(self.panel, lambda x, y: y + x) - self._test_op(self.panel, lambda x, y: y - x) - self._test_op(self.panel, lambda x, y: y * x) - self._test_op(self.panel, lambda x, y: y / x) - self._test_op(self.panel, lambda x, y: y ** x) + self._test_op(self.fdpanel, lambda x, y: y + x) + self._test_op(self.fdpanel, lambda x, y: y - x) + self._test_op(self.fdpanel, lambda x, y: y * x) + self._test_op(self.fdpanel, lambda x, y: y / x) + self._test_op(self.fdpanel, lambda x, y: y ** x) - self.assertRaises(Exception, self.panel.__add__, self.panel['ItemA']) + self.assertRaises(Exception, self.fdpanel.__add__, self.fdpanel['l1']) @staticmethod - def _test_op(panel, op): - result = op(panel, 1) - assert_frame_equal(result['ItemA'], op(panel['ItemA'], 1)) + def _test_op(fdpanel, op): + result = op(fdpanel, 1) + assert_panel_equal(result['l1'], op(fdpanel['l1'], 1)) def test_keys(self): - tm.equalContents(self.panel.keys(), self.panel.items) + tm.equalContents(self.fdpanel.keys(), self.fdpanel.labels) def test_iteritems(self): - """Test panel.iteritems(), aka panel.iterkv()""" + """Test fdpanel.iteritems(), aka fdpanel.iterkv()""" # just test that it works - for k, v in self.panel.iterkv(): + for k, v in self.fdpanel.iterkv(): pass - self.assertEqual(len(list(self.panel.iterkv())), - len(self.panel.items)) - - def test_combineFrame(self): - def check_op(op, name): - # items - df = self.panel['ItemA'] - - func = getattr(self.panel, name) - - result = func(df, axis='items') - - assert_frame_equal(result['ItemB'], op(self.panel['ItemB'], df)) - - # major - xs = self.panel.major_xs(self.panel.major_axis[0]) - result = func(xs, axis='major') + self.assertEqual(len(list(self.fdpanel.iterkv())), + len(self.fdpanel.labels)) - idx = self.panel.major_axis[1] - - assert_frame_equal(result.major_xs(idx), - op(self.panel.major_xs(idx), xs)) - - # minor - xs = self.panel.minor_xs(self.panel.minor_axis[0]) - result = func(xs, axis='minor') - - idx = self.panel.minor_axis[1] - - assert_frame_equal(result.minor_xs(idx), - op(self.panel.minor_xs(idx), xs)) - - check_op(operator.add, 'add') - check_op(operator.sub, 'subtract') - check_op(operator.mul, 'multiply') - if py3compat.PY3: - check_op(operator.truediv, 'divide') - else: - check_op(operator.div, 'divide') - - def test_combinePanel(self): - result = self.panel.add(self.panel) - self.assert_panel_equal(result, self.panel * 2) + def test_combineFDPanel(self): + result = self.fdpanel.add(self.fdpanel) + self.assert_fdpanel_equal(result, self.fdpanel * 2) def test_neg(self): - self.assert_panel_equal(-self.panel, self.panel * -1) + self.assert_fdpanel_equal(-self.fdpanel, self.fdpanel * -1) def test_select(self): - p = self.panel + p = self.fdpanel + + # select labels + result = p.select(lambda x: x in ('l1', 'l3'), axis='labels') + expected = p.reindex(labels=['l1','l3']) + self.assert_fdpanel_equal(result, expected) # select items result = p.select(lambda x: x in ('ItemA', 'ItemC'), axis='items') expected = p.reindex(items=['ItemA', 'ItemC']) - self.assert_panel_equal(result, expected) + self.assert_fdpanel_equal(result, expected) # select major_axis result = p.select(lambda x: x >= datetime(2000, 1, 15), axis='major') new_major = p.major_axis[p.major_axis >= datetime(2000, 1, 15)] expected = p.reindex(major=new_major) - self.assert_panel_equal(result, expected) + self.assert_fdpanel_equal(result, expected) # select minor_axis - result = p.select(lambda x: x in ('D', 'A'), axis=2) + result = p.select(lambda x: x in ('D', 'A'), axis=3) expected = p.reindex(minor=['A', 'D']) - self.assert_panel_equal(result, expected) + self.assert_fdpanel_equal(result, expected) # corner case, empty thing result = p.select(lambda x: x in ('foo',), axis='items') - self.assert_panel_equal(result, p.reindex(items=[])) + self.assert_fdpanel_equal(result, p.reindex(items=[])) def test_get_value(self): for item in self.panel.items: @@ -331,20 +307,20 @@ def test_get_value(self): assert_almost_equal(result, expected) def test_abs(self): - result = self.panel.abs() - expected = np.abs(self.panel) - self.assert_panel_equal(result, expected) + result = self.fdpanel.abs() + expected = np.abs(self.fdpanel) + self.assert_fdpanel_equal(result, expected) - df = self.panel['ItemA'] + p = self.fdpanel['l1'] + result = p.abs() + expected = np.abs(p) + assert_panel_equal(result, expected) + + df = p['ItemA'] result = df.abs() expected = np.abs(df) assert_frame_equal(result, expected) - s = df['A'] - result = s.abs() - expected = np.abs(s) - assert_series_equal(result, expected) - class CheckIndexing(object): @@ -605,7 +581,7 @@ def test_set_value(self): res3 = self.fdpanel.set_value('l4', 'ItemE', 'foobar', 'baz', 5) self.assert_(com.is_float_dtype(res3['l4'].values)) -class TestFDPanel(unittest.TestCase, CheckIndexing): +class TestFDPanel(unittest.TestCase, CheckIndexing, SafeForSparse, SafeForLongAndSparse): @classmethod def assert_fdpanel_equal(cls,x, y): From 8bf2c8db36000efe464d01e533f15bae37b22cdc Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Sat, 8 Sep 2012 12:37:29 -0400 Subject: [PATCH 3/9] added FDPanel to the default api imports --- pandas/core/api.py | 1 + 1 file changed, 1 insertion(+) mode change 100644 => 100755 pandas/core/api.py diff --git a/pandas/core/api.py b/pandas/core/api.py old mode 100644 new mode 100755 index 8cf3b7f4cbda4..f8a0dcdb07ba4 --- a/pandas/core/api.py +++ b/pandas/core/api.py @@ -14,6 +14,7 @@ from pandas.core.series import Series, TimeSeries from pandas.core.frame import DataFrame from pandas.core.panel import Panel +from pandas.core.fdpanel import FDPanel from pandas.core.groupby import groupby from pandas.core.reshape import (pivot_simple as pivot, get_dummies, lreshape) From ad2bb6a054c1dfc361748ebc65c497e6bf10460e Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Sat, 8 Sep 2012 12:37:57 -0400 Subject: [PATCH 4/9] moved assert_fdpanel_equal and makeFDPanel out of test_fdpanel.py into pandas.util.testing --- pandas/tests/test_fdpanel.py | 20 ++------------------ pandas/util/testing.py | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 18 deletions(-) mode change 100644 => 100755 pandas/util/testing.py diff --git a/pandas/tests/test_fdpanel.py b/pandas/tests/test_fdpanel.py index 382a20fb889f3..83e6db0c82194 100755 --- a/pandas/tests/test_fdpanel.py +++ b/pandas/tests/test_fdpanel.py @@ -18,28 +18,12 @@ from pandas.io.parsers import (ExcelFile, ExcelWriter) from pandas.util.testing import (assert_panel_equal, + assert_fdpanel_equal, assert_frame_equal, assert_series_equal, assert_almost_equal) import pandas.util.testing as tm -def assert_fdpanel_equal(left, right): - assert(left.labels.equals(right.labels)) - assert(left.items.equals(right.items)) - assert(left.major_axis.equals(right.major_axis)) - assert(left.minor_axis.equals(right.minor_axis)) - - for col, series in left.iterkv(): - assert(col in right) - assert_panel_equal(series, right[col]) - - for col in right: - assert(col in left) - - -def makeFDPanel(): - return FDPanel(dict(l1 = tm.makePanel(), l2 = tm.makePanel(), l3 = tm.makePanel())) - def add_nans(fdp): for l, label in enumerate(fdp.labels): panel = fdp[label] @@ -588,7 +572,7 @@ def assert_fdpanel_equal(cls,x, y): assert_fdpanel_equal(x, y) def setUp(self): - self.fdpanel = makeFDPanel() + self.fdpanel = tm.makeFDPanel() add_nans(self.fdpanel) def test_constructor(self): diff --git a/pandas/util/testing.py b/pandas/util/testing.py old mode 100644 new mode 100755 index 01117f3e9b4c0..8fc0aadd030f5 --- a/pandas/util/testing.py +++ b/pandas/util/testing.py @@ -17,6 +17,7 @@ import pandas.core.series as series import pandas.core.frame as frame import pandas.core.panel as panel +import pandas.core.fdpanel as fdpanel from pandas import bdate_range from pandas.tseries.index import DatetimeIndex @@ -28,6 +29,7 @@ Series = series.Series DataFrame = frame.DataFrame Panel = panel.Panel +FDPanel = fdpanel.FDPanel N = 30 K = 4 @@ -173,6 +175,19 @@ def assert_panel_equal(left, right, check_panel_type=False): for col in right: assert(col in left) +def assert_fdpanel_equal(left, right): + assert(left.labels.equals(right.labels)) + assert(left.items.equals(right.items)) + assert(left.major_axis.equals(right.major_axis)) + assert(left.minor_axis.equals(right.minor_axis)) + + for col, series in left.iterkv(): + assert(col in right) + assert_panel_equal(series, right[col]) + + for col in right: + assert(col in left) + def assert_contains_all(iterable, dic): for k in iterable: assert(k in dic) @@ -266,6 +281,9 @@ def makePanel(): data = dict((c, makeTimeDataFrame()) for c in cols) return Panel.fromDict(data) +def makeFDPanel(): + return FDPanel(dict(l1 = makePanel(), l2 = makePanel(), l3 = makePanel())) + def add_nans(panel): I, J, N = panel.shape for i, item in enumerate(panel.items): From 524542bc6c491a4dd8b159a1ec5ffea570abfcb9 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Sat, 8 Sep 2012 12:38:37 -0400 Subject: [PATCH 5/9] enhanced pandas.io.pytables to support FDPanel select(key, value=None, where=None): will now return a Panel or FDPanel if value is None and the contained objects are homogeneous DataFrames (returns Panel), or Panels (returns FDPanel) put/append support putting/appending of FDPanel and dicts of sub-objects test_pytables.py has been updated with a number of new tests to handle the new functionality all existing tests pass (FDPanel functionaility should be backwards compatible) --- pandas/io/pytables.py | 134 ++++++++++++++++++++++++----- pandas/io/tests/test_pytables.py | 140 ++++++++++++++++++++++++++++++- 2 files changed, 251 insertions(+), 23 deletions(-) mode change 100644 => 100755 pandas/io/pytables.py mode change 100644 => 100755 pandas/io/tests/test_pytables.py diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py old mode 100644 new mode 100755 index d116337c80e4d..17577625fb559 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -10,7 +10,7 @@ import numpy as np from pandas import ( - Series, TimeSeries, DataFrame, Panel, Index, MultiIndex, Int64Index + Series, TimeSeries, DataFrame, Panel, FDPanel, Index, MultiIndex, Int64Index ) from pandas.sparse.api import SparseSeries, SparseDataFrame, SparsePanel from pandas.sparse.array import BlockIndex, IntIndex @@ -160,6 +160,11 @@ class HDFStore(object): >>> store['foo'] = bar # write to HDF5 >>> bar = store['foo'] # retrieve >>> store.close() + + >>> store = HDFStore('test.h5') + >>> store.put(fdp) # write a FDPanel/dict to the store + >>> fdp = store.select() # read back a FDPanel (or Panel) + """ _quiet = False @@ -284,18 +289,22 @@ def get(self, key): except (exc_type, AttributeError): raise KeyError('No object named %s in the file' % key) - def select(self, key, where=None): + def select(self, key=None, where=None): """ Retrieve pandas object stored in file, optionally based on where criteria Parameters ---------- - key : object + key : object, optional where : list, optional Must be a list of dict objects of the following forms. Selection can be performed on the 'index' or 'column' fields. + + Object Selection (equivalent to passing a key) + {'field' : 'key', + 'value' : ['v1',v2']} Comparison op {'field' : 'index', @@ -311,13 +320,41 @@ def select(self, key, where=None): 'value' : [v1, v2, v3]} """ - group = getattr(self.handle.root, key, None) - if 'table' not in group._v_attrs.pandas_type: - raise Exception('can only select on objects written as tables') - if group is not None: - return self._read_group(group, where) - def put(self, key, value, table=False, append=False, + # see if we have a key in the where, otherwise, try for all keys + if key is None: + key = Selection(where = where).keys + if not len(key): + key = self.keys() + + if not isinstance(key,list): + key = [ key ] + + def _select(k): + group = getattr(self.handle.root, k, None) + if group is not None: + self._has_selection_criteria(group, where) + return self._read_group(group, where) + + d = dict([ (k, _select(k)) for k in key ]) + + # nothing retrieved, return None + if len(d) == 0: + return None + + # if we have only a single key, return that object directly + elif len(d) == 1: + return d.values()[0] + + # try to return a consolidated object from d (if the nodes are all Frames, return a Panel, if all panels, return a FDPanel, else return a dict) + elif all([ isinstance(o,DataFrame) for o in d.values() ]): + return Panel(d) + elif all([ isinstance(o,Panel) for o in d.values() ]): + return FDPanel(d) + + return d + + def put(self, key, value=None, table=False, append=False, compression=None): """ Store object in HDFStore @@ -325,7 +362,7 @@ def put(self, key, value, table=False, append=False, Parameters ---------- key : object - value : {Series, DataFrame, Panel} + value : {Series, DataFrame, Panel, FDPanel} table : boolean, default False Write as a PyTables Table structure which may perform worse but allow more flexible operations like searching / selecting subsets of @@ -338,8 +375,23 @@ def put(self, key, value, table=False, append=False, If None, the compression settings specified in the ctor will be used. """ - self._write_to_group(key, value, table=table, append=append, - comp=compression) + + # do we have a dict or FDPanel? + if value is None: + def _put(k, v): + self._write_to_group(k, v, table=table, append=append, + comp=compression) + if isinstance(key, dict): + for k, v in key.items(): + _put(k, v) + elif isinstance(key, FDPanel): + for k, v in key.iteritems(): + _put(k, v) + else: + raise Exception("value must be passed to store a non-dict like object in put") + else: + self._write_to_group(key, value, table=table, append=append, + comp=compression) def _get_handler(self, op, kind): return getattr(self,'_%s_%s' % (op, kind)) @@ -367,7 +419,7 @@ def remove(self, key, where=None): if group is not None: self._delete_from_table(group, where) - def append(self, key, value): + def append(self, key, value = None): """ Append to Table in file. Node must already exist and be Table format. @@ -375,14 +427,28 @@ def append(self, key, value): Parameters ---------- key : object - value : {Series, DataFrame, Panel} + value : {Series, DataFrame, Panel, FDPanel} Notes ----- Does *not* check if data being appended overlaps with existing data in the table, so be careful """ - self._write_to_group(key, value, table=True, append=True) + + # do we have a dict or FDPanel? + if value is None: + def _append(k, v): + self._write_to_group(k, v, table=True, append = True) + if isinstance(key, dict): + for k, v in key.items(): + _append(k, v) + elif isinstance(key, FDPanel): + for k, v in key.iteritems(): + _append(k, v) + else: + raise Exception("value must be passed to store a non-dict like object in append") + else: + self._write_to_group(key, value, table=True, append=True) def _write_to_group(self, key, value, table=False, append=False, comp=None): @@ -796,6 +862,13 @@ def _write_table(self, group, items=None, index=None, columns=None, pass raise + def _has_selection_criteria(self, group, where): + """ only raise an exception if where are not capable of processing it (e.g. a table) """ + if where is None: return False + if 'table' not in group._v_attrs.pandas_type: + raise Exception('can only select on objects written as tables') + return False + def _read_group(self, group, where=None): kind = group._v_attrs.pandas_type kind = _LEGACY_MAP.get(kind, kind) @@ -1051,6 +1124,10 @@ class Selection(object): table : tables.Table where : list of dicts of the following form + Object Selection + {'field' : 'key', + 'value' : ['v1',v2']} + Comparison op {'field' : 'index', 'op' : '>=', @@ -1064,30 +1141,45 @@ class Selection(object): {'field' : 'index', 'value' : [v1, v2, v3]} """ - def __init__(self, table, where=None, index_kind=None): - self.table = table - self.where = where - self.index_kind = index_kind + def __init__(self, table=None, where=None, index_kind=None): + self.table = table + self.where = where + self.index_kind = index_kind self.column_filter = None self.the_condition = None - self.conditions = [] - self.values = None + self.conditions = [] + self.values = None + self.keys = [] if where: self.generate(where) def generate(self, where): + + if where is None: return + if not isinstance(where, list): + where = [ where ] + # and condictions for c in where: op = c.get('op',None) value = c['value'] field = c['field'] + # index selection if field == 'index' and self.index_kind == 'datetime64': val = lib.Timestamp(value).value self.conditions.append('(%s %s %s)' % (field,op,val)) elif field == 'index' and isinstance(value, datetime): value = time.mktime(value.timetuple()) self.conditions.append('(%s %s %s)' % (field,op,value)) + + # create keys + elif field == 'key': + if not isinstance(value, list): + value = [ value ] + self.keys.extend(value) + + # column selection else: self.generate_multiple_conditions(op,value,field) diff --git a/pandas/io/tests/test_pytables.py b/pandas/io/tests/test_pytables.py old mode 100644 new mode 100755 index 29d3b45f26a9e..946635e1d5365 --- a/pandas/io/tests/test_pytables.py +++ b/pandas/io/tests/test_pytables.py @@ -8,7 +8,7 @@ from datetime import datetime import numpy as np -from pandas import (Series, DataFrame, Panel, MultiIndex, bdate_range, +from pandas import (Series, DataFrame, Panel, FDPanel, MultiIndex, bdate_range, date_range, Index) from pandas.io.pytables import HDFStore, get_store import pandas.util.testing as tm @@ -501,6 +501,109 @@ def test_overwrite_node(self): tm.assert_series_equal(self.store['a'], ts) + def test_fdpanel_select_from_multiple_panels(self): + + try: + store = HDFStore(self.scratchpath) + + p1 = tm.makePanel() + p2 = tm.makePanel() + store.put('p1', p1) + store.put('p2', p2) + + # individually + result = store.select('p1') + tm.assert_panel_equal(result, p1) + result = store.select('p2') + tm.assert_panel_equal(result, p2) + + # as a fdpanel + fdp = FDPanel(dict(p1 = p1, p2 = p2)) + result = store.select() + tm.assert_fdpanel_equal(result, fdp) + + finally: + store.close() + os.remove(self.scratchpath) + + def test_fdpanel_put(self): + + try: + store = HDFStore(self.scratchpath) + + # fdpanel + fdp = FDPanel(dict(p1 = tm.makePanel(), p2 = tm.makePanel())) + store.put(fdp) + result = store.select() + tm.assert_fdpanel_equal(result, fdp) + + # store dict (retrieve as a FDPanel though) + d = dict(p1 = tm.makePanel(), p2 = tm.makePanel()) + store.put(d) + result = store.select() + tm.assert_fdpanel_equal(result, FDPanel(d)) + + # test value=None (but not a corresponding dict like key) + p = tm.makePanel() + self.assertRaises(Exception, self.store.put, p) + + finally: + store.close() + os.remove(self.scratchpath) + + def test_fdpanel_append(self): + + # regular append + df = tm.makeTimeDataFrame() + expected = FDPanel(dict(l1 = dict(ItemA = df, ItemB = df), l2 = dict(ItemC = df, ItemD = df))) + try: + store = HDFStore(self.scratchpath) + store.append(expected.reindex(major = expected.major_axis[0:10])) + store.append(expected.reindex(major = expected.major_axis[10:])) + result = store.select() + tm.assert_fdpanel_equal(result, expected) + finally: + store.close() + os.remove(self.scratchpath) + + # appending a panel to another panel (in the same tree - fails because items dont' match + p1 = tm.makePanel() + p2 = p1.rename_axis(dict(ItemA = 'ItemD', ItemB = 'ItemE', ItemC = 'ItemF')) + fdp1 = FDPanel(dict(l1 = p1)) + fdp2 = FDPanel(dict(l1 = p2)) + try: + store = HDFStore(self.scratchpath) + store.append(fdp1) + self.assertRaises(Exception, store.append, fdp2) + finally: + store.close() + os.remove(self.scratchpath) + + def test_panel_select_from_multiple_frames(self): + + try: + store = HDFStore(self.scratchpath) + + df1 = tm.makeTimeDataFrame() + df2 = tm.makeTimeDataFrame() + store.put('df1', df1) + store.put('df2', df2) + + # individually + result = store.select('df1') + tm.assert_frame_equal(result, df1) + result = store.select('df2') + tm.assert_frame_equal(result, df2) + + # as a panel + p = Panel(dict(df1 = df1, df2 = df2)) + result = store.select() + tm.assert_panel_equal(result, p) + + finally: + store.close() + os.remove(self.scratchpath) + def test_panel_select(self): wp = tm.makePanel() self.store.put('wp', wp, table=True) @@ -520,6 +623,35 @@ def test_panel_select(self): expected = wp.truncate(before=date).reindex(minor=['A', 'D']) tm.assert_panel_equal(result, expected) + def test_panel_select_infer_key(self): + wp = tm.makePanel() + self.store.put('wp', wp, table=True) + date = wp.major_axis[len(wp.major_axis) // 2] + + crit1 = { + 'field' : 'index', + 'op' : '>=', + 'value' : date + } + crit2 = { + 'field' : 'column', + 'value' : ['A', 'D'] + } + crit3 = { + 'field' : 'key', + 'value' : 'wp', + } + + result = self.store.select(where = [crit1, crit2, crit3]) + expected = wp.truncate(before=date).reindex(minor=['A', 'D']) + tm.assert_panel_equal(result, expected) + + def test_panel_select_no_key_specified(self): + wp = tm.makePanel() + self.store.put('wp', wp, table=True) + result = self.store.select() + tm.assert_panel_equal(result, wp) + def test_frame_select(self): df = tm.makeTimeDataFrame() self.store.put('frame', df, table=True) @@ -538,8 +670,12 @@ def test_frame_select(self): 'field' : 'column', 'value' : 'A' } + crit4 = { + 'field' : 'key', + 'value' : ['frame'] + } - result = self.store.select('frame', [crit1, crit2]) + result = self.store.select(where = [crit1, crit2,crit4]) expected = df.ix[date:, ['A', 'D']] tm.assert_frame_equal(result, expected) From 79da25b9efd62653cc318fb1319a979502297056 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Sun, 9 Sep 2012 13:20:09 -0400 Subject: [PATCH 6/9] code reduction in put/append small optimization in select all tests pass --- pandas/io/pytables.py | 49 ++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 17577625fb559..0f386c7e4aca5 100755 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -330,26 +330,29 @@ def select(self, key=None, where=None): if not isinstance(key,list): key = [ key ] - def _select(k): + # construct a dict of the results (of only valid keys) + d = dict() + for k in key: group = getattr(self.handle.root, k, None) if group is not None: self._has_selection_criteria(group, where) - return self._read_group(group, where) + d[k] = self._read_group(group, where) - d = dict([ (k, _select(k)) for k in key ]) + values = d.values() # nothing retrieved, return None - if len(d) == 0: + if len(values) == 0: return None # if we have only a single key, return that object directly - elif len(d) == 1: - return d.values()[0] + elif len(values) == 1: + return values[0] # try to return a consolidated object from d (if the nodes are all Frames, return a Panel, if all panels, return a FDPanel, else return a dict) - elif all([ isinstance(o,DataFrame) for o in d.values() ]): + elif all([ isinstance(o,DataFrame) for o in values ]): return Panel(d) - elif all([ isinstance(o,Panel) for o in d.values() ]): + + elif all([ isinstance(o,Panel) for o in values ]): return FDPanel(d) return d @@ -376,22 +379,20 @@ def put(self, key, value=None, table=False, append=False, be used. """ + def _put(k, v): + self._write_to_group(k, v, table=table, append=append, comp=compression) + # do we have a dict or FDPanel? if value is None: - def _put(k, v): - self._write_to_group(k, v, table=table, append=append, - comp=compression) - if isinstance(key, dict): - for k, v in key.items(): - _put(k, v) - elif isinstance(key, FDPanel): + if isinstance(key, (dict, FDPanel)): for k, v in key.iteritems(): _put(k, v) else: raise Exception("value must be passed to store a non-dict like object in put") + + # group put else: - self._write_to_group(key, value, table=table, append=append, - comp=compression) + _put(key, value) def _get_handler(self, op, kind): return getattr(self,'_%s_%s' % (op, kind)) @@ -435,20 +436,20 @@ def append(self, key, value = None): data in the table, so be careful """ + def _append(k, v): + self._write_to_group(k, v, table=True, append = True) + # do we have a dict or FDPanel? if value is None: - def _append(k, v): - self._write_to_group(k, v, table=True, append = True) - if isinstance(key, dict): - for k, v in key.items(): - _append(k, v) - elif isinstance(key, FDPanel): + if isinstance(key, (dict, FDPanel)): for k, v in key.iteritems(): _append(k, v) else: raise Exception("value must be passed to store a non-dict like object in append") + + # group append else: - self._write_to_group(key, value, table=True, append=True) + _append(key, value) def _write_to_group(self, key, value, table=False, append=False, comp=None): From 366f20558cf33b7ca62ea4f57fa55546a9eaa0a0 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Mon, 10 Sep 2012 09:21:52 -0400 Subject: [PATCH 7/9] patch for detecting backwards incompatibility in prior pandas 0.8 (e.g. conflict with datetime64 on existing data) --- pandas/io/pytables.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 0f386c7e4aca5..e3b84fba82f45 100755 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -825,6 +825,12 @@ def _write_table(self, group, items=None, index=None, columns=None, # the table must already exist table = getattr(group, 'table', None) + # check for backwards incompatibility + if append: + existing_kind = table._v_attrs.index_kind + if existing_kind != index_kind: + raise Exception("incompatible kind in index [%s - %s]" % (existing_kind,index_kind)) + # add kinds table._v_attrs.index_kind = index_kind table._v_attrs.columns_kind = cols_kind From 307920fbbcd0fcf912a936df59f2029fd6bee3ea Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Mon, 10 Sep 2012 16:58:00 -0400 Subject: [PATCH 8/9] return the number of rows on a remove (of a table, otherwise None) delete optimized for consecutive rows --- pandas/io/pytables.py | 47 ++++++++++++++++++++++++-------- pandas/io/tests/test_pytables.py | 5 +++- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index e3b84fba82f45..26b1fd134ee26 100755 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -412,13 +412,23 @@ def remove(self, key, where=None): Parameters ---------- key : object + + Returns + ------- + number of rows removed + """ - if where is None: - self.handle.removeNode(self.handle.root, key, recursive=True) - else: - group = getattr(self.handle.root, key, None) - if group is not None: - self._delete_from_table(group, where) + n = None + group = getattr(self.handle.root, key, None) + if group is not None: + if where is None: + if self._has_selection_criteria(group,where): + n = group.nrows + self.handle.removeNode(self.handle.root, key, recursive=True) + else: + self._has_selection_criteria(group,where) + n = self._delete_from_table(group, where) + return n def append(self, key, value = None): """ @@ -985,12 +995,25 @@ def _delete_from_table(self, group, where = None): s.select_coords() # delete the rows in reverse order - l = list(s.values) - l.reverse() - for c in l: - table.removeRows(c) - self.handle.flush() - return len(s.values) + l = list(s.values) + ln = len(l) + + if ln: + + # if we can do a consecutive removal - do it! + if l[0]+ln-1 == l[-1]: + table.removeRows(start = l[0], stop = l[-1]+1) + + # one by one + else: + l.reverse() + for c in l: + table.removeRows(c) + + self.handle.flush() + + return ln + def _convert_index(index): if isinstance(index, DatetimeIndex): diff --git a/pandas/io/tests/test_pytables.py b/pandas/io/tests/test_pytables.py index 946635e1d5365..6c9e10dc559c6 100755 --- a/pandas/io/tests/test_pytables.py +++ b/pandas/io/tests/test_pytables.py @@ -190,11 +190,14 @@ def test_remove_crit(self): 'value' : ['A', 'D'] } self.store.remove('wp', where=[crit1]) - self.store.remove('wp', where=[crit2]) + n = self.store.remove('wp', where=[crit2]) result = self.store['wp'] expected = wp.truncate(after=date).reindex(minor=['B', 'C']) tm.assert_panel_equal(result, expected) + # removed rows + self.assert_(n == len(expected.major_axis)*len(expected.minor_axis)) + def test_series(self): s = tm.makeStringSeries() self._check_roundtrip(s, tm.assert_series_equal) From f964cd741957231fd0ad45973b117ae30a9ed5fc Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Tue, 2 Oct 2012 07:38:35 -0400 Subject: [PATCH 9/9] added HDFStore documenation examples --- examples/HDFStore.ipynb | 450 ++++++++++++++++++++++++++++++++++++++++ examples/HDFStore.pdf | Bin 0 -> 192579 bytes 2 files changed, 450 insertions(+) create mode 100755 examples/HDFStore.ipynb create mode 100755 examples/HDFStore.pdf diff --git a/examples/HDFStore.ipynb b/examples/HDFStore.ipynb new file mode 100755 index 0000000000000..52b8e45d70d5d --- /dev/null +++ b/examples/HDFStore.ipynb @@ -0,0 +1,450 @@ +{ + "metadata": { + "name": "HDFStore" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Extension of the HDFStore Documenation to show Table usage \n", + "Excellect original docs @ http://pandas.pydata.org/pandas-docs/stable/io.html#hdf5-pytables \n", + " \n", + "HDFStore supports a Table object to enable HDF5 storage of appendable DataFrames and Panels" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import pandas\n", + "import numpy as np\n", + "import os" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "if os.path.exists('store.h5'):\n", + " os.remove('store.h5')\n", + "store = pandas.io.pytables.HDFStore('store.h5')\n", + "store" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "pyout", + "prompt_number": 2, + "text": [ + "\n", + "File path: store.h5\n", + "Empty" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "p = pandas.Panel(np.random.randn(2, 30, 4), items=['Item1', 'Item2'],\n", + " major_axis=pandas.date_range('1/1/2000', periods=30),\n", + " minor_axis=['A', 'B', 'C', 'D'])\n", + "p" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "pyout", + "prompt_number": 3, + "text": [ + "\n", + "Dimensions: 2 (items) x 30 (major) x 4 (minor)\n", + "Items: Item1 to Item2\n", + "Major axis: 2000-01-01 00:00:00 to 2000-01-30 00:00:00\n", + "Minor axis: A to D" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# regular store and retreive of a panel (.put is equivalent to store['mypanel'] = p, .get to store['mypanel'])\n", + "store.put('mypanel',p)\n", + "mypanel = store.get('mypanel')\n", + "mypanel" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "pyout", + "prompt_number": 18, + "text": [ + "\n", + "Dimensions: 2 (items) x 30 (major) x 4 (minor)\n", + "Items: Item1 to Item2\n", + "Major axis: 2000-01-01 00:00:00 to 2000-01-30 00:00:00\n", + "Minor axis: A to D" + ] + } + ], + "prompt_number": 18 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# slice out 2 panels from the major_axis\n", + "p1 = p.ix[:,0:10,:]\n", + "p2 = p.ix[:,10:,:]\n", + "print p1\n", + "print p2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "Dimensions: 2 (items) x 10 (major) x 4 (minor)\n", + "Items: Item1 to Item2\n", + "Major axis: 2000-01-01 00:00:00 to 2000-01-10 00:00:00\n", + "Minor axis: A to D\n", + "\n", + "Dimensions: 2 (items) x 20 (major) x 4 (minor)\n", + "Items: Item1 to Item2\n", + "Major axis: 2000-01-11 00:00:00 to 2000-01-30 00:00:00\n", + "Minor axis: A to D\n" + ] + } + ], + "prompt_number": 19 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# store panels via append\n", + "store.append('appendpanel',p1)\n", + "store.append('appendpanel',p2)\n", + "store" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "pyout", + "prompt_number": 6, + "text": [ + "\n", + "File path: store.h5\n", + "appendpanel Panel (Table)\n", + "mypanel Panel " + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# retrieve\n", + "appendpanel = store.select('appendpanel')\n", + "appendpanel" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "pyout", + "prompt_number": 7, + "text": [ + "\n", + "Dimensions: 2 (items) x 30 (major) x 4 (minor)\n", + "Items: Item1 to Item2\n", + "Major axis: 2000-01-01 00:00:00 to 2000-01-30 00:00:00\n", + "Minor axis: A to D" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# let's select on the major_axis\n", + "import datetime\n", + "slicepanel = store.select('appendpanel',\n", + " where = [ dict(field = 'index', op = '>=', value = datetime.datetime(2000,1,9)), dict(field = 'index', op = '<=', value = datetime.datetime(2000,1,25)) ])\n", + "slicepanel" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "pyout", + "prompt_number": 8, + "text": [ + "\n", + "Dimensions: 2 (items) x 17 (major) x 4 (minor)\n", + "Items: Item1 to Item2\n", + "Major axis: 2000-01-09 00:00:00 to 2000-01-25 00:00:00\n", + "Minor axis: A to D" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# here we select on the minor axis\n", + "slicepanel2 = store.select('appendpanel', where = [ dict(field = 'column', value = ['A','B']) ])\n", + "slicepanel2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "pyout", + "prompt_number": 9, + "text": [ + "\n", + "Dimensions: 2 (items) x 30 (major) x 2 (minor)\n", + "Items: Item1 to Item2\n", + "Major axis: 2000-01-01 00:00:00 to 2000-01-30 00:00:00\n", + "Minor axis: A to B" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# delete operations\n", + "store.remove('appendpanel',where = [ dict(field = 'column', value = ['A','B']) ])\n", + "store.select('appendpanel')\n", + " " + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "pyout", + "prompt_number": 10, + "text": [ + "\n", + "Dimensions: 2 (items) x 30 (major) x 2 (minor)\n", + "Items: Item1 to Item2\n", + "Major axis: 2000-01-01 00:00:00 to 2000-01-30 00:00:00\n", + "Minor axis: C to D" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "notes & caveats\n", + " \n", + "seleting on both major & minor axis is possible (extend the where clause) \n", + "selection by items (top level panel dimension) is not possible; you always get all of the items in the returned panel \n", + "in general it is best to store your panel with the most frequently selected dimension in the minor axis and a time/date like dimension in the major axis \n", + "mixed type items are currently not supported (e.g. all of your data must be floats) \n", + "currently the major_axis is NOT indexed by pytables (as there is a bug in the pytables spec for this)\n", + " \n", + "performance is quite good on the sub-selections and tables sizes can be quite large \n", + "in fact you can often append panels objects to create a giant table on disk, then subselect out as needed (e.g. write once - read many)\n", + " \n", + "in general I compress tables after writing them (using blosc compression) - much slower if you compress as you go \n", + " \n", + "If I am deleting a lot of data, I will either rebuild the table (erase and rewrite), \n", + " or use the pytables utilities ptrepack to rewrite the file (and also can change compression methods) \n", + " \n", + "once a table is written, the items are fixed for that table; you can append only items that match exactly those on disk \n", + "(if you want to change this, then rebuild - e.g. erase and write a new table) \n", + " \n", + "duplicate items can be written, but are filtered out in selection (with the last items being selected; thus a table is unique on major, minor pairs)\n", + "\n" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "large_p = pandas.Panel(np.random.randn(2, 1000, 1000), items=['Item1', 'Item2'],\n", + " major_axis=pandas.date_range('1/1/2000', periods=1000), minor_axis = [ 'E%s' % i for i in xrange(1000) ])\n", + "large_p" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "pyout", + "prompt_number": 11, + "text": [ + "\n", + "Dimensions: 2 (items) x 1000 (major) x 1000 (minor)\n", + "Items: Item1 to Item2\n", + "Major axis: 2000-01-01 00:00:00 to 2002-09-26 00:00:00\n", + "Minor axis: E0 to E999" + ] + } + ], + "prompt_number": 11 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "if os.path.exists('large_store.h5'):\n", + " os.remove('large_store.h5')\n", + "large_store = pandas.io.pytables.HDFStore('large_store.h5')" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 12 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "large_store.append('large',large_p)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 13 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# we basically wrote a structure of major_axis x minor_axis rows (with items as a numpy array of x items) (less if nans in the data)\n", + "print large_store.handle.root.large.table" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "/large/table (Table(1000000,)) ''\n" + ] + } + ], + "prompt_number": 17 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "### on a slow machine!\n", + "\n", + "def f():\n", + " return large_store.select('large',where = [ dict(field = 'index', op = '>=', value = datetime.datetime(2002,9,12)) ])\n", + "print f(), \"\\n\" \n", + "\n", + "print \"selection by major_axis\"\n", + "%timeit f()\n", + "\n", + "print \"\\n\"\n", + "def f():\n", + " return large_store.select('large',where = [ dict(field = 'column', value = [ \"E%s\" % i for i in xrange(100) ]) ])\n", + "print f(), \"\\n\"\n", + "\n", + "print \"selection by minor axis\"\n", + "%timeit f()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "Dimensions: 2 (items) x 15 (major) x 1000 (minor)\n", + "Items: Item1 to Item2\n", + "Major axis: 2002-09-12 00:00:00 to 2002-09-26 00:00:00\n", + "Minor axis: E0 to E999 \n", + "\n", + "selection by major_axis\n", + "1 loops, best of 3: 607 ms per loop" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "\n", + "\n", + "\n", + "Dimensions: 2 (items) x 1000 (major) x 100 (minor)\n", + "Items: Item1 to Item2\n", + "Major axis: 2000-01-01 00:00:00 to 2002-09-26 00:00:00\n", + "Minor axis: E0 to E99" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + " \n", + "\n", + "selection by minor axis\n", + "1 loops, best of 3: 1.1 s per loop" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n" + ] + } + ], + "prompt_number": 16 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 15 + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/examples/HDFStore.pdf b/examples/HDFStore.pdf new file mode 100755 index 0000000000000000000000000000000000000000..b4ad497c76e1dd7d92464c225188f32a1daa005e GIT binary patch literal 192579 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 R9$+%5Oju;j9Q{=W{|A>^Y0&@x literal 0 HcmV?d00001