
    i                       d dl mZ d dlZd dlmZmZmZ d dlZd dlZ	d dl
mZ d dlmc mZ d dlmZmZ d dlmZ d dlmZ d dlmZmZ d d	lmZmZmZmZ d d
lm Z  d dl!m"Z"m#Z# d dl$m%c m&Z' d dl$m(Z(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3m4Z4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z;m<Z<m=Z=m>Z>m?Z? erd dl@mAZAmBZBmCZC d dlDmEZE d dlFmGZG  G d d      ZH	 d'	 	 	 d(dZIed)d*d       ZJe	 d)	 	 	 	 	 d+d       ZJ	 d'	 	 	 	 	 d+dZJ	 d'	 	 	 	 	 d,dZK	 	 	 	 	 	 d-dZL	 d.	 	 	 	 	 	 	 d/d ZMd0d1d!ZNd2d"ZO	 d.	 	 	 	 	 	 	 	 	 d3d#ZP	 	 	 	 	 	 	 	 d4d$ZQd5d%ZR	 	 	 	 	 	 	 	 	 	 d6d&ZSy)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                      e Zd ZdZ	 d	 	 	 	 	 	 	 ddZe	 	 dd       Zedd       ZddZddZ	edd       Z
edd       Zdd	ZddZddZedd       Zedd       Zy
)
_Unstackera  
    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                V   || _         || _        |j                         | _        | j                  j	                  |      | _        d| j                  j                  | j
                     v | _        | j                  xr | j                  }|rdnd| _        t        | j                  j                        | _        t        | j                  j                        | _        | j                  j                  | j
                        | _        | j                  j                  | j
                        | _        |j                  | j
                     | _        d| _        | j                  st'        | j                  j                  | j
                           }| j                  r(|dk(  }||    }t)        j*                  |      d   | _        | j                   j-                  |      | _        | j"                  j-                  |      | _        t/        d      rt1        d | j                  D              }| j                   j2                  }	||	z  }
|
t)        j4                  t(        j6                        j0                  kD  r(t9        j:                  d|
 dt<        t?                      | jA                          y )	N   r   performance_warningsc              3  4   K   | ]  }|j                     y wN)size).0index_levels     X/app/cer_product_mecsu/.venv/lib/python3.12/site-packages/pandas/core/reshape/reshape.py	<genexpr>z&_Unstacker.__init__.<locals>.<genexpr>   s     U;++Us   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   maxr2   iinfoint32warningswarnr	   r   _make_selectors)selfr<   r>   r9   r:   should_liftunique_codesnan_masknum_rowsnum_columns	num_cellss              r5   __init__z_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-+XI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                   | j                   }t        | j                  j                        }| j                  s|D cg c]  }t        |      d    }}t        | j                  j                        }|d | ||dz   d  z   ||   gz   }t        d |d | ||dz   d  z   ||   gz   D              }t        ||      \  }}t        |      }	t        ||	      }
|
|fS c c}w )Nr   r.   c              3  2   K   | ]  }t        |        y wr1   lenr3   xs     r5   r6   z2_Unstacker._indexer_and_to_sort.<locals>.<genexpr>   s     Kc!fK   )r>   rB   r<   r?   r:   r   rC   tupler"   ra   r$   )rU   vr?   codelevsto_sortsizes
comp_indexobs_idsngroupsindexers              r5   _indexer_and_to_sortz_Unstacker._indexer_and_to_sort   s     JJTZZ%%&yy49:DYt_Q':E:DJJ%%&)eAEGn,az9Kd2Aha!eg&>$q'&JKK0%@
Gg,(W= ;s   Cc                    | j                   \  }}| j                  r|D cg c]  }|j                  |       c}S |S c c}w r1   )ro   r:   rN   )rU   rn   ri   lines       r5   sorted_labelsz_Unstacker.sorted_labels   s=    44993:;4DIIg&;; <s   =c                T    | j                   \  }}t        j                  ||d      }|S )Nr   )axis)ro   algostake_nd)rU   valuesrn   _sorted_valuess        r5   _make_sorted_valuesz_Unstacker._make_sorted_values   s)    ..
fgA>r]   c                @   | j                   }| j                  d d }t        d |D              }t        ||      \  }}t	        |      }t        |      }| j                  j                  | j                     | j                  z   }||f| _
        | j                  d   ||z  z   | j                  z   }t        j                  t        j                  | j                        t              }	|	j!                  |d       |	j#                         t	        | j                        k  rt%        d      || _        |	| _        | j*                  r*|j-                  t        j.                  |            | _        y t        j*                  t        j2                  |d      d         | _        y )Nr-   c              3  2   K   | ]  }t        |        y wr1   r`   rb   s     r5   r6   z-_Unstacker._make_selectors.<locals>.<genexpr>   s     7qCF7rd   dtypeTz0Index contains duplicate entries, cannot reshape)return_indexr.   )rD   rr   re   r"   ra   r   r<   levshaper>   r@   
full_shaperA   rL   zerosprodboolputsum
ValueErrorgroup_indexmaskr:   searchsortedarange
compressorr   )
rU   
new_levelsremaining_labelslevel_sizesrk   rl   rm   strideselectorr   s
             r5   rT   z_Unstacker._make_selectors   sD   **
  --cr27J7701A;O
Gg,(4
$$TZZ04<<?!6/%%b)FZ,??$))Kxx0=4 88:DJJ'OPP%	99(55bii6HIDO ggbii
&Nq&QRDOr]   c                H    t        | j                  j                               S r1   )r   r   all)rU   s    r5   mask_allz_Unstacker.mask_all   s    DIIMMO$$r]   c                    t        j                  t        | j                        t         j                        }| j                  |d      \  }}||j                  d      fS )Nr}   r-   
fill_valuer   )rL   r   ra   r<   intpget_new_valuesany)rU   	dummy_arr
new_valuesr   s       r5   arange_resultz_Unstacker.arange_result   sM     IIc$**oRWW=	..yR.H
D488A;&&r]   c                   |j                   }|j                  dk(  r|d d t        j                  f   }||j                  d   dk7  rt        d      | j                  ||      \  }}| j                  |      }| j                  }| j                  ||||j                  d      }	t        |t        j                        r|j                  |j                  }}
nBt        |t              r-|j                  j                  |j                  j                  }}
nd\  }
}|
|u r%|	j                   j#                  |j                          |	S )Nr.   z-must pass column labels for multi-column dataF)r<   columnsr~   copy)r.      )_valuesndimrL   newaxisshaper   r   get_new_columns	new_indexr9   r~   
isinstancendarraybaser   _ndarray_mgradd_references)rU   objvalue_columnsr   rw   r   rx   r   r<   resultr   new_bases               r5   
get_resultz_Unstacker.get_result   s   ;;!ArzzM*F V\\!_%9LMM++FJ?
A&&}5!!eWJ<L<LSX " 
 fbjj)#[[*//(D ;<#__11:3F3F3K3K(D!ND(8KK&&sxx0r]   Nc                v   |j                   dk(  r|d d t        j                  f   }| j                  |      }| j                  \  }}|j
                  d   }||z  }||f}| j                  }	| j                  }
|
r\t        |      rQ|j                  |||      j                  dd      j                  |      }t        j                  |t              }||fS |j                  }t        |t              r+|j!                         }|j#                  ||      }|
s||d d  n|
sx|}t%        ||      \  }}||k7  rb|j&                  dvr%t)        j*                  dt,        t/                      n/t1        |      s$t)        j*                  dt,        t/                      t        j2                  ||      }|
s|j5                  |       |j6                  }t        j8                  |t              }t;        |j                        r#|j=                  d      }|j=                  d      }n|j?                  |d	      }tA        jB                  ||	j=                  d
      |||||j=                  d
             t;        |j                        r7|j=                  d      }tE        |      }|j=                  |j                        }||fS )Nr.   r   r}   iubznUsing a fill_value that cannot be held in the existing dtype is deprecated and will raise in a future version.r7   i8Fr   u1zM8[ns])#r   rL   r   rz   r   r   r   r   ra   reshapeswapaxesonesr   r~   r   r   construct_array_type_emptyr   kindrR   rS   r   r   r   emptyfillnamer   r   viewastype
libreshapeunstackr   )rU   rw   r   ry   lengthwidthr   result_widthresult_shaper   r   r   new_maskr~   cls	old_dtyper   s                    r5   r   z_Unstacker.get_new_values  sk   ;;!ArzzM*F008 av~-yy== F
 %%feV<!Q& 
 ww|48Hx''e^, ,,.CL>J *
1!	$1%$D!z% ~~U2 V*'7'9 "*- V*'7'9 ,e<J
+zz88L5
 v||,)..t4M#.J)00E0BM 	IIdOMM$	
 v||, $2J7
CJ#6J8##r]   c                d   |~| j                   s&| j                  j                  | j                        S | j                  j	                  d| j                  j
                        }|j                  | j                        S t        | j                        | j                   z   }t        |      }t        j                  t        j                  |      |      }t        |t              r]|j                  | j                  fz   }|j                  | j                  fz   }|j                   D cg c]  }|j#                  |       }	}n)|| j                  g}|j$                  | j                  g}|g}	| j&                  }
|	j)                  t        j*                  |
|             t        ||	|d      S c c}w )Nr   r   )itemFrC   r?   rE   verify_integrity)r@   rI   _renamerH   insert	_na_valuerenamera   rL   repeatr   r   r   rC   rJ   rE   r?   rN   r   	_repeaterappendtile)rU   r   levr   r   
propagatorr   	new_nameslab	new_codesrepeaters              r5   r   z_Unstacker.get_new_columnsv  s|    <<))11t7H7H1II$$++AD4F4F4P4P+QC::d//00T''(4<<7M"YYryy/8
 mZ0&--1H1H0JJJ%++t/@/@.BBI9F9L9LM#*-MIM ''J '++T->->?I#I>> 	512YiRW
 	
 Ns   )F-c                (   t        | j                        t        | j                        k7  rJ| j                  j                  | j                        }| j                  rt        j                  |dd      }|S t        | j                        | j                  z   }t        j                  |      | j                  z
  }| j                  rL| j                  s@| j                  dkD  sJ d       d|| j                  <   || j                  dz   d xxx dz  ccc |S )Nr   r-   z+`unique_nan_index` not properly initializedr.   )ra   rJ   rI   get_indexerr@   rL   r   r   rA   r:   rK   )rU   r   r   s      r5   r   z_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r]   c                n   | j                   r| j                  d d }n9| j                  }t        | j                  j
                        }|d | ||dz   d  z   }|D cg c]  }|j                  | j                         }}t        | j                        dk(  ry| j                  d   |d   }}|dk(  j                         r%|j                  t        |      |j                        }|j                  |      j                  | j                  d         S t        | j                  || j                  d      S c c}w )Nr-   r.   r   Fr   )r:   rr   r>   rB   r<   r?   rN   r   ra   rD   r   r   r   r   rF   r   )rU   labelsrf   r?   r   result_codesr>   level_codess           r5   r   z_Unstacker.new_index  s    99'',F

A))*E2AYq1uw/F=CDc1DD t$$%*!%!6!6q!9<?;Er!&&(SZA::k*11$2F2Fq2IJJ((&&"	
 	
 Es   "D2)T)r<   r   r>   r&   r:   r   returnNone)r   z-tuple[npt.NDArray[np.intp], list[np.ndarray]])r   zlist[np.ndarray])rw   
np.ndarrayr   r   )r   r   )r   r   )r   z2tuple[npt.NDArray[np.intp], npt.NDArray[np.bool_]])r   r   r1   )r   zIndex | None)r   r   )r   MultiIndex | Index)__name__
__module____qualname____doc__r\   r
   ro   rr   rz   rT   r   r   r   r   r   r   r    r]   r5   r+   r+   J   s    ,^ JN77(-7BF7	7r  
   ,  
S8 % % ' '4]$~!
F  . 
 
r]   r+   c                   t        |      dk(  r| S | j                  }t        t        |      }||j                  v r|g}|D cg c]  }|j                  |       }}t        |j                        D cg c]	  }||vs| }}|D cg c]  }|j                  |    }}|D cg c]  }|j                  |    }}|D cg c]  }|j                  |    }	}|D cg c]  }|j                  |    }
}|D cg c]  }|j                  |    }}|D cg c]  }|j                  |    }}t        d |D              }t        ||dd      }t        |d      \  }}t        ||||d      }|st        |dd      }nt        g |
|g ||g |dd	      }t        | t               r5| j#                  d
      }||_        |j%                  d||      }|}|	}|}nt        | j&                  t              rG| }|rA|j)                  d      }|j%                  |||      }|D cg c]  }||k  r|n|dz
   }}|rA|S | j#                  d
      }||_        |j%                  d||      }t        |t               r|j                  n|j&                  t        t              sJ j                  d   g|}| j&                  j*                  g|	}j                  d   g}|j-                  fd|D               t        |||d	      }t        |t               r	||_        |S ||_        |S c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )Nr   c              3  2   K   | ]  }t        |        y wr1   r`   rb   s     r5   r6   z$_unstack_multiple.<locals>.<genexpr>  s     *Q#a&*rd   F)r:   xnullr:   )r   __placeholder__)r   r   r   deepr   r:   r.   c              3  Z   K   | ]"  }|j                  j                  d           $ yw)r-   N)rN   r?   )r3   recunstcolss     r5   r6   z$_unstack_multiple.<locals>.<genexpr>  s#     N#(.."45Ns   (+)ra   r<   r   r   rE   r=   rangenlevelsrC   r?   re   r#   r    r!   r   r   r   r   r   r   rG   r   extend)dataclocsr   r:   r<   irlocsclevelsccodescnamesrlevelsrcodesrnamesr   r   comp_idsrl   recons_codesdummy_indexdummy	unstackedr   r   r   r   valrf   dummy_dfnew_columnsr   s                                @r5   _unstack_multipler    s    5zQ JJEU#E 167AU$$Q'7E7emm,?1Q?E?(-.1u||A.G.&+,ekk!n,F,&+,ekk!n,F,(-.1u||A.G.&+,ekk!n,F,&+,ekk!n,F,*'**E!&%e5IK,[uEHg''5&PUVLG*;%H &W&g&%F%H%.F.-."	
 $		u	%!MM"3
QUMV	
	 	dllJ/Fiil  JT (  ;@@Qa#g1q50@@  M 99%9($ $$*4 % 
	 i( H ((H(J///ooa(373
\\&&00	^^A&'	NNN)eK )V$%	  (	_ 8?.,,.,,J As<   L-4	L2>L2L7$L< MM8MM%Mc                     y r1   r   r   r>   r   r:   s       r5   r   r   ,  s    PSr]   c                     y r1   r   r  s       r5   r   r   0  s     r]   c                   t        |t        t        f      r"t        |      dk7  rt	        | |||      S |d   }t        |      s |dk(  s| j                  j                  |       t        | t              rCt        | j                  t              rt        | |||      S | j                  j                         S t        | j                  t              s"t        dt        | j                         d      t        | j                         rt#        | |||      S t%        | j                  || j&                  |      }|j)                  | d |	      S )
Nr.   r   r   r   z'index must be a MultiIndex to unstack, z was passedr   r>   r9   r:   r   r   )r   re   rB   ra   r  r   r<   r=   r   r   _unstack_frameTstackr   typer   r~   _unstack_extension_seriesr+   _constructor_expanddimr   )r   r>   r   r:   	unstackers        r5   r   r   6  s    %%'u:? %S%JTRR!HEeU.?%?		##E*#y!cii,!#u$OO55;;= 		:. 5d399o5FkR
 	
 syy),S%$OOIIU0J0JQU
	 ##Ct
#SSr]   c                H   t        | j                  t              sJ t        | j                  || j                  |      }| j
                  s:| j                  j                  ||      }| j                  ||j                        S |j                  | | j                  |      S )Nr  r   )axesr  )r   r<   r   r+   _constructor_can_fast_transposer   r   _constructor_from_mgrr  r   r   )r   r>   r   r:   r  mgrs         r5   r  r  Z  s     cii,,,		C,<,<4I ""hhyZ@((388(<<##s{{z $ 
 	
r]   c                    | j                         }|j                  |||      }|j                  j                  dg      |_        |S )an  
    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.
    )r>   r   r:   r   )to_framer   r   _drop_level_numbers)seriesr>   r   r:   dfr   s         r5   r  r  k  sE    8 
	BZZe
ZFF ^^77<FN Mr]   c                <   d }| j                   \  }}| j                  j                  |      }t        | j                  t              rt        | |||      S t        | j                  t              rt        | j                  j                        }| j                  j                  D 	cg c]  }	|	j                  |       }
}	 || j                        \  }}|j                  |       |
j                  t        j                  ||      j                                t        | j                  j                        }|j                  | j                  j                          t	        ||
|d      }nt#        t%        || j                  | j                  f      ddi\  }\  }}|j                  |      t        j                  ||      j                         f}t	        ||| j                  j                   | j                  j                   gd      }| j&                  s| j(                  rt        | j*                  j,                        }|d   }t        |t.              rZ|j1                         }|j3                  | j5                         D cg c]  \  }}|j,                   c}}      }t7        |||      }n5| j,                  j                         }n| j,                  j                         }|rt9        |      }||   }||   }| j;                  ||      S c c}	w c c}}w )	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                ~    | j                   r | t        j                  t        |             fS t	        |       \  }}||fS r1   )	is_uniquerL   r   ra   r   )r<   r?   
categoriess      r5   stack_factorizezstack.<locals>.stack_factorize  s;    ??"))CJ///3E:z5  r]   )	level_numdropnar:   Fr   strictTr   r<   )r   r   r=   r   r   _stack_multi_columnsr<   rB   rC   r?   r   r   rL   r   ravelrE   r   zipmapr   _is_homogeneous_typedtypesr   r   r   _concat_same_typeitems"_reorder_for_extension_array_stackr   _constructor_sliced)framer>   r-  r:   r+  NKr,  r   r   r   clevclabr   r   rC   ilabr?   r5  r~   arrrx   colr   r   s                            r5   r  r    s   ! ;;DAq //6I%--,#YvD
 	
 
EKK	,%++,,-
.3kk.?.?@sSZZ]@	@$U]]3
d$q)//12**+	++,YiRW
	  #5;;">? 
HL 
t Aa 0 6 6 88;;##U]]%7%78"	
	 ;;555 ell**+q	e^,,,.C..+0;;=9C9J <J1MJ ,,.J ]]((*
Z %
dO	$$Zy$AAc AB :s   (LL
c                    t         fd|D              r }|D ]  }t        ||||      } |S t        d |D              rj }|D cg c]  } j                  j                  |       }}|r<|j	                  d      }t        ||||      }|D cg c]  }||k  r|n|dz
   }}|r<|S t        d      c c}w c c}w )Nc              3  N   K   | ]  }|j                   j                  v   y wr1   )r   rE   )r3   r   r:  s     r5   r6   z!stack_multiple.<locals>.<genexpr>  s      
7#3%--%%%
7s   "%)r-  r:   c              3  <   K   | ]  }t        |t                y wr1   )r   int)r3   r   s     r5   r6   z!stack_multiple.<locals>.<genexpr>  s     3cZS!3s   r   r.   zTlevel should contain all level names or all level numbers, not a mixture of the two.)r   r  r   r=   rG   r   )r:  r>   r-  r:   r   r   rf   s   `      r5   stack_multiplerF    s     
7
77 	BC 63vDAF	B: M/ 
3U3	3  BGG#005GG))A,C 63vDAF 8==!!s(QA-=E=  M 1
 	
 H >s   "B7B<c           
     .   t        | j                        dk  r,| j                  d   j                  | j                  d         S d t	        | j                  dd | j
                  dd d      D        }t	        |d	di}d
 t        j                  |      D        }t	        |d	di}t        j                  t	        || j                  dd d      D cg c]"  \  }}d|vrt        ||j                        n|$ c}}| j                  dd       S c c}}w )zBCreates a MultiIndex from the first N-1 levels of this MultiIndex.r   r   r   c              3  `   K   | ]!  \  }}|D cg c]  }|d k\  r||   nd c} # yc c}w w)r   Nr   )r3   r   r?   cs       r5   r6   z,_stack_multi_column_index.<locals>.<genexpr>  s9      C .3316Qt	#33s   .).Nr-   T)r.  r.  c              3  &   K   | ]	  \  }}|  y wr1   r   )r3   keyrx   s      r5   r6   z,_stack_multi_column_index.<locals>.<genexpr>  s     AVS!SAs   r}   rE   )ra   rC   r   rE   r2  r?   	itertoolsgroupbyr   from_arraysr   r~   )r   rh   tuplesunique_tuplesnew_levsnew_levr   s          r5   _stack_multi_column_indexrT    s   
7>>a~~a ((gmmA.>(??gnnSb17=="3EdSD $$t$FAy'8'8'@AMM/$/H !! !$HgnnSb.A$ O	
  047/BE'+O	

 mmCR  	
s   'D
c                   dd}| j                  d      }|j                  }t        |t              sJ ||j                  dz
  k7  rP|}t        ||j                  dz
        D ])  } |||      }	 ||dz   |      }
|j                  |	|
      }+ |x|_        }|j                         s*|r( |d|      }|j                  |d      }|j                  }t        t        |      }t        |      }i }|j                  d   }t        |j                  d         }|rt        j                  |      }|j!                  t#        |      d       }t        j$                  ||      }t#        |      }g }|D ]  }	 |j                  j'                  |      }t        |t,              st#        |      }n|j.                  |j0                  z
  }||k7  rk|j2                  d d |j                  |   f   }|j%                  |j                  j                  d         |_        |j5                  |      j6                  }n|j8                  d d |f   }t;        |j<                  j?                               }t        |t@              r|jC                         jE                  |jG                         D cg c]"  \  }}|jH                  jK                  |d	      $ c}}      }|jL                  \  }}t        jN                  ||z        jQ                  ||      jR                  jQ                  d      }|j%                  |      }n|j6                  }|jT                  dkD  r|jW                         }|||<    t#        |      dkD  r|jY                  |      }t#        |      }t        |jZ                  t              rqt]        |jZ                  j                        } t]        |jZ                  j^                        }!|jZ                  j                  D "cg c]  }"|"ja                  |       }#}"nDtc        |jZ                        \  }$}%|%g} |$ja                  |      g}#|jZ                  jd                  g}!| j+                  |       |#j+                  t        jf                  ||             |!j+                  | j                  j^                  |          t        | |#|!d
      }&| ji                  ||&|      }'| j                  j                  dkD  rJ| j                  jk                  |g      j                         }(|'j                  jm                  |(      s|'|(   }'|r|'jo                  dd      }'|'S # t(        $ r |j+                  |       Y w xY wc c}}w c c}"w )Nc                @    | |j                   v r|j                   |    S | S )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`.
        rL  )r,  r   s     r5   _convert_level_numberz3_stack_multi_columns.<locals>._convert_level_number&  s%     %==++r]   Fr   r.   r   )r>   rt   r-   )r   r   r   )r<   r   r   )rt   how)r,  rE  r   r   )8r   r   r   r   r   r   	swaplevel_is_lexsorted
sort_indexr   rT  rC   r   r?   rL   r:   r   ra   rN   get_locKeyErrorr   slicestopstartlocreindexrw   ilocr   r5  tolistr   r   r6  r7  r   r   r   r   r   r  r   r1  
differencer<   rB   rE   r   r   r   r   r  r$  equalsr-  ))r:  r,  r-  r:   rW  thismi_colsroll_columnsr   lev1lev2level_to_sortr  new_data
level_valsr   level_vals_nanlevel_vals_usedlevsize	drop_colsrK  ra  	slice_lenchunkvalue_slicesubsetr~   rx   rc   r;  r<  idxr   r   r   r   	old_codes
old_levelsr   r   desired_columnss)                                            r5   r0  r0  #  s    ::5:!DllGgz*** GOOa''y'//A"56 	>A(L9D(Q=D'11$=L		>
 ".-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 $88:LLEK\\^TTQ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ESSZZ(E	E 7

 C	: \
%%g./	ZZ__%	j!RWW[!,-U]]((34)eI 	;OF}}q --;;YKHOOQ~~$$_5O,F A51MS  	S!	0 U, Fs   1U#'U<VU98U9c                    t        j                  ||z        j                  ||      j                  j                  d      }| j	                  |      S )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-   )rL   r   r   r  rN   )r@  n_rows	n_columnsrw  s       r5   r8  r8    sD    B ))FY&
'
/
/	6
B
D
D
L
LR
PC88C=r]   c           	     l   | j                   j                         t        | j                         k7  rt        d      t        |      s| S t	        |      }| j                   j                  t        | j                   j                  dz
  dd      D cg c]	  }||vs| c}      }t        | j                   t              syt        | j                         dkD  r0| j                  r$| j                  j                  d   j                  }nd }| j                  | j                  j!                  dd      |      }nt#        | |||      }| j$                  rdnt        |      t        |       z  }t        | j&                  t              rL| j&                  j(                  }t+        t-        j.                  | j&                  j0                  d|f            }	n>t3        | j&                  d	      \  }
}|g}t+        t-        j.                  |
d|f            }	t        |      dkD  r9t-        j4                  |      }t        |t              sJ |j7                  |      }n|}|j9                         }t        |t              r'|j(                  }|j;                         j0                  }n|g}t3        |d	      d   g}|D 
cg c]!  }
t-        j<                  |
t        |             # }}
t        ||z   |	|z   | j&                  j>                  t+        |j>                        z   d
      |_        t        |       }t        |      }t-        j@                  |      }t-        j.                  ||z  |      t-        j<                  t-        j@                  |      |      z   }|jC                  |      }|jD                  dk(  rd| j                   j                  t        |      k(  rBt        |j                         dk(  rtG        |j&                        }n|jH                  d d df   }|jD                  dk(  rd |_%        |S c c}w c c}
w )Nz8Columns with duplicate values are not supported in stackr.   r-   r   F)orderr}   F)use_na_sentinelr   r   r/  )&r   nuniquera   r   setr$  r   r   r   r   r4  r   blocksr~   r9  r   r   stack_reshaper   r<   rC   rB   rL   r   r?   r   argsort_reorder_ilevelsr   drop_duplicatesr   rE   r   rN   r   r   rc  r   )r:  r>   
set_levelsk
stack_colsr~   r   ratioindex_levelsindex_codesr?   uniquessorterordered_stack_colsordered_stack_cols_uniquecolumn_levelscolumn_codeslen_df	n_uniquesrn   idxss                        r5   stack_v3r    sq   }}#emm"44STTu:UJ22%--//!3R<Tq@STJ
 emmZ0 u}}!e&@&@JJ%%a(..EE**MM!!"C!0 + 
 ueZD A#f+U";E %++z*{{))2775;;#4#4q%jAB"5;;Fwy27751e*56
5zA~E"*j111'88@' 2 9 9 ;$j1*11)99;AA23!";USTUVW ?KKUBIIeSZ0KLKm+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   	P,P,6&P1c                   t        | j                  t              sJ t        |d      }g }|j	                         D ],  }t        | j                        dk(  r| j                  d      }nat        |      dk(  r|f}t        |      t        fdt        | j                  j                        D              }| j                  dd|f   }t        |      | j                  j                  k  r!|j                  j                  |      |_        nI|j                  dk(  r:|j                  dk(  rd|_        n#t        t        |j                              |_        |j!                  |       / t        |      dkD  r| j"                  st%        |d	      }	npt        |      | j                  j                  k  r*| j                  j                  |      j	                         }
ndg}
t'        |
| j(                  j*                  
      }	t        |      | j                  j                  k  rI| j                  j                  |      j	                         }|	j                  j-                  |      s|	|   }	|	S )a3  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  R   K   | ]  }|v rt              n
t        d          y wr1   )nextr^  )r3   r  genr  s     r5   r6   z stack_reshape.<locals>.<genexpr>D  s,      # *_S	%+=#s   $'Nr   )ignore_index)r   r~   )r   r   r   sortedr   ra   r   iterre   r   r   ra  r$  r   r   r   r   r   r   r   r   r~   rf  )r:  r>   r  r  drop_levnumsbufrw  r   column_indexerr   r  rz  r  s     `         @r5   r  r    s   0 emmZ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;emm6I6IJ
5zEMM)))--;;LIPPR~~$$_5O,FMr]   )NT)r   Series | DataFramer:   r   )..)r   r   r:   r   r   r   )r   r  r:   r   r   r  )r   r   r:   r   r   r   )r%  r   r:   r   r   r   )r-   TT)r:  r   r-  r   r:   r   r   r  )TT)r:  r   r-  r   r:   r   )r   r   r   r   )
r:  r   r,  rE  r-  r   r:   r   r   r   )r@  r(   r|  rE  r}  rE  r   r(   )r:  r   r>   	list[int]r   r  )
r:  r   r>   r  r  zset[int]r  r   r   r  )T
__future__r   rM  typingr   r   r   rR   numpyrL   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
algorithmsru   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  rF  rT  r0  r8  r  r  r   r]   r5   <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r]   