
    I j                       S SK Jr  S SKrS SKJrJrJr  S SKrS SKr	S SK
Jr  S SKJs  Jr  S SKJrJr  S SKJr  S SKJr  S SKJrJr  S S	KJrJrJrJr  S S
KJ r   S SK!J"r"J#r#  S SK$J%s  J&r'  S SK$J(r(J)r)  S SK*J+r+  S SK,J-r-  S SK.J/r/  S SK0J1r1  S SK2J3r3J4r4J5r5  S SK6J7r7  S SK8J9r9  S SK:J;r;J<r<J=r=J>r>J?r?  \(       a  S SK@JArAJBrBJCrC  S SKDJErE  S SKFJGrG   " S S5      rH S'   S(S jjrI\S)S*S jj5       rJ\ S)     S+S jj5       rJ S'     S+S jjrJ S'     S,S jjrK      S-S jrL S.       S/S  jjrMS0S1S! jjrNS2S" jrO S.         S3S# jjrP        S4S$ jrQS5S% jrR          S6S& jrSg)7    )annotationsN)TYPE_CHECKINGcastoverload)
get_option)Pandas4WarningPerformanceWarning)cache_readonly)find_stack_level)find_common_typemaybe_promote)ensure_platform_intis_1d_only_ea_dtype
is_integerneeds_i8_conversion)ExtensionDtype)isnanotna)	factorizeunique)NDArrayBackedExtensionArray)factorize_from_iterable)ensure_wrapped_if_datetimelike)	DataFrame)Index
MultiIndexdefault_index)concat)Series)compress_group_indexdecons_obs_group_idsget_compressed_idsget_group_indexget_group_index_sorter)	ArrayLikeLevelnpt)ExtensionArray)
FrozenListc                      \ rS rSrSr S       SS jjr\  SS j5       r\SS j5       rSS jr	SS jr
\SS j5       r\SS	 j5       rSS
 jrSS jrSS jr\SS j5       r\SS j5       rSrg)
_UnstackerJ   aX  
Helper class to unstack data / pivot with multi-level index

Parameters
----------
index : MultiIndex
level : int or str, default last level
    Level to "unstack". Accepts a name for the level.
fill_value : scalar, optional
    Default value to fill in missing values if subgroups do not have the
    same set of labels. By default, missing values will be replaced with
    the default fill value for that data type, NaN for float, NaT for
    datetimelike, etc. For integer types, by default data will converted to
    float and missing values will be set to NaN.
constructor : object
    Pandas ``DataFrame`` or subclass used to create unstacked
    response.  If None, DataFrame will be used.

Examples
--------
>>> index = pd.MultiIndex.from_tuples(
...     [("one", "a"), ("one", "b"), ("two", "a"), ("two", "b")]
... )
>>> s = pd.Series(np.arange(1, 5, dtype=np.int64), index=index)
>>> s
one  a    1
     b    2
two  a    3
     b    4
dtype: int64

>>> s.unstack(level=-1)
     a  b
one  1  2
two  3  4

>>> s.unstack(level=0)
   one  two
a    1    3
b    2    4

Returns
-------
unstacked : DataFrame
c                   X0l         X@l        UR                  5       U l        U R                  R	                  U5      U l        SU R                  R                  U R
                     ;   U l        U R                  =(       a    U R                  nU(       a  SOSU l        [        U R                  R                  5      U l        [        U R                  R                  5      U l        U R                  R                  U R
                  5      U l        U R                  R                  U R
                  5      U l        UR                  U R
                     U l        SU l        U R                  (       d  ['        U R                  R                  U R
                     5      nU R                  (       a(  US:H  nXg)    n[(        R*                  " U5      S   U l        U R                   R-                  U5      U l        U R"                  R-                  U5      U l        [/        S5      (       a  [1        S U R                   5       5      nU R                   R2                  n	X-  n
U
[(        R4                  " [(        R6                  5      R0                  :  a&  [8        R:                  " SU
 S3[<        [?        5       S9  U RA                  5         g )	N   r   performance_warningsc              3  8   #    U  H  oR                   v   M     g 7fN)size).0index_levels     l/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/pandas/core/reshape/reshape.py	<genexpr>&_Unstacker.__init__.<locals>.<genexpr>   s     U?T++?T   z%The following operation may generate z& cells in the resulting pandas object.
stacklevel)!constructorsortremove_unused_levelsindex_get_level_numberlevelcodeshas_nanliftlistlevelsnew_index_levelsnamesnew_index_namespopremoved_nameremoved_levelremoved_level_fullunique_nan_indexr   npflatnonzerotaker   maxr3   iinfoint32warningswarnr	   r   _make_selectors)selfr?   rA   r<   r=   should_liftunique_codesnan_masknum_rowsnum_columns	num_cellss              r6   __init___Unstacker.__init__y   s    '	//1
ZZ11%8
 TZZ--djj99ll0tyy$A!	 !%TZZ%6%6 7#DJJ$4$45 0044TZZ@!2266tzzB"',,tzz":%'yy'-djj.>.>tzz.J'KL||'2-+I6(*x(@(C%!%!3!3!8!8!FD&*&=&=&B&B<&PD#,--
 Ut?T?TUUH,,11K !.I288BHH-111;I; G6 7&/1	 	    c                   U R                   n[        U R                  R                  5      nU R                  (       d  U Vs/ s H  n[        U5      S   PM     nn[        U R                  R                  5      nUS U X!S-   S  -   X!   /-   n[        S US U XAS-   S  -   XA   /-    5       5      n[        XV5      u  px[        U5      n	[        Xy5      n
X4$ s  snf )Nr   r/   c              3  8   #    U  H  n[        U5      v   M     g 7fr2   lenr4   xs     r6   r7   2_Unstacker._indexer_and_to_sort.<locals>.<genexpr>   s     K&Jc!ff&Jr9   )rA   rE   r?   rB   r=   r   rF   tupler"   re   r$   )rX   vrB   codelevsto_sortsizes
comp_indexobs_idsngroupsindexers              r6   _indexer_and_to_sort_Unstacker._indexer_and_to_sort   s     JJTZZ%%&yy49:EDYt_Q'EE:DJJ%%&)eEGn,z9Kd2Ah!eg&>$'&JKK0@
g,(= ;s   Cc                    U R                   u  pU R                  (       a!  U Vs/ s H  o3R                  U5      PM     sn$ U$ s  snf r2   )rs   r=   rQ   )rX   rr   rm   lines       r6   sorted_labels_Unstacker.sorted_labels   s=    44993:;74IIg&7;; <s   Ac                L    U R                   u  p#[        R                  " XSS9nU$ )Nr   )axis)rs   algostake_nd)rX   valuesrr   _sorted_valuess        r6   _make_sorted_values_Unstacker._make_sorted_values   s%    ..
fA>ra   c                >   U R                   nU R                  S S n[        S U 5       5      n[        X#5      u  pE[	        U5      n[        U5      nU R                  R                  U R                     U R                  -   nXg4U l
        U R                  S   Xt-  -   U R                  -   n[        R                  " [        R                  " U R                  5      [        S9n	U	R!                  US5        U	R#                  5       [	        U R                  5      :  a  [%        S5      eX@l        Xl        U R*                  (       a+  UR-                  [        R.                  " U5      5      U l        g [        R*                  " [        R2                  " USS9S   5      U l        g )Nr.   c              3  8   #    U  H  n[        U5      v   M     g 7fr2   rd   rf   s     r6   r7   -_Unstacker._make_selectors.<locals>.<genexpr>   s     7JqCFFJr9   dtypeTz0Index contains duplicate entries, cannot reshape)return_indexr/   )rG   rw   ri   r"   re   r   r?   levshaperA   rC   
full_shaperD   rO   zerosprodboolputsum
ValueErrorgroup_indexmaskr=   searchsortedarange
compressorr   )
rX   
new_levelsremaining_labelslevel_sizesro   rp   rq   strideselectorr   s
             r6   rW   _Unstacker._make_selectors   s8   **
  --cr27J7701AO
g,(4
$$TZZ04<<?!/%%b)F,??$))Kxx0=4 88:DJJ'OPP%	99(55bii6HIDO ggbii
&Nq&QRDOra   c                H    [        U R                  R                  5       5      $ r2   )r   r   all)rX   s    r6   mask_all_Unstacker.mask_all   s    DIIMMO$$ra   c                    [         R                  " [        U R                  5      [         R                  S9nU R                  USS9u  p#X#R                  S5      4$ )Nr   r.   
fill_valuer   )rO   r   re   r?   intpget_new_valuesany)rX   	dummy_arr
new_valuesr   s       r6   arange_result_Unstacker.arange_result   sI     IIc$**oRWW=	..yR.H
88A;&&ra   c                   UR                   nUR                  S:X  a  US S 2[        R                  4   nUc  UR                  S   S:w  a  [        S5      eU R                  XC5      u  pVU R                  U5      nU R                  nU R                  XXXuR                  SS9n	[        U[        R                  5      (       a  UR                  UR                  pOE[        U[        5      (       a,  UR                  R                  UR                  R                  pOSu  pXL a%  U	R                   R#                  UR                   5        U	$ )Nr/   z-must pass column labels for multi-column dataF)r?   columnsr   copy)r/      )_valuesndimrO   newaxisshaper   r   get_new_columns	new_indexr<   r   
isinstancendarraybaser   _ndarray_mgradd_references)rX   objvalue_columnsr   r}   r   r~   r   r?   resultr   new_bases               r6   
get_result_Unstacker.get_result   s   ;;!ArzzM*F V\\!_%9LMM++F?
&&}5!!W<L<LSX " 
 fbjj))#[[*//( ;<<#__11:3F3F3K3K(!NDKK&&sxx0ra   Nc                   UR                   S:X  a  US S 2[        R                  4   nU R                  U5      nU R                  u  pEUR
                  S   nXV-  nXG4nU R                  n	U R                  n
U
(       a]  [        U5      (       aM  UR                  XEU5      R                  SS5      R                  U5      n[        R                  " U[        S9nX4$ UR                  n[        U[        5      (       a+  UR!                  5       nUR#                  XS9nU
(       d  X+S S & OU
(       dy  Un[%        X5      u  pX:w  ae  UR&                  S;  a#  [(        R*                  " S[,        [/        5       S9  O2[1        U5      (       d"  [(        R*                  " S[,        [/        5       S9  [        R2                  " XS9nU
(       d  UR5                  U5        UR6                  n[        R8                  " U[        S9n[;        UR                  5      (       a#  UR=                  S5      nUR=                  S5      nOUR?                  USS	9n[@        RB                  " UU	R=                  S
5      UUUUUR=                  S
5      5        [;        UR                  5      (       a7  UR=                  S5      n[E        U5      nUR=                  UR                  5      nX4$ )Nr/   r   r   iubznUsing a fill_value that cannot be held in the existing dtype is deprecated and will raise in a future version.r:   i8Fr   u1zM8[ns])#r   rO   r   r   r   r   r   r   re   reshapeswapaxesonesr   r   r   r   construct_array_type_emptyr   kindrU   rV   r   r   r   emptyfillnamer   r   viewastype
libreshapeunstackr   )rX   r}   r   r   lengthwidthr   result_widthresult_shaper   r   r   new_maskr   cls	old_dtyper   s                    r6   r   _Unstacker.get_new_values  sb   ;;!ArzzM*F008 a~-yy== F
 %%fV<!Q& 
 ww|48H''e^,, ,,.CL>J *1!	$1%$D!% ~~U2 V*'7'9 "*-- V*'7'9 ,<J
+zz88L5
 v||,,)..t4M#.J)00E0BM 	IIdOMM$	
 v||,, $2J7
CJ#6J##ra   c                n   Uc}  U R                   (       d#  U R                  R                  U R                  S9$ U R                  R	                  SU R                  R
                  S9nUR                  U R                  5      $ [        U R                  5      U R                   -   n[        U5      n[        R                  " [        R                  " U5      U5      n[        U[        5      (       a_  UR                  U R                  4-   nUR                  U R                  4-   nUR                    Vs/ s H  oR#                  U5      PM     n	nO)UU R                  /nUR$                  U R                  /nU/n	U R&                  n
U	R)                  [        R*                  " X5      5        [        XiUSS9$ s  snf )Nr   r   )itemFrF   rB   rH   verify_integrity)rC   rL   _renamerK   insert	_na_valuerenamere   rO   repeatr   r   r   rF   rM   rH   rB   rQ   r   	_repeaterappendtile)rX   r   levr   r   
propagatorr   	new_nameslab	new_codesrepeaters              r6   r   _Unstacker.get_new_columnsv  s~    <<))11t7H7H1II$$++AD4F4F4P4P+QC::d//00T''(4<<7M"YYryy/8
 mZ00&--1H1H0JJJ%++t/@/@.BBI9F9L9LM9L#*-9LIMI ''J '++T->->?I#I>> 	12iRW
 	
 Ns   0F2c                J   [        U R                  5      [        U R                  5      :w  aP  U R                  R                  U R                  5      nU R                  (       a  [
        R                  " USS5      nU$ [        U R                  5      U R                  -   n[
        R                  " U5      U R                  -
  nU R                  (       aP  U R                  (       d?  U R                  S:  d   S5       eSXR                  '   XR                  S-   S === S-  sss& U$ )Nr   r.   z+`unique_nan_index` not properly initializedr/   )re   rM   rL   get_indexerrC   rO   r   r   rD   r=   rN   )rX   r   r   s      r6   r   _Unstacker._repeater  s     t&&'3t/A/A+BB..::4;M;MNH||99Xq"5  ++,t||;Fyy(4994H||DII,,r1 A1 35../..245:5ra   c                ~   U R                   (       a  U R                  S S nO8U R                  n[        U R                  R
                  5      nUS U X2S-   S  -   nU Vs/ s H  oDR                  U R                  5      PM     nn[        U R                  5      S:X  a}  U R                  S   US   pvUS:H  R                  5       (       a%  UR                  [        U5      UR                  5      nUR                  U5      R                  U R                  S   5      $ [        U R                  UU R                  SS9$ s  snf )Nr.   r/   r   Fr   )r=   rw   rA   rE   r?   rB   rQ   r   re   rG   r   r   r   r   rI   r   )rX   labelsrj   rB   r   result_codesrA   level_codess           r6   r   _Unstacker.new_index  s    99'',F

A))*E2AY1uw/F=CDVc1VD t$$%*!%!6!6q!9<?;r!&&((SZA::k*11$2F2Fq2IJJ((&&"	
 	
 Es   $D:)r   r<   r   r   rC   r?   rA   rD   r   rG   rI   rL   rM   rK   r=   rN   )T)r?   r   rA   r&   r=   r   returnNone)r   z-tuple[npt.NDArray[np.intp], list[np.ndarray]])r   zlist[np.ndarray])r}   
np.ndarrayr   r   )r   r   )r   r   )r   z2tuple[npt.NDArray[np.intp], npt.NDArray[np.bool_]])r   r   r2   )r   zIndex | None)r   r   )r   MultiIndex | Index)__name__
__module____qualname____firstlineno____doc__r_   r
   rs   rw   r   rW   r   r   r   r   r   r   r   __static_attributes__ ra   r6   r+   r+   J   s    ,^ JN77(-7BF7	7r  
   ,  
S8 % % ' '4]$~!
F  . 
 
ra   r+   c                  ^ [        U5      S:X  a  U $ U R                  n[        [        U5      nXR                  ;   a  U/nU Vs/ s H  oTR                  U5      PM     nn[        UR                  5       Vs/ s H  oUU;  d  M
  UPM     nnU Vs/ s H  oTR                  U   PM     nnU Vs/ s H  oTR                  U   PM     nnU Vs/ s H  oTR                  U   PM     n	nU Vs/ s H  oTR                  U   PM     n
nU Vs/ s H  oTR                  U   PM     nnU Vs/ s H  oTR                  U   PM     nn[        S U 5       5      n[        XSSS9n[        USS9u  nn[        UUXSS9nU(       d  [        USSS9nO[        / U
QUP/ UQUP/ UQSPSS	9n[        U [         5      (       a.  U R#                  SS
9nUUl        UR%                  SX#S9nUnU	nUnGO2[        U R&                  [        5      (       aR  U nU(       aG  UR)                  S5      nUR%                  UX#S9nU Vs/ s H  nUU:  a  UOUS-
  PM     nnU(       a  MG  U$ U R#                  SS
9nUUl        UR%                  SX#S9n[        U[         5      (       a  UR                  mOUR&                  m[        T[        5      (       d   eTR                  S   /UQnU R&                  R*                  /U	QnTR                  S   /nUR-                  U4S jU 5       5        [        UUUSS	9n[        U[         5      (       a	  UUl        U$ UUl        U$ s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf )Nr   c              3  8   #    U  H  n[        U5      v   M     g 7fr2   rd   rf   s     r6   r7   $_unstack_multiple.<locals>.<genexpr>  s     *'Q#a&&'r9   F)r=   xnullr=   )r  __placeholder__)r   r   r   deepr   r=   r/   c              3  ^   >#    U  H"  oR                  TR                  S    5      v   M$     g7f)r.   N)rQ   rB   )r4   recunstcolss     r6   r7   r    s$     N#(.."455s   *-)re   r?   r   r   rH   r@   rangenlevelsrF   rB   ri   r#   r    r!   r   r   r   r   r   r   rJ   r   extend)dataclocsr   r=   r?   irlocsclevelsccodescnamesrlevelsrcodesrnamesr   r   comp_idsrp   recons_codesdummy_indexdummy	unstackedr   r   r   r   valrj   dummy_dfnew_columnsr  s                                @r6   _unstack_multipler!    s~    5zQ JJEU#E 167A$$Q'E7emm,?,1Q,E?(-.1||AG.&+,ekk!neF,&+,ekk!neF,(-.1||AG.&+,ekk!neF,&+,ekk!neF,*'**E!&e5IK,[uEHg''5PUVLG*;%H &W&g&%F%H%.F.-."	
 $		u	%!MM"3
MV	
	 	dllJ//Fiil  J (  ;@@%Qa#g1q50%@ % M 99%9($ $$* % 
	 i(( H ((H(J////ooa(373
\\&&00	^^A&'	NNN)eK )V$$%	  (	_ 8?.,,.,,J As<   M
8	MMM/MM+M#	M('M-2M2c                    g r2   r   r   rA   r   r=   s       r6   r   r   ,  s    PSra   c                    g r2   r   r#  s       r6   r   r   0  s     ra   c                   [        U[        [        45      (       a  [        U5      S:w  a
  [	        XX#S9$ US   n[        U5      (       d!  US:X  d  U R                  R                  U5        [        U [        5      (       aC  [        U R                  [        5      (       a
  [        XX#S9$ U R                  R                  5       $ [        U R                  [        5      (       d"  [        S[        U R                  5       S35      e[        U R                   5      (       a
  [#        XX#S9$ [%        U R                  XR&                  US9nUR)                  U S US	9$ )
Nr/   r  r   r  z'index must be a MultiIndex to unstack, z was passedr  rA   r<   r=   r   r   )r   ri   rE   re   r!  r   r?   r@   r   r   _unstack_frameTstackr   typer   r   _unstack_extension_seriesr+   _constructor_expanddimr   )r   rA   r   r=   	unstackers        r6   r   r   6  s!    %%''u:? %SJRR!HEeU.?%?		##E*#y!!cii,,!#OO55;;= 		:.. 5d399o5FkR
 	
 syy)),SOOIIU0J0JQU
	 ##Ct
#SSra   c                <   [        U R                  [        5      (       d   e[        U R                  XR                  US9nU R
                  (       d2  U R                  R                  XBS9nU R                  XUR                  S9$ UR                  X R                  US9$ )Nr&  r   )axesr'  )r   r?   r   r+   _constructor_can_fast_transposer   r   _constructor_from_mgrr0  r   r   )r   rA   r   r=   r.  mgrs         r6   r(  r(  Z  s     cii,,,,		,<,<4I ""hhy@((88(<<##{{z $ 
 	
ra   c                    U R                  5       nUR                  XUS9nUR                  R                  S/5      Ul        U$ )a  
Unstack an ExtensionArray-backed Series.

The ExtensionDtype is preserved.

Parameters
----------
series : Series
    A Series with an ExtensionArray for values
level : Any
    The level name or number.
fill_value : Any
    The user-level (not physical storage) fill value to use for
    missing values introduced by the reshape. Passed to
    ``series.values.take``.
sort : bool
    Whether to sort the resulting MuliIndex levels

Returns
-------
DataFrame
    Each column of the DataFrame will have the same dtype as
    the input Series.
)rA   r   r=   r   )to_framer   r   _drop_level_numbers)seriesrA   r   r=   dfr   s         r6   r,  r,  k  sC    8 
	BZZeZFF ^^77<FN Mra   c                \   S nU R                   u  pVU R                  R                  U5      n[        U R                  [        5      (       a
  [        XX#S9$ [        U R                  [        5      (       a  [        U R                  R                  5      nU R                  R                   V	s/ s H  oR                  U5      PM     n
n	U" U R                  5      u  pUR                  U5        U
R                  [        R                  " X5      R                  5       5        [        U R                  R                  5      nUR                  U R                  R                   5        [	        XUSS9nO[#        [%        X@R                  U R                  45      SS06u  nu  nnUR                  U5      [        R                  " X5      R                  5       4n[	        UUU R                  R                   U R                  R                   /SS9nU R&                  (       d  U R(                  (       a  [        U R*                  R,                  5      nUS   n[        U[.        5      (       a\  UR1                  5       nUR3                  U R5                  5        VVs/ s H  u  nnUR,                  PM     snn5      n[7        UXV5      nO5U R,                  R                  5       nOU R,                  R                  5       nU(       a  [9        U5      nUU   nUU   nU R;                  UUS9$ s  sn	f s  snnf )	z
Convert DataFrame to Series with multi-level Index. Columns become the
second level of the resulting hierarchical index

Returns
-------
stacked : Series or DataFrame
c                    U R                   (       a!  U [        R                  " [        U 5      5      4$ [	        U 5      u  pX!4$ r2   )	is_uniquerO   r   re   r   )r?   rB   
categoriess      r6   stack_factorizestack.<locals>.stack_factorize  s7    ??"))CJ///3E:  ra   )	level_numdropnar=   Fr   strictTr   r?   )r   r   r@   r   r   _stack_multi_columnsr?   rE   rF   rB   r   r   rO   r   ravelrH   r   zipmapr   _is_homogeneous_typedtypesr   r   r   _concat_same_typeitems"_reorder_for_extension_array_stackr   _constructor_sliced)framerA   rA  r=   r>  NKr@  r   r   r   clevclabr   r   rF   ilabrB   rI  r   arrr~   colr   r   s                            r6   r*  r*    s   ! ;;DA //6I%--,,#v
 	
 
EKK	,	,%++,,-
.3kk.?.?@.?sZZ].?	@$U]]3
$)//12**+	++,iRW
	  #;;">? 
HL 
t A 0 6 6 88;;##U]]%7%78"	
	 ;;555 ell**+q	e^,,,,.C..+0;;=9=C=9J <JMJ ,,.J ]]((*
Z %
dO	$$Zy$AAc AB :s   ,L#L(
c                  ^  [        U 4S jU 5       5      (       a  T nU H  n[        XEX#S9nM     U$ [        S U 5       5      (       av  T nU Vs/ s H  nT R                  R                  U5      PM      nnU(       a@  UR	                  S5      n[        XEX#S9nU Vs/ s H  ofU::  a  UOUS-
  PM     nnU(       a  M@  U$ [        S5      es  snf s  snf )Nc              3  T   >#    U  H  oTR                   R                  ;   v   M     g 7fr2   )r   rH   )r4   r   rN  s     r6   r7   !stack_multiple.<locals>.<genexpr>  s     
7#%--%%%s   %()rA  r=   c              3  B   #    U  H  n[        U[        5      v   M     g 7fr2   )r   int)r4   r   s     r6   r7   rX    s     3UcZS!!Us   r   r/   zTlevel should contain all level names or all level numbers, not a mixture of the two.)r   r*  r   r@   rJ   r   )rN  rA   rA  r=   r   r   rj   s   `      r6   stack_multipler[    s     
7
777C 6vAF : M/ 
3U3	3	3  BGG#005G))A,C 6vAF 8==u!s(QA-uE= e M 1
 	
 H >s   %CCc                   [        U R                  5      S::  a)  U R                  S   R                  U R                  S   S9$ S [	        U R                  SS U R
                  SS SS9 5       n[	        US	S06nS
 [        R                  " U5       5       n[	        US	S06n[        R                  " [	        X@R                  SS SS9 VVs/ s H   u  pVSU;  a  [        XVR                  S9OUPM"     snnU R                  SS S9$ s  snnf )zBCreates a MultiIndex from the first N-1 levels of this MultiIndex.r   r   r   c              3  h   #    U  H#  u  pU Vs/ s H  o3S :  a  X   OSPM     snv   M%     gs  snf 7f)r   Nr   )r4   r   rB   cs       r6   r7   ,_stack_multi_column_index.<locals>.<genexpr>  s8      SJC .33U6t	#U3S 	4s   2-2Nr.   T)rB  rB  c              3  *   #    U  H	  u  pUv   M     g 7fr2   r   )r4   keyr~   s      r6   r7   r_    s     A'@VSS'@s   r   rH   )re   rF   r   rH   rF  rB   	itertoolsgroupbyr   from_arraysr   r   )r   rl   tuplesunique_tuplesnew_levsnew_levr   s          r6   _stack_multi_column_indexrj    s   
7>>a~~a ((gmmA.>(??gnnSb17=="3EdSD $$t$FAy'8'8'@AMM/$/H !! !$HnnSb.A$ O	
 !P 047/BE'+O O	

 mmCR  	
s   'D
c                b   SS jnU R                  SS9nUR                  n[        U[        5      (       d   eXR                  S-
  :w  aO  Un[        XR                  S-
  5       H(  nU" X5      n	U" US-   U5      n
UR                  X5      nM*     U=Ul        nUR                  5       (       d,  U(       a%  U" SU5      nUR                  USS9nUR                  n[        [        U5      n[        U5      n0 nUR                  S   n[        UR                  S   5      nU(       a  [        R                  " U5      nUR!                  [#        U5      S 5      n[        R$                  " UU5      n[#        U5      n/ nU GH  n UR                  R'                  U5      n[        U[,        5      (       d  [#        U5      nOUR.                  UR0                  -
  nUU:w  ah  UR2                  S S 2UR                  U   4   nUR%                  UR                  R                  S   5      Ul        UR5                  US9R6                  nGOUR8                  S S 2U4   n[;        UR<                  R?                  5       5      n[        U[@        5      (       a  URC                  5       RE                  URG                  5        VVs/ s H   u  nnURH                  RK                  USS	9PM"     snn5      nURL                  u  nn[        RN                  " UU-  5      RQ                  UU5      RR                  RQ                  S5      nUR%                  U5      nOUR6                  nURT                  S:  a  URW                  5       nUUU'   GM     [#        U5      S:  a  URY                  U5      n[#        U5      n[        URZ                  [        5      (       at  []        URZ                  R                  5      n []        URZ                  R^                  5      n!URZ                  R                   V"s/ s H  n"U"Ra                  U5      PM     n#n"OD[c        URZ                  5      u  n$n%U%/n U$Ra                  U5      /n#URZ                  Rd                  /n!U R+                  U5        U#R+                  [        Rf                  " UU5      5        U!R+                  U R                  R^                  U   5        [        U U#U!SS
9n&U Ri                  UU&US9n'U R                  R                  S:  aO  U R                  Rk                  U/5      R                  5       n(U'R                  Rm                  U(5      (       d  U'U(   n'U(       a  U'Ro                  SSS9n'U'$ ! [(         a    UR+                  U5         GM&  f = fs  snnf s  sn"f )Nc                B    XR                   ;   a  UR                   U    $ U $ )z
Logic for converting the level number to something we can safely pass
to swaplevel.

If `level_num` matches a column name return the name from
position `level_num`, otherwise return `level_num`.
rb  )r@  r   s     r6   _convert_level_number3_stack_multi_columns.<locals>._convert_level_number&  s#     %==++ra   Fr  r/   r   )rA   rz   r.   )r   r   r   )r?   r   r   )rz   how)r@  rZ  r   r   )8r   r   r   r   r  r  	swaplevel_is_lexsorted
sort_indexr   rj  rF   r   rB   rO   r=   r   re   rQ   get_locKeyErrorr   slicestopstartlocreindexr}   ilocr   rI  tolistr   r   rJ  rK  r   r   r   r   r   r)  r   rE  
differencer?   rE   rH   r   r   r   r   r1  r7  equalsrA  ))rN  r@  rA  r=   rm  thismi_colsroll_columnsr  lev1lev2level_to_sortr   new_data
level_valsr   level_vals_nanlevel_vals_usedlevsize	drop_colsra  rx  	slice_lenchunkvalue_slicesubsetr   r~   rg   rO  rP  idxr   r   r   r   	old_codes
old_levelsr   r   desired_columnss)                                            r6   rD  rD  #  s    ::5:!DllGgz**** OOa''y//A"56A(9D(Q=D'11$=L	 7
 ".-w  ""t .a9];,,:w'G+G4K H#Jr*+Kggk*&&s:=Nggnk:O+GI	,,&&s+C #u%%CI399,IHHQS 112E*//0C0CB0GHEM---@GGKYYq#v&F$V]]%9%9%;<E%00 $88:LLEK\\^T^TQQYY%%e%%8^T ||1iiA&..q!466>>rB)..s3$mma%++-K#O R 9~!,,Y7D	A$**j))$**++,
))*	48JJ4D4DE4DSSZZ(4D	E	 7

 C	: \
%%g./	ZZ__%	j!RWW[!,-U]]((34)eI 	;OF}}q --;;YKHOOQ~~$$_55O,F A51MS  	S!	0 U, Fs   V;'V&#V,V#"V#c                    [         R                  " X-  5      R                  X!5      R                  R                  S5      nU R	                  U5      $ )a  
Re-orders the values when stacking multiple extension-arrays.

The indirect stacking method used for EAs requires a followup
take to get the order correct.

Parameters
----------
arr : ExtensionArray
n_rows, n_columns : int
    The number of rows and columns in the original DataFrame.

Returns
-------
taken : ExtensionArray
    The original `arr` with elements re-ordered appropriately

Examples
--------
>>> arr = np.array(["a", "b", "c", "d", "e", "f"])
>>> _reorder_for_extension_array_stack(arr, 2, 3)
array(['a', 'c', 'e', 'b', 'd', 'f'], dtype='<U1')

>>> _reorder_for_extension_array_stack(arr, 3, 2)
array(['a', 'd', 'b', 'e', 'c', 'f'], dtype='<U1')
r.   )rO   r   r   r)  rQ   )rT  n_rows	n_columnsr  s       r6   rL  rL    s@    B ))F&
'
/
/	
B
D
D
L
LR
PC88C=ra   c           	        U R                   R                  5       [        U R                   5      :w  a  [        S5      e[        U5      (       d  U $ [	        U5      nU R                   R                  [        U R                   R                  S-
  SS5       Vs/ s H  o3U;  d  M
  UPM     sn5      n[        U R                   [        5      (       dy  [        U R                   5      S:  a5  U R                  (       a$  U R                  R                  S   R                  nOS nU R                  U R                  R!                  SSS9US9nO[#        XX$5      nU R$                  (       a  SO[        U5      [        U 5      -  n[        U R&                  [        5      (       aM  U R&                  R(                  n[+        [,        R.                  " U R&                  R0                  SU45      5      n	O;[3        U R&                  SS	9u  pU/n[+        [,        R.                  " U
SU45      5      n	[        U5      S:  a?  [,        R4                  " U5      n[        U[        5      (       d   eUR7                  U5      nOUnUR9                  5       n[        U[        5      (       a'  UR(                  nUR;                  5       R0                  nOU/n[3        USS	9S   /nU V
s/ s H#  n
[,        R<                  " U
[        U 5      5      PM%     nn
[        X-   U	U-   U R&                  R>                  [+        UR>                  5      -   SS
9Ul        [        U 5      n[        U5      n[,        R@                  " U5      n[,        R.                  " UU-  U5      [,        R<                  " [,        R@                  " U5      U5      -   nURC                  U5      nURD                  S:X  ac  U R                   R                  [        U5      :X  a@  [        UR                   5      S:X  a  [G        UR&                  S9nOURH                  S S 2S4   nURD                  S:X  a  S Ul%        U$ s  snf s  sn
f )Nz8Columns with duplicate values are not supported in stackr/   r.   r   F)orderr   F)use_na_sentinelr   r   rC  )&r   nuniquere   r   setr7  r  r  r   r   rH  r   blocksr   rM  r   r   stack_reshaper   r?   rF   rE   rO   r   rB   r   argsort_reorder_ilevelsr   drop_duplicatesr   rH   r   rQ   r   r   rz  r   )rN  rA   
set_levelsk
stack_colsr   r   ratioindex_levelsindex_codesrB   uniquessorterordered_stack_colsordered_stack_cols_uniquecolumn_levelscolumn_codeslen_df	n_uniquesrr   idxss                        r6   stack_v3r    s|   }}#emm"44STTu::UJ22%--//!3R<T<q@S<TJ
 emmZ00 u}}!e&@&@JJ%%a(..EE**MM!!"C!0 + 
 uZD A#f+U";E %++z**{{))2775;;#4#4q%jAB"5;;Fy27751e*56
5zA~E"*j1111'88@' 2 9 9 ;$j11*11)99;AA23!";USTUVW ?KKlUBIIeSZ0lLK+L(kk$'9'?'?"@@	FL ZF-.Iii	"G776G#V,ryy69JI/VVD[[F {{aEMM11SZ?v~~!#&,,/F[[A&F{{aMQ 	U` Ls   	Q"Q*Qc                  ^^ [        U R                  [        5      (       d   e[        USS9n/ nUR	                  5        GH0  n[        U R                  5      S:X  a  U R                  SS9nOc[        U5      S:X  a  U4n[        U5      m[        UU4S j[        U R                  R                  5       5       5      nU R                  SS2U4   n[        U5      U R                  R                  :  a!  UR                  R                  U5      Ul        OKUR                  S:X  a;  UR                  S:X  a  SUl        O#[        [        UR                  5      5      Ul        UR!                  U5        GM3     [        U5      S:  a  U R"                  (       d  [%        USS	9n	Om[        U5      U R                  R                  :  a*  U R                  R                  U5      R	                  5       n
OS/n
['        XR(                  R*                  S
9n	[        U5      U R                  R                  :  aM  U R                  R                  U5      R	                  5       nU	R                  R-                  U5      (       d  X   n	U	$ )a  Reshape the data of a frame for stack.

This function takes care of most of the work that stack needs to do. Caller
will sort the result once the appropriate index is set.

Parameters
----------
frame: DataFrame
    DataFrame that is to be stacked.
level: list of ints.
    Levels of the columns to stack.
set_levels: set of ints.
    Same as level, but as a set.
stack_cols: Index.
    Columns of the result when the DataFrame is stacked.

Returns
-------
The data of behind the stacked DataFrame.
T)reverser/   Fr  c              3  \   >#    U  H!  nUT;   a  [        T5      O
[        S 5      v   M#     g 7fr2   )nextru  )r4   r  genr  s     r6   r7    stack_reshape.<locals>.<genexpr>D  s+      #5A *_S	%+=5s   ),Nr   )ignore_index)r   r   )r   r   r   sortedr   re   r   iterri   r  r  rx  r7  r   r   r   r   r   r   r   r   r   r}  )rN  rA   r  r  drop_levnumsbufr  r  column_indexerr   r   r  r  s     `         @r6   r  r    s   0 emmZ0000%.L C  "u}}"::5:)D 5zQfs)C" #u}}445# N 99Q./Du:---<<;;LIDL1$yyA~	,S->?

4+ #. 3x!|EKK$/ u:-----;;LIPPRK#K;mm6I6IJ
5zEMM)))--;;LIPPR~~$$_55,FMra   )NT)r  Series | DataFramer=   r   )..)r   r   r=   r   r   r   )r   r  r=   r   r   r  )r   r   r=   r   r   r   )r8  r   r=   r   r   r   )r.   TT)rN  r   rA  r   r=   r   r   r  )TT)rN  r   rA  r   r=   r   )r   r   r   r   )
rN  r   r@  rZ  rA  r   r=   r   r   r   )rT  r(   r  rZ  r  rZ  r   r(   )rN  r   rA   	list[int]r   r  )
rN  r   rA   r  r  zset[int]r  r   r   r  )T
__future__r   rc  typingr   r   r   rU   numpyrO   pandas._config.configr   pandas._libs.reshape_libsr   r   pandas.errorsr   r	   pandas.util._decoratorsr
   pandas.util._exceptionsr   pandas.core.dtypes.castr   r   pandas.core.dtypes.commonr   r   r   r   pandas.core.dtypes.dtypesr   pandas.core.dtypes.missingr   r   pandas.core.algorithmscore
algorithmsr{   r   r   pandas.core.arrays._mixinsr   pandas.core.arrays.categoricalr   pandas.core.constructionr   pandas.core.framer   pandas.core.indexes.apir   r   r   pandas.core.reshape.concatr   pandas.core.seriesr   pandas.core.sortingr    r!   r"   r#   r$   pandas._typingr%   r&   r'   pandas.core.arraysr(   pandas.core.indexes.frozenr)   r+   r!  r   r(  r,  r*  r[  rj  rD  rL  r  r  r   ra   r6   <module>r     sM   "  
   , ) ) 3 4  5
 ' & C B C ' 
 . %    25~
 ~
D DH^
^<@^B 
 S 
 S 
AD	:> 
 CG!T	!T;?!T!TJ :>
	
26

"$$-1$$P CGNBNB(,NB;?NBNBb"J8 NRAA!$A37AFJAAH"	"!$"14""JOdFF&F4<FJOFFra   