@@ -1603,16 +1603,19 @@ class SparseBlock(Block):
1603
1603
def __init__ (self , values , placement ,
1604
1604
ndim = None , fastpath = False ,):
1605
1605
1606
+ # Placement must be converted to BlockPlacement via property setter
1607
+ # before ndim logic, because placement may be a slice which doesn't
1608
+ # have a length.
1609
+ self .mgr_locs = placement
1610
+
1606
1611
# kludgetastic
1607
1612
if ndim is None :
1608
- if len (placement ) != 1 :
1613
+ if len (self . mgr_locs ) != 1 :
1609
1614
ndim = 1
1610
1615
else :
1611
1616
ndim = 2
1612
1617
self .ndim = ndim
1613
1618
1614
- self .mgr_locs = placement
1615
-
1616
1619
if not isinstance (values , SparseArray ):
1617
1620
raise TypeError ("values must be SparseArray" )
1618
1621
@@ -2050,26 +2053,44 @@ def __getstate__(self):
2050
2053
block_values = [b .values for b in self .blocks ]
2051
2054
block_items = [self .items [b .mgr_locs .indexer ] for b in self .blocks ]
2052
2055
axes_array = [ax for ax in self .axes ]
2053
- return axes_array , block_values , block_items
2054
2056
2055
- def __setstate__ (self , state ):
2056
- # discard anything after 3rd, support beta pickling format for a little
2057
- # while longer
2058
- ax_arrays , bvalues , bitems = state [:3 ]
2057
+ extra_state = {
2058
+ '0.14.1' : {
2059
+ 'axes' : axes_array ,
2060
+ 'blocks' : [dict (values = b .values ,
2061
+ mgr_locs = b .mgr_locs .indexer )
2062
+ for b in self .blocks ]
2063
+ }
2064
+ }
2059
2065
2060
- self .axes = [_ensure_index (ax ) for ax in ax_arrays ]
2061
-
2062
- blocks = []
2063
- for values , items in zip (bvalues , bitems ):
2066
+ # First three elements of the state are to maintain forward
2067
+ # compatibility with 0.13.1.
2068
+ return axes_array , block_values , block_items , extra_state
2064
2069
2070
+ def __setstate__ (self , state ):
2071
+ def unpickle_block (values , mgr_locs ):
2065
2072
# numpy < 1.7 pickle compat
2066
2073
if values .dtype == 'M8[us]' :
2067
2074
values = values .astype ('M8[ns]' )
2068
-
2069
- blk = make_block (values ,
2070
- placement = self .axes [0 ].get_indexer (items ))
2071
- blocks .append (blk )
2072
- self .blocks = tuple (blocks )
2075
+ return make_block (values , placement = mgr_locs )
2076
+
2077
+ if (isinstance (state , tuple ) and len (state ) >= 4
2078
+ and '0.14.1' in state [3 ]):
2079
+ state = state [3 ]['0.14.1' ]
2080
+ self .axes = [_ensure_index (ax ) for ax in state ['axes' ]]
2081
+ self .blocks = tuple (
2082
+ unpickle_block (b ['values' ], b ['mgr_locs' ])
2083
+ for b in state ['blocks' ])
2084
+ else :
2085
+ # discard anything after 3rd, support beta pickling format for a
2086
+ # little while longer
2087
+ ax_arrays , bvalues , bitems = state [:3 ]
2088
+
2089
+ self .axes = [_ensure_index (ax ) for ax in ax_arrays ]
2090
+ self .blocks = tuple (
2091
+ unpickle_block (values ,
2092
+ self .axes [0 ].get_indexer (items ))
2093
+ for values , items in zip (bvalues , bitems ))
2073
2094
2074
2095
self ._post_setstate ()
2075
2096
0 commit comments