11
11
import itertools
12
12
import warnings
13
13
import os
14
+ import cPickle as pickle
14
15
15
16
import numpy as np
17
+ from tables .exceptions import NoSuchNodeError
18
+
16
19
from pandas import (Series , TimeSeries , DataFrame , Panel , Panel4D , Index ,
17
20
MultiIndex , Int64Index , Timestamp )
18
21
from pandas .sparse .api import SparseSeries , SparseDataFrame , SparsePanel
44
47
from distutils .version import LooseVersion
45
48
46
49
# versioning attribute
47
- _version = '0.15.2 '
50
+ _version = '0.17.0 '
48
51
49
52
# PY3 encoding if we don't specify
50
53
_default_encoding = 'UTF-8'
@@ -1394,7 +1397,7 @@ def __init__(self, values=None, kind=None, typ=None, cname=None,
1394
1397
self .freq = freq
1395
1398
self .tz = tz
1396
1399
self .index_name = index_name
1397
- self .table = None
1400
+ self ._handler = None
1398
1401
self .meta = None
1399
1402
self .metadata = None
1400
1403
@@ -1425,8 +1428,12 @@ def set_pos(self, pos):
1425
1428
self .typ ._v_pos = pos
1426
1429
return self
1427
1430
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
1430
1437
return self
1431
1438
1432
1439
def __unicode__ (self ):
@@ -1463,7 +1470,7 @@ def infer(self, handler):
1463
1470
"""infer this column from the table: create and return a new object"""
1464
1471
table = handler .table
1465
1472
new_self = self .copy ()
1466
- new_self .set_table ( table )
1473
+ new_self .set_handler ( handler )
1467
1474
new_self .get_attr ()
1468
1475
new_self .read_metadata (handler )
1469
1476
return new_self
@@ -1536,7 +1543,7 @@ def maybe_set_size(self, min_itemsize=None, **kwargs):
1536
1543
).StringCol (itemsize = min_itemsize , pos = self .pos )
1537
1544
1538
1545
def validate_and_set (self , handler , append , ** kwargs ):
1539
- self .set_table (handler . table )
1546
+ self .set_handler (handler )
1540
1547
self .validate_col ()
1541
1548
self .validate_attr (append )
1542
1549
self .validate_metadata (handler )
@@ -2060,16 +2067,23 @@ def convert(self, values, nan_rep, encoding):
2060
2067
2061
2068
return self
2062
2069
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
+
2063
2076
def get_attr (self ):
2064
2077
""" 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 )
2066
2079
self .dtype = getattr (self .attrs , self .dtype_attr , None )
2067
2080
self .meta = getattr (self .attrs , self .meta_attr , None )
2068
2081
self .set_kind ()
2069
2082
2083
+
2070
2084
def set_attr (self ):
2071
2085
""" 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 )
2073
2087
setattr (self .attrs , self .meta_attr , self .meta )
2074
2088
if self .dtype is not None :
2075
2089
setattr (self .attrs , self .dtype_attr , self .dtype )
@@ -3026,13 +3040,31 @@ def set_info(self):
3026
3040
""" update our table index info """
3027
3041
self .attrs .info = self .info
3028
3042
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
+
3029
3061
def set_attrs (self ):
3030
3062
""" set our table type & indexables """
3031
3063
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 )
3036
3068
self .attrs .nan_rep = self .nan_rep
3037
3069
self .attrs .encoding = self .encoding
3038
3070
self .attrs .levels = self .levels
@@ -3041,10 +3073,9 @@ def set_attrs(self):
3041
3073
3042
3074
def get_attrs (self ):
3043
3075
""" 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 []
3048
3079
self .info = getattr (
3049
3080
self .attrs , 'info' , None ) or dict ()
3050
3081
self .nan_rep = getattr (self .attrs , 'nan_rep' , None )
@@ -3098,9 +3129,10 @@ def indexables(self):
3098
3129
self ._indexables = []
3099
3130
3100
3131
# index columns
3132
+ index_cols = self ._get_carray_attr ('index_cols' ) or []
3101
3133
self ._indexables .extend ([
3102
3134
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 )
3104
3136
])
3105
3137
3106
3138
# values columns
@@ -3113,9 +3145,10 @@ def f(i, c):
3113
3145
klass = DataIndexableCol
3114
3146
return klass .create_for_block (i = i , name = c , pos = base_pos + i ,
3115
3147
version = self .version )
3116
-
3148
+ values_cols = self . _get_carray_attr ( 'values_cols' ) or []
3117
3149
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
+ ])
3119
3152
3120
3153
return self ._indexables
3121
3154
0 commit comments