|
1 | 1 | """ Panel4D: a 4-d dict like collection of panels """
|
2 | 2 |
|
3 | 3 | from pandas.core.panel import Panel
|
| 4 | +from pandas.core import panelnd |
4 | 5 | import pandas.lib as lib
|
5 | 6 |
|
| 7 | +Panel4D = panelnd.create_nd_panel_factory( |
| 8 | + klass_name = 'Panel4D', |
| 9 | + axis_orders = [ 'labels','items','major_axis','minor_axis'], |
| 10 | + axis_slices = { 'labels' : 'labels', 'items' : 'items', 'major_axis' : 'major_axis', 'minor_axis' : 'minor_axis' }, |
| 11 | + slicer = Panel, |
| 12 | + axis_aliases = { 'major' : 'major_axis', 'minor' : 'minor_axis' }, |
| 13 | + stat_axis = 2) |
| 14 | + |
| 15 | + |
| 16 | + |
| 17 | +def panel4d_init(self, data=None, labels=None, items=None, major_axis=None, minor_axis=None, copy=False, dtype=None): |
| 18 | + """ |
| 19 | + Represents a 4 dimensonal structured |
| 20 | + |
| 21 | + Parameters |
| 22 | + ---------- |
| 23 | + data : ndarray (labels x items x major x minor), or dict of Panels |
| 24 | + |
| 25 | + labels : Index or array-like : axis=0 |
| 26 | + items : Index or array-like : axis=1 |
| 27 | + major_axis : Index or array-like: axis=2 |
| 28 | + minor_axis : Index or array-like: axis=3 |
| 29 | + |
| 30 | + dtype : dtype, default None |
| 31 | + Data type to force, otherwise infer |
| 32 | + copy : boolean, default False |
| 33 | + Copy data from inputs. Only affects DataFrame / 2d ndarray input |
| 34 | + """ |
| 35 | + self._init_data( data=data, labels=labels, items=items, major_axis=major_axis, minor_axis=minor_axis, |
| 36 | + copy=copy, dtype=dtype) |
| 37 | +Panel4D.__init__ = panel4d_init |
6 | 38 |
|
7 |
| -class Panel4D(Panel): |
8 |
| - _AXIS_ORDERS = ['labels','items','major_axis','minor_axis'] |
9 |
| - _AXIS_NUMBERS = dict([ (a,i) for i, a in enumerate(_AXIS_ORDERS) ]) |
10 |
| - _AXIS_ALIASES = { |
11 |
| - 'major' : 'major_axis', |
12 |
| - 'minor' : 'minor_axis' |
13 |
| - } |
14 |
| - _AXIS_NAMES = dict([ (i,a) for i, a in enumerate(_AXIS_ORDERS) ]) |
15 |
| - _AXIS_SLICEMAP = { |
16 |
| - 'items' : 'items', |
17 |
| - 'major_axis' : 'major_axis', |
18 |
| - 'minor_axis' : 'minor_axis' |
19 |
| - } |
20 |
| - _AXIS_LEN = len(_AXIS_ORDERS) |
21 |
| - |
22 |
| - # major |
23 |
| - _default_stat_axis = 2 |
24 |
| - |
25 |
| - # info axis |
26 |
| - _het_axis = 0 |
27 |
| - _info_axis = _AXIS_ORDERS[_het_axis] |
28 |
| - |
29 |
| - labels = lib.AxisProperty(0) |
30 |
| - items = lib.AxisProperty(1) |
31 |
| - major_axis = lib.AxisProperty(2) |
32 |
| - minor_axis = lib.AxisProperty(3) |
33 |
| - |
34 |
| - _constructor_sliced = Panel |
35 |
| - |
36 |
| - def __init__(self, data=None, labels=None, items=None, major_axis=None, minor_axis=None, copy=False, dtype=None): |
37 |
| - """ |
38 |
| - Represents a 4 dimensonal structured |
39 |
| -
|
40 |
| - Parameters |
41 |
| - ---------- |
42 |
| - data : ndarray (labels x items x major x minor), or dict of Panels |
43 |
| -
|
44 |
| - labels : Index or array-like : axis=0 |
45 |
| - items : Index or array-like : axis=1 |
46 |
| - major_axis : Index or array-like: axis=2 |
47 |
| - minor_axis : Index or array-like: axis=3 |
48 |
| -
|
49 |
| - dtype : dtype, default None |
50 |
| - Data type to force, otherwise infer |
51 |
| - copy : boolean, default False |
52 |
| - Copy data from inputs. Only affects DataFrame / 2d ndarray input |
53 |
| - """ |
54 |
| - self._init_data( data=data, labels=labels, items=items, major_axis=major_axis, minor_axis=minor_axis, |
55 |
| - copy=copy, dtype=dtype) |
56 |
| - |
57 |
| - def _get_plane_axes(self, axis): |
58 |
| - axis = self._get_axis_name(axis) |
59 |
| - |
60 |
| - if axis == 'major_axis': |
61 |
| - items = self.labels |
62 |
| - major = self.items |
63 |
| - minor = self.minor_axis |
64 |
| - elif axis == 'minor_axis': |
65 |
| - items = self.labels |
66 |
| - major = self.items |
67 |
| - minor = self.major_axis |
68 |
| - elif axis == 'items': |
69 |
| - items = self.labels |
70 |
| - major = self.major_axis |
71 |
| - minor = self.minor_axis |
72 |
| - elif axis == 'labels': |
73 |
| - items = self.items |
74 |
| - major = self.major_axis |
75 |
| - minor = self.minor_axis |
76 |
| - |
77 |
| - return items, major, minor |
78 |
| - |
79 |
| - def _combine(self, other, func, axis=0): |
80 |
| - if isinstance(other, Panel4D): |
81 |
| - return self._combine_panel4d(other, func) |
82 |
| - return super(Panel4D, self)._combine(other, func, axis=axis) |
83 |
| - |
84 |
| - def _combine_panel4d(self, other, func): |
85 |
| - labels = self.labels + other.labels |
86 |
| - items = self.items + other.items |
87 |
| - major = self.major_axis + other.major_axis |
88 |
| - minor = self.minor_axis + other.minor_axis |
89 |
| - |
90 |
| - # could check that everything's the same size, but forget it |
91 |
| - this = self.reindex(labels=labels, items=items, major=major, minor=minor) |
92 |
| - other = other.reindex(labels=labels, items=items, major=major, minor=minor) |
93 |
| - |
94 |
| - result_values = func(this.values, other.values) |
95 |
| - |
96 |
| - return self._constructor(result_values, labels, items, major, minor) |
97 |
| - |
98 |
| - def join(self, other, how='left', lsuffix='', rsuffix=''): |
99 |
| - if isinstance(other, Panel4D): |
100 |
| - join_major, join_minor = self._get_join_index(other, how) |
101 |
| - this = self.reindex(major=join_major, minor=join_minor) |
102 |
| - other = other.reindex(major=join_major, minor=join_minor) |
103 |
| - merged_data = this._data.merge(other._data, lsuffix, rsuffix) |
104 |
| - return self._constructor(merged_data) |
105 |
| - return super(Panel4D, self).join(other=other,how=how,lsuffix=lsuffix,rsuffix=rsuffix) |
106 |
| - |
107 |
| - ### remove operations #### |
108 |
| - def to_frame(self, *args, **kwargs): |
109 |
| - raise NotImplementedError |
110 |
| - def to_excel(self, *args, **kwargs): |
111 |
| - raise NotImplementedError |
112 | 39 |
|
0 commit comments