@@ -1603,16 +1603,19 @@ class SparseBlock(Block):
16031603 def __init__ (self , values , placement ,
16041604 ndim = None , fastpath = False ,):
16051605
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+
16061611 # kludgetastic
16071612 if ndim is None :
1608- if len (placement ) != 1 :
1613+ if len (self . mgr_locs ) != 1 :
16091614 ndim = 1
16101615 else :
16111616 ndim = 2
16121617 self .ndim = ndim
16131618
1614- self .mgr_locs = placement
1615-
16161619 if not isinstance (values , SparseArray ):
16171620 raise TypeError ("values must be SparseArray" )
16181621
@@ -2050,26 +2053,44 @@ def __getstate__(self):
20502053 block_values = [b .values for b in self .blocks ]
20512054 block_items = [self .items [b .mgr_locs .indexer ] for b in self .blocks ]
20522055 axes_array = [ax for ax in self .axes ]
2053- return axes_array , block_values , block_items
20542056
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+ }
20592065
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
20642069
2070+ def __setstate__ (self , state ):
2071+ def unpickle_block (values , mgr_locs ):
20652072 # numpy < 1.7 pickle compat
20662073 if values .dtype == 'M8[us]' :
20672074 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 ))
20732094
20742095 self ._post_setstate ()
20752096
0 commit comments