Skip to content

Commit 53b91b8

Browse files
committed
wide table support
1 parent 5852e72 commit 53b91b8

File tree

1 file changed

+52
-19
lines changed

1 file changed

+52
-19
lines changed

pandas/io/pytables.py

Lines changed: 52 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@
1111
import itertools
1212
import warnings
1313
import os
14+
import cPickle as pickle
1415

1516
import numpy as np
17+
from tables.exceptions import NoSuchNodeError
18+
1619
from pandas import (Series, TimeSeries, DataFrame, Panel, Panel4D, Index,
1720
MultiIndex, Int64Index, Timestamp)
1821
from pandas.sparse.api import SparseSeries, SparseDataFrame, SparsePanel
@@ -44,7 +47,7 @@
4447
from distutils.version import LooseVersion
4548

4649
# versioning attribute
47-
_version = '0.15.2'
50+
_version = '0.17.0'
4851

4952
# PY3 encoding if we don't specify
5053
_default_encoding = 'UTF-8'
@@ -1394,7 +1397,7 @@ def __init__(self, values=None, kind=None, typ=None, cname=None,
13941397
self.freq = freq
13951398
self.tz = tz
13961399
self.index_name = index_name
1397-
self.table = None
1400+
self._handler = None
13981401
self.meta = None
13991402
self.metadata = None
14001403

@@ -1425,8 +1428,12 @@ def set_pos(self, pos):
14251428
self.typ._v_pos = pos
14261429
return self
14271430

1428-
def set_table(self, table):
1429-
self.table = table
1431+
@property
1432+
def table(self):
1433+
return self._handler.table
1434+
1435+
def set_handler(self, handler):
1436+
self._handler = handler
14301437
return self
14311438

14321439
def __unicode__(self):
@@ -1463,7 +1470,7 @@ def infer(self, handler):
14631470
"""infer this column from the table: create and return a new object"""
14641471
table = handler.table
14651472
new_self = self.copy()
1466-
new_self.set_table(table)
1473+
new_self.set_handler(handler)
14671474
new_self.get_attr()
14681475
new_self.read_metadata(handler)
14691476
return new_self
@@ -1536,7 +1543,7 @@ def maybe_set_size(self, min_itemsize=None, **kwargs):
15361543
).StringCol(itemsize=min_itemsize, pos=self.pos)
15371544

15381545
def validate_and_set(self, handler, append, **kwargs):
1539-
self.set_table(handler.table)
1546+
self.set_handler(handler)
15401547
self.validate_col()
15411548
self.validate_attr(append)
15421549
self.validate_metadata(handler)
@@ -2060,16 +2067,23 @@ def convert(self, values, nan_rep, encoding):
20602067

20612068
return self
20622069

2070+
def _set_carray_attr(self, key, val):
2071+
self._handler._set_carray_attr(key, val)
2072+
2073+
def _get_carray_attr(self, key):
2074+
return self._handler._get_carray_attr(key)
2075+
20632076
def get_attr(self):
20642077
""" get the data for this colummn """
2065-
self.values = getattr(self.attrs, self.kind_attr, None)
2078+
self.values = self._get_carray_attr(self.kind_attr)
20662079
self.dtype = getattr(self.attrs, self.dtype_attr, None)
20672080
self.meta = getattr(self.attrs, self.meta_attr, None)
20682081
self.set_kind()
20692082

2083+
20702084
def set_attr(self):
20712085
""" set the data for this colummn """
2072-
setattr(self.attrs, self.kind_attr, self.values)
2086+
self._set_carray_attr(self.kind_attr, self.values)
20732087
setattr(self.attrs, self.meta_attr, self.meta)
20742088
if self.dtype is not None:
20752089
setattr(self.attrs, self.dtype_attr, self.dtype)
@@ -3026,13 +3040,31 @@ def set_info(self):
30263040
""" update our table index info """
30273041
self.attrs.info = self.info
30283042

3043+
def _get_carray_attr(self, name):
3044+
if 'attrs' in self.group._v_groups:
3045+
attr_group = self.group._v_groups['attrs']
3046+
try:
3047+
data = self._handle.get_node(attr_group, name)[:].tostring()
3048+
data = pickle.loads(data)
3049+
return data
3050+
except NoSuchNodeError:
3051+
return None
3052+
return getattr(self.attrs, name, None)
3053+
3054+
def _set_carray_attr(self, name, val):
3055+
if 'attrs' not in self.group._v_groups:
3056+
self._handle.create_group(self.group, 'attrs')
3057+
attr_group = self.group._v_groups['attrs']
3058+
data = np.fromstring(pickle.dumps(val), dtype='S1')
3059+
self._handle.create_carray(attr_group, name, obj=data)
3060+
30293061
def set_attrs(self):
30303062
""" set our table type & indexables """
30313063
self.attrs.table_type = str(self.table_type)
3032-
self.attrs.index_cols = self.index_cols()
3033-
self.attrs.values_cols = self.values_cols()
3034-
self.attrs.non_index_axes = self.non_index_axes
3035-
self.attrs.data_columns = self.data_columns
3064+
self._set_carray_attr('index_cols', self.index_cols())
3065+
self._set_carray_attr('values_cols', self.values_cols())
3066+
self._set_carray_attr('non_index_axes', self.non_index_axes)
3067+
self._set_carray_attr('data_columns', self.data_columns)
30363068
self.attrs.nan_rep = self.nan_rep
30373069
self.attrs.encoding = self.encoding
30383070
self.attrs.levels = self.levels
@@ -3041,10 +3073,9 @@ def set_attrs(self):
30413073

30423074
def get_attrs(self):
30433075
""" retrieve our attributes """
3044-
self.non_index_axes = getattr(
3045-
self.attrs, 'non_index_axes', None) or []
3046-
self.data_columns = getattr(
3047-
self.attrs, 'data_columns', None) or []
3076+
3077+
self.non_index_axes = self._get_carray_attr('non_index_axes') or []
3078+
self.data_columns = self._get_carray_attr('data_columns') or []
30483079
self.info = getattr(
30493080
self.attrs, 'info', None) or dict()
30503081
self.nan_rep = getattr(self.attrs, 'nan_rep', None)
@@ -3098,9 +3129,10 @@ def indexables(self):
30983129
self._indexables = []
30993130

31003131
# index columns
3132+
index_cols = self._get_carray_attr('index_cols') or []
31013133
self._indexables.extend([
31023134
IndexCol(name=name, axis=axis, pos=i)
3103-
for i, (axis, name) in enumerate(self.attrs.index_cols)
3135+
for i, (axis, name) in enumerate(index_cols)
31043136
])
31053137

31063138
# values columns
@@ -3113,9 +3145,10 @@ def f(i, c):
31133145
klass = DataIndexableCol
31143146
return klass.create_for_block(i=i, name=c, pos=base_pos + i,
31153147
version=self.version)
3116-
3148+
values_cols = self._get_carray_attr('values_cols') or []
31173149
self._indexables.extend(
3118-
[f(i, c) for i, c in enumerate(self.attrs.values_cols)])
3150+
[f(i, c) for i, c in enumerate(values_cols)
3151+
])
31193152

31203153
return self._indexables
31213154

0 commit comments

Comments
 (0)