
    3j";                        d dl Z d dlZd dlmZ d dlZd dlZddlm	Z	m
Z
 ddlmZmZmZ ddlmZmZ ddlmZmZ dd	lmZ dd
lmZ ddgZd Zd Zd Zd Z G d d      Zd Z G d de      Z  G d de      Z! G d de      Z" G d de"      Z# G d de"      Z$ G d de      Z% G d  d!e      Z& G d" d#e      Z'd$ Zd% Zy)&    N)StringIO   )decodeencode)BaseHandlerregister
unregister)REVERSE_TYPE_MAPTYPE_MAP)	b64decode	b64encode   )register_handlers)unregister_handlersr   r   c                 n    t        | t        j                        r| j                         S t	        | fi |S N)
isinstancenpgenericitemr   )objkwargss     B/DATA/.local/lib/python3.12/site-packages/jsonpickle/ext/pandas.py	pd_encoder      s,    #rzz"xxz#       c                     t        | fi |S r   )r   )sr   s     r   	pd_decoder      s    !vr   c                     | sg S g }| d   }d}| dd D ]$  }||k(  r|dz  }|j                  ||g       |}d}& |j                  ||g       |S )z
    Encodes a list of type codes using Run-Length Encoding (RLE). This allows for object columns in dataframes to contain items of different types without massively bloating the encoded representation.
    r   r   N)append)
types_listencodedcurrent_typecounttyps        r   
rle_encoder&      ss     	Ga=LE!"~,QJENNL%01LE  NNL%()Nr   c                 H    g }| D ]  \  }}|j                  |g|z          |S )z\
    Decodes a Run-Length Encoded (RLE) list back into the original list of type codes.
    )extend)encoded_listdecodedr%   r$   s       r   
rle_decoder+   4   s.     G"
Uuu}% #Nr   c                   &    e Zd ZdefdZddZd Zy)PandasProcessori  c                      || _         || _        y)a  
        :param size_threshold: nonnegative int or None
            valid values for 'size_threshold' are all nonnegative
            integers and None.  If size_threshold is None,
            dataframes are always stored as csv strings
        :param compression: a compression module or None
            valid values for 'compression' are {zlib, bz2, None}
            if compression is None, no compression is applied
        N)size_thresholdcompression)selfr/   r0   s      r   __init__zPandasProcessor.__init__?   s     -&r   Nc                    | j                   ft        |      | j                   kD  rN| j                  r.| j                  j                  |j	                               }d|d<   t        |      |d<   d|d<   n
||d<   d|d<   ||d<   |S )NTcompvaluesFtxtmeta)r/   lenr0   compressr   r   )r1   bufdatar7   s       r   flatten_pandaszPandasProcessor.flatten_pandasL   s    *s3x$:M:M/M&&//

=#V&s^DNDK DNDKVr   c                     |j                  dd      r|d   }nIt        |d         }|j                  dd      r)| j                  j                  |      j	                         }|j                  di       }||fS )Nr6   Tr5   r4   Fr7   )getr   r0   
decompressr   )r1   r;   r:   r7   s       r   restore_pandaszPandasProcessor.restore_pandasZ   sn    88E4 x.CDN+Cxx&&&11#6==?xx#T{r   r   )__name__
__module____qualname__zlibr2   r<   r@    r   r   r-   r-   >   s    &)t '	r   r-   c                    |j                  | j                  di       d      }| j                  ddg      }g }i }g }i }i }|j                         D ]u  \  }	}
|
j                  d      r|j	                  |	       |
||	<   .|
j                  d      r
t
        ||	<   I|
j                  d      r|j	                  |	       d	||	<   q|
||	<   w t        ||||
      ||fS )NdtypesFresetheaderr   datetimecomplex	timedeltaobject)dtyperJ   parse_dates
converters)restorer>   items
startswithr    rL   dict)r7   contextmeta_dtypesrJ   rP   rQ   
timedeltasparse_datetime_v2rO   kvs              r   make_read_csv_paramsr\   f   s    //$((8R"8/FK XXh$FKJJE!!#1<<
#q!#$a \\)$#JqM\\+&a E!HE!H $ 	KJ	
 	 r   c                   ,    e Zd Z e       Zd Zd Zd Zy)PandasDfHandlerc                    t               }t        |j                  t        j                        r;|j                  D cg c]  }t        |       }}|j                  j                  }d}n2|j                  j                         }|j                  j                  }d}t        |j                  t        j                        rE|j                  j                  D cg c]  }t        |       }	}|j                  j                  }
d}n2|j                  j                         }	|j                  j                  }
d}i }g }|j                  D ]  }||   }|j                  j                  }|dk(  r|j                  d       j                         r7|j                  d       j                         }|||<   |j                  d       z|j                         ||<   |j                  t        j                   |d             |j                         ||<   |j                  t        j                   |d              t#        |	d      }t%        |      }|||
t#        |d      |||d}t#        |d      }|j'                  |||      }|S c c}w c c}w )	NTFrN   c                 `    t        | t        t        t        t        t
        j                  f      S r   )r   listrU   settupler   ndarrayxs    r   <lambda>z)PandasDfHandler.flatten.<locals>.<lambda>   s    jT4eRZZ,PQr   c                     t        |       S r   )r   re   s    r   rg   z)PandasDfHandler.flatten.<locals>.<lambda>   s    r   py/jpkeys)
dtypes_rleindexindex_namescolumnscolumn_namesis_multiindexis_multicolumns)r-   r   ro   pd
MultiIndexrc   namestolistnamerm   r5   rO   applyanyr    r   r>   r   r&   r<   )r1   r   r;   ppcolro   rp   rr   idxindex_valuesrn   rq   data_columns
type_codescol_data
dtype_nameserialized_valuesindex_encoded	rle_typesr7   data_encodeds                        r   flattenzPandasDfHandler.flatten   s0   ckk2==1-0[[9[cuSz[G9;;,,L"Okk((*G;;++L#O cii/25))2B2BC2B3E#J2BLC))//K M99++-L))..K!M
;;C3xH!,,JX%>>Q#% )17J(K(R(R(T%(9L%%%g. )1(9L%%%hll:x&HI %-OO$5S!!!(,,z8"DE) . |$7z*	 $"&gD1(*.
 l6   tT:} : Ds   JJc                    | j                   j                  |      \  }}	 t        |d      }	 |d   }t        |      }t        |d   d      }|j                  d	d
      r1t        j                  j                  ||j                  d            }n|}i }	i }
t        ||      D ]M  \  }}||   }|dk(  r|D cg c]  }t        |       }}||	|<   .||	|<   t        j                  |d      }||
|<   O t        j                  |	      }||_        |j                   D ]A  }|
j                  |d      }	 t#        j$                  |      }||   j'                  |      ||<   C t        |d   d      }|j                  dd
      r1t        j                  j                  ||j                  d            }n&t        j(                  ||j                  d            }||_        d|v rT|j                  d	d
      r"|j                  d      |j                   _        |S |j                  d      |j                   _        |S # t        $ r+ t	        j
                  dd       | j                  |      cY S w xY w# t        $ r+ t	        j
                  dd       | j                  |      cY S w xY wc c}w # t        $ r d| d}t	        j
                  |       Y w xY w)NTrj   zjsonpickle versions at and above v3.4 have a different encoding scheme for pandas dataframes. If you're not decoding an object encoded in pre-v3.4 jsonpickle, please file a bug report on our GitHub!   )
stacklevelrl   zjsonpickle versions at and above v3.4 have a different encoding scheme for pandas dataframes. Please update your jsonpickle and re-encode these objects!ro   rr   Frp   ru   ri   rN   z9jsonpickle was unable to properly deserialize the column zL into its inferred dtype. Please file a bugreport on the jsonpickle GitHub! rm   rq   rn   rw   )rz   r@   r   	Exceptionwarningswarnrestore_v3_3KeyErrorr+   r>   rs   rt   from_tupleszipr
   	DataFramero   r   rO   astypeIndexrm   ru   rw   )r1   r   r   r7   r~   r   r   columns_decodedro   df_datarG   r{   	type_coder   r   
col_values	dtype_strdfrO   msgr}   rm   s                         r   rR   zPandasDfHandler.restore   s   !WW33C8d	*!,T:L	*\*I  	*
 !it<88%u-mm//txx'? 0 G &G !':6NC#C(HG#7?@xtfTlx
@)',00HE	's 7 \\'"
 ::C

31I	#+S'../3	  d7m$788OU+MM--DHH]$; . E HH\0GHE T!xx)51#'88N#;

  	 #'((>":

	m  
	*MM@  $$S))
	*  		*MMR  $$S))		*8 A$  #""% 'IJ 
 c"#s:   H9 I0 7J'1,J,91I-,I-01J$#J$,$KKc                    | j                   j                  |      \  }}t        || j                        \  }}}|j	                  dd       }|d   j                         rt        j                  t        |      fi |nt        j                         }|D ]  }	t        j                  ||	         ||	<    |j                  |      }|j                  t        |d         d       |r||j                  _        |S )Ncolumn_level_namesr5   rm   T)inplace)rz   r@   r\   rV   r>   striprs   read_csvr   r   to_timedeltar   	set_indexr   ro   ru   )
r1   r;   csvr7   paramsrX   rY   r   r   r{   s
             r   r   zPandasDfHandler.restore_v3_3)  s    GG**40	T0DT4<<0X-
- "XX&:DA H~##% KK00 	
 Coobg.BsG YY()
VDM*D91BJJ	r   N)rA   rB   rC   r-   rz   r   rR   r   rE   r   r   r^   r^      s    		BBHZxr   r^   c                   &    e Zd Z e       Zd Zd Zy)PandasSeriesHandlerc                     |j                   |d<   | j                  j                  |j                  d      |d<   | j                  j                  |j                  d      |d<   |S )z/Flatten the index and values for reconstructionrw   FrH   rm   r5   )rw   rV   r   rm   r5   )r1   r   r;   s      r   r   zPandasSeriesHandler.flattenB  sV    xxV,,SYYe,DW--cjj-FXr   c                     |d   }| j                   j                  |d   d      }| j                   j                  |d   d      }t        j                  |||      S )zRestore the flattened datarw   rm   FrH   r5   )rm   rw   )rV   rR   rs   Series)r1   r;   rw   rm   r5   s        r   rR   zPandasSeriesHandler.restoreJ  sX    F|$$T']%$@%%d8nE%Byyu488r   NrA   rB   rC   r-   rz   r   rR   rE   r   r   r   r   ?  s    		B9r   r   c                   D    e Zd Z e       Zej                  Zd Zd Z	d Z
y)PandasIndexHandlerc                     d|j                   iS )Nrw   r   r1   r   s     r   name_bundlerzPandasIndexHandler.name_bundlerV  s    !!r   c                     | j                  |      }t        ddt        |j                        i|}t	        |j                               }| j                  j                  |||      }|S )NrO   rE   )r   rU   strrO   r   rv   rz   r<   )r1   r   r;   name_bundler7   r:   s         r   r   zPandasIndexHandler.flattenY  sY    '',8#cii.8K8SZZ\"ww%%c46r   c                    | j                   j                  |      \  }}|j                  dd       }|j                         D ci c]  \  }}|dv rd |t        nd |       }}} | j
                  t        |      fd|i|}|S c c}}w )NrO   >   rw   ru   rw   c                     | S r   rE   re   s    r   rg   z,PandasIndexHandler.restore.<locals>.<lambda>d  s    1r   )rz   r@   r>   rS   rc   index_constructorr   )	r1   r;   r:   r7   rO   rZ   r[   r   r|   s	            r   rR   zPandasIndexHandler.restore`  s    GG**40	T$' 


$1%% <amUa@@$ 	 

 %d$$VC[MMM

s    BN)rA   rB   rC   r-   rz   rs   r   r   r   r   rR   rE   r   r   r   r   R  s#    		B"	r   r   c                   $    e Zd Zej                  Zy)PandasPeriodIndexHandlerN)rA   rB   rC   rs   PeriodIndexr   rE   r   r   r   r   l  s    r   r   c                       e Zd Zd Zy)PandasMultiIndexHandlerc                     d|j                   iS )Nru   r   r   s     r   r   z$PandasMultiIndexHandler.name_bundlerq  s    ##r   N)rA   rB   rC   r   rE   r   r   r   r   p  s    $r   r   c                   &    e Zd Z e       Zd Zd Zy)PandasTimestampHandlerc                 h    d|j                         i}d}| j                  j                  |||      }|S )N	isoformat )r   rz   r<   r1   r   r;   r7   r:   s        r   r   zPandasTimestampHandler.flattenx  s4    S]]_-ww%%c46r   c                 v    | j                   j                  |      \  }}|d   }t        j                  |      }|S )Nr   )rz   r@   rs   	Timestamp)r1   r;   _r7   r   r   s         r   rR   zPandasTimestampHandler.restore~  s7    ''((.4%	ll9%
r   Nr   rE   r   r   r   r   u  s    		Br   r   c                   &    e Zd Z e       Zd Zd Zy)PandasPeriodHandlerc                     t        |j                        |j                  d}d}| j                  j	                  |||      }|S )N)
start_timefreqstrr   )r   r   r   rz   r<   r   s        r   r   zPandasPeriodHandler.flatten  s@     0{{
 ww%%c46r   c                     | j                   j                  |      \  }}t        |d         }|d   }t        j                  ||      }|S )Nr   r   )rz   r@   r   rs   Period)r1   r;   r   r7   r   r   r   s          r   rR   zPandasPeriodHandler.restore  sG    ''((.4D./
y/ii
G,
r   Nr   rE   r   r   r   r     s    		Br   r   c                   &    e Zd Z e       Zd Zd Zy)PandasIntervalHandlerc                     t        |j                        t        |j                        |j                  d}d}| j                  j                  |||      }|S )N)leftrightclosedr   )r   r   r   r   rz   r<   r   s        r   r   zPandasIntervalHandler.flatten  sL    388$CII&jj

 ww%%c46r   c                     | j                   j                  |      \  }}t        |d         }t        |d         }t        |d         }t	        j
                  |||      }|S )Nr   r   r   )r   )rz   r@   r   r   rs   Interval)r1   r;   r   r7   r   r   r   r   s           r   rR   zPandasIntervalHandler.restore  s[    ''((.4d6l#tG}%T(^$kk$f5
r   Nr   rE   r   r   r   r     s    		Br   r   c                     t                t        t        j                  t        d       t        t        j
                  t        d       t        t        j                  t        d       t        t        j                  t        d       t        t        j                  t        d       t        t        j                  t        d       t        t        j                  t         d       t        t        j"                  t$        d       y )NT)base)register_numpy_handlersr   rs   r   r^   r   r   r   r   r   r   rt   r   r   r   r   r   r   r   rE   r   r   r   r     s    R\\?6RYY+$7RXX)5R^^5DAR]]3$?R\\1=RYY+$7R[[/d;r   c                     t                t        t        j                         t        t        j                         t        t        j
                         t        t        j                         t        t        j                         t        t        j                         t        t        j                         t        t        j                         y r   )unregister_numpy_handlersr	   rs   r   r   r   r   rt   r   r   r   rE   r   r   r   r     sh    r||ryyrxxr~~r}}r||ryyr{{r   )(r   rD   ior   numpyr   pandasrs   r   r   r   handlersr   r   r	   tags_pdr
   r   utilr   r   r   r   r   r   __all__r   r   r&   r+   r-   r\   r^   r   r   r   r   r   r   r   rE   r   r   <module>r      s          8 8 0 ' ? C 5
6!.% %P@vk vr9+ 9& 4'1 '$0 $
[  + (K ,	<	r   