
    Ege                       d dl mZ d dlZd dlmZmZ d dlZd dlZd dl	m
c mZ d dl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 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l+m,Z,m-Z-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5m6Z6m7Z7m8Z8 erd dl9m:Z:m;Z;m<Z< d dl=m>Z> d dl?m@Z@  G d d          ZA	 d9d:dZBd9d;dZC	 d9d<d"ZDd=d%ZEd>d?d)ZFd@d?d*ZGdAd-ZH	 d>dBd0ZIdCd5ZJdDd8ZKdS )E    )annotationsN)TYPE_CHECKINGcast)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)notna)	factorizeunique)factorize_from_iterable)ensure_wrapped_if_datetimelike)	DataFrame)Index
MultiIndex
RangeIndex)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 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dS ),
_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
    Tindexr   levelr!   sortboolreturnNonec                   || _         || _        |                                | _        | j                            |          | _        d| j        j        | j                 v rdnd| _        t          | j        j	                  | _
        t          | j        j                  | _        | j                            | j                  | _        | j
                            | j                  | _        |j	        | j                 | _        | j        sbt#          | j        j        | j                           }| j                            |          | _        | j                            |          | _        t'          j        d | j
        D                       }| j        j        }||z  }|t'          j        t&          j                  j        k    r,t1          j        d| dt4          t7                                 |                                  d S )N   r   c                    g | ]	}|j         
S  )size).0index_levels     P/var/www/sysmax/venv/lib/python3.11/site-packages/pandas/core/reshape/reshape.py
<listcomp>z'_Unstacker.__init__.<locals>.<listcomp>   s    UUU;+UUU    z%The following operation may generate z& cells in the resulting pandas object.)
stacklevel)constructorr)   remove_unused_levelsr'   _get_level_numberr(   codesliftlistlevelsnew_index_levelsnamesnew_index_namespopremoved_nameremoved_levelremoved_level_fullr   takenpmaxr2   iinfoint32warningswarnr   r   _make_selectors)	selfr'   r(   r9   r)   unique_codesnum_rowsnum_columns	num_cellss	            r5   __init__z_Unstacker.__init__n   s    '	//11
Z11%88
 tz/
;;;AA	 !%TZ%6 7 7#DJ$455 044TZ@@!266tzBB"',tz":y 	Q!$*"24:">??L!%!3!8!8!F!FD&*&=&B&B<&P&PD# 6UUt?TUUUVV(- {*	 rx))---M3	 3 3 3"+--	    	r7   -tuple[npt.NDArray[np.intp], list[np.ndarray]]c                   | j         }t          | j        j                  }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 )Nr/   c              3  4   K   | ]}t          |          V  d S Nlenr3   xs     r5   	<genexpr>z2_Unstacker._indexer_and_to_sort.<locals>.<genexpr>   s(      KKc!ffKKKKKKr7   )	r(   r>   r'   r<   r?   tupler   rZ   r   )
rO   vr<   levsto_sortsizes
comp_indexobs_idsngroupsindexers
             r5   _indexer_and_to_sortz_Unstacker._indexer_and_to_sort   s     JTZ%&&DJ%&&)eAEGGn,az9KKd2A2ha!egg&>$q'&JKKKKK0%@@
Gg,,(W==r7   list[np.ndarray]c                F    | j         \  }| j        rfd|D             S |S )Nc                :    g | ]}|                               S r1   rG   )r3   linerf   s     r5   r6   z,_Unstacker.sorted_labels.<locals>.<listcomp>   s%    ;;;4DIIg&&;;;r7   )rg   r)   )rO   ra   rf   s     @r5   sorted_labelsz_Unstacker.sorted_labels   s9    49 	<;;;;7;;;;r7   values
np.ndarrayc                Z    | j         r#| j        \  }}t          j        ||d          }|S |S )Nr   )axis)r)   rg   algostake_nd)rO   rn   rf   _sorted_valuess        r5   _make_sorted_valuesz_Unstacker._make_sorted_values   s9    9 	!2JGQ!M&'BBBM  r7   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                    }	|	                    |d           |	                                t	          | j                  k     rt#          d          || _        |	| _        | j        r.|                    t          j        |                    | _        d S t          j        t          j        |d          d                   | _        d S )Nr.   c              3  4   K   | ]}t          |          V  d S rX   rY   r[   s     r5   r]   z-_Unstacker._make_selectors.<locals>.<genexpr>   s(      77qCFF777777r7   dtypeTz0Index contains duplicate entries, cannot reshape)return_indexr/   )r@   rm   r^   r   rZ   r   r'   levshaper(   r=   
full_shaperH   zerosprodr*   putsum
ValueErrorgroup_indexmaskr)   searchsortedarange
compressorr   )
rO   
new_levelsremaining_labelslevel_sizesrc   rd   re   strideselectorr   s
             r5   rN   z_Unstacker._make_selectors   sl   *
  -crc277J7777701A;OO
Gg,,(44
$TZ049<!6/%b)FZ,??$)Kx00===4   88::DJ''OPPP%	9 	S(55bi6H6HIIDOOO gbi
&N&N&Nq&QRRDOOOr7   c                N    t          | j                                                  S rX   )r*   r   all)rO   s    r5   mask_allz_Unstacker.mask_all   s    DIMMOO$$$r7   2tuple[npt.NDArray[np.intp], npt.NDArray[np.bool_]]c                    t          j        t          | j                  t           j                  }|                     |d          \  }}||                    d          fS )Nry   r.   
fill_valuer   )rH   r   rZ   r'   intpget_new_valuesany)rO   	dummy_arr
new_valuesr   s       r5   arange_resultz_Unstacker.arange_result   sT     Ic$*ooRW===	..yR.HH
D488A;;&&r7   r   c                .   |j         dk    r|d d t          j        f         }| |j        d         dk    rt	          d          |                     ||          \  }}|                     |          }| j        }|                     ||||j	                  S )Nr/   z-must pass column labels for multi-column data)r'   columnsrz   )
ndimrH   newaxisshaper   r   get_new_columns	new_indexr9   rz   )rO   rn   value_columnsr   rt   r   r'   s          r5   
get_resultz_Unstacker.get_result   s    ;!AAArzM*F V\!_%9%9LMMM''
;;	&&}55%   
 
 	
r7   Nc                   |j         dk    r|d d t          j        f         }|                     |          }| j        \  }}|j        d         }||z  }||f}| j        }	| j        }
|
rlt          |          r]|	                    |||          
                    dd          	                    |          }t          j        |t                    }||fS |j        }|
r|j        }t          j        ||          }nt          |t                     r3|                                }|                    ||          }||d d <   n>t'          ||          \  }}t          j        ||          }|                    |           |j        }t          j        |t                    }t/          |j                  r+|                    d          }|                    d          }n|                    |d          }t5          j        ||	                    d          |||||                    d                     t/          |j                  r>|                    d          }t9          |          }|                    |j                  }||fS )	Nr/      ry   i8Fcopyu1zM8[ns])r   rH   r   rv   r}   r   r   r   rZ   reshapeswapaxesonesr*   rz   empty
isinstancer   construct_array_type_emptyr
   fillnamer~   r   viewastype
libreshapeunstackr   )rO   rn   r   ru   lengthwidthr   result_widthresult_shaper   r   r   new_maskrz   clsr   s                   r5   r   z_Unstacker.get_new_values   s   ;!AAArzM*F0088 av~-y=  
	(F 
	(
 %%feV<<!Q&& 
 w|4888Hx''  	,LE,e<<<JJ%00 
, 0022 ZZEZBB
 *
111$1%$D$D!zXl%@@@

+++z8L555
 v|,, 	C)..t44M#..JJ)00E0BBM 	IIdOOMM$	
 	
 	
 v|,, 	7 $22J7
CCJ#66J8##r7   r   Index | Nonec                  	 |k| j         dk    r | j                            | j                  S | j                            d| j        j                  }|                    | j                  S t          | j                  | j         z   }t          |          }t          j	        t          j
        |          |          	t          |t                    r4|j        | j        fz   }|j        | j        fz   }	fd|j        D             }n|| j        g}|j        | j        g}	g}| j        }|                    t          j        ||                     t          |||d          S )Nr   r   )itemc                :    g | ]}|                               S r1   rk   )r3   lab
propagators     r5   r6   z._Unstacker.get_new_columns.<locals>.<listcomp>Z  s%    MMM#*--MMMr7   Fr?   r<   rA   verify_integrity)r=   rE   _renamerD   insert	_na_valuerenamerZ   rH   repeatr   r   r   r?   rF   rA   r<   r   	_repeaterappendtile)
rO   r   levr   r   r   	new_names	new_codesrepeaterr   s
            @r5   r   z_Unstacker.get_new_columnsE  sz    yA~~)11t7H1III$++AD4F4P+QQC::d/000T'((494M""Yry//88
 mZ00 	%&-'1 J &+t/@.BBIMMMM9LMMMII 'J '+T->?I#I> 	511222YiRW
 
 
 	
r7   c                D   t          | j                  t          | j                  k    r=| j                            | j                  }| j        rt          j        |dd          }n8t          | j                  | j        z   }t          j        |          | j        z
  }|S )Nr   r.   )rZ   rF   rE   get_indexerr=   rH   r   r   )rO   r   r   s      r5   r   z_Unstacker._repeaterk  s     t&''3t/A+B+BBB.::4;MNNHy 69Xq"55 +,,ty8Fy((494Hr7   c                     fd j         d d         D             }t           j                  dk    r j        d         |d         }}|dk                                    r(|                    t          |          |j                  }|                    |                               j        d                   S t           j        | j        d          S )Nc                D    g | ]}|                     j                  S r1   )rG   r   )r3   r   rO   s     r5   r6   z(_Unstacker.new_index.<locals>.<listcomp>}  s'    UUUc11UUUr7   r.   r/   r   Fr   )
rm   rZ   r@   r   r   r   rG   r   rB   r   )rO   result_codesr(   level_codess   `   r5   r   z_Unstacker.new_indexz  s     VUUUT=OPSQSPS=TUUU t$%%**!%!6q!9<?;Er!&&(( BSZZAA::k**11$2Fq2IJJJ(&"	
 
 
 	
r7   )T)r'   r   r(   r!   r)   r*   r+   r,   )r+   rU   )r+   rh   )rn   ro   r+   ro   )r+   r*   )r+   r   )r+   r   rX   )r   r   )r+   ro   )r+   r   )__name__
__module____qualname____doc__rT   r   rg   rm   rv   rN   r   r   r   r   r   r   r   r1   r7   r5   r&   r&   @   sh       + +\ JN, , , , ,\       ^ &    ^   S S S8 % % % ^% ' ' ' ^'
 
 
 
M$ M$ M$ M$^$
 $
 $
 $
L    ^ 
 
 
 ^
 
 
r7   r&   TdataSeries | DataFramer)   r*   c                   t                    dk    r| S | j        t          t                    j        v rgfdD             fdt          j                  D             }fdD             }fdD             }fdD             }fd|D             }fd|D             }	fd	|D             }
t          d
 |D                       }t          ||dd          }t          |d          \  }}t          ||||d          }|st          |d          }nt          ||gz   |	|gz   |
dgz   d          }t          | t                    r;|                                 }||_        |                    d||          }|}|}|}nt          | j        t                    rC| }r=                    d          |                    ||          }fdD             =|S |                     d          }||_        |                    d||          }t          |t                    r|j        n|j        t          t                    sJ j        d         g|z   }| j        j        g|z   }j        d         g}|                    fd|D                        t          |||d          }t          |t                    r||_        n||_        |S )Nr   c                :    g | ]}                     |          S r1   )r;   r3   ir'   s     r5   r6   z%_unstack_multiple.<locals>.<listcomp>  s'    777AU$$Q''777r7   c                    g | ]}|v|	S r1   r1   )r3   r   clocss     r5   r6   z%_unstack_multiple.<locals>.<listcomp>  s    ???1Qr7   c                *    g | ]}j         |         S r1   r?   r   s     r5   r6   z%_unstack_multiple.<locals>.<listcomp>      ...1u|A...r7   c                *    g | ]}j         |         S r1   r<   r   s     r5   r6   z%_unstack_multiple.<locals>.<listcomp>      ,,,ek!n,,,r7   c                *    g | ]}j         |         S r1   rA   r   s     r5   r6   z%_unstack_multiple.<locals>.<listcomp>  r   r7   c                *    g | ]}j         |         S r1   r   r   s     r5   r6   z%_unstack_multiple.<locals>.<listcomp>  r   r7   c                *    g | ]}j         |         S r1   r   r   s     r5   r6   z%_unstack_multiple.<locals>.<listcomp>  r   r7   c                *    g | ]}j         |         S r1   r   r   s     r5   r6   z%_unstack_multiple.<locals>.<listcomp>  r   r7   c              3  4   K   | ]}t          |          V  d S rX   rY   r[   s     r5   r]   z$_unstack_multiple.<locals>.<genexpr>  s(      **Q#a&&******r7   F)r)   xnullr)   )r   __placeholder__r   r   r   r)   c                *    g | ]}|k     r|n|d z
  S r/   r1   )r3   r_   vals     r5   r6   z%_unstack_multiple.<locals>.<listcomp>  s)    @@@Qa#gg1q5@@@r7   deepc              3  X   K   | ]$}|                     j        d                    V  %dS )r.   N)rG   r<   )r3   recunstcolss     r5   r]   z$_unstack_multiple.<locals>.<genexpr>  s6      NN#(."455NNNNNNr7   )rZ   r'   r   r   rA   rangenlevelsr^   r   r   r   r   r   r   r   r   r   rC   r?   r   r<   extend)r   r   r   r)   rlocsclevelsccodescnamesrlevelsrcodesrnamesr   r   comp_idsrd   recons_codesdummy_indexdummy	unstackedr   r   r   resultdummy_dfnew_columnsr'   r   r   s    `                       @@@r5   _unstack_multipler    s    5zzQ JEU##E 7777777E????em,,???E.......G,,,,e,,,F,,,,e,,,F.......G,,,,e,,,F,,,,e,,,F**'*****E!&%e5IIIK,[uEEEHg''5&PUVVVL 	
G*;<<< gY&H:%-.."	
 
 
 $ "O		!MM"3
QUMVV	
	 		dlJ// 	F Aiill
NN@@@@%@@@  A
 M 99%9(($$$*4 % 
 
	 i(( 	) HH (H(J/////oa()G3
\&'&0	^A&'	NNNNNNNNNN)e  K )V$$ (%	'	r7   objc                   t          |t          t          f          r.t          |          dk    rt	          | |||          S |d         }t          |          s |dk    s| j                            |           t          | t                    rHt          | j        t                    rt          | |||          S | j                            d          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   T)future_stackz'index must be a MultiIndex to unstack, z was passedr   r(   r9   r)   r   r   )r   r^   r>   rZ   r  r   r'   r;   r   r   _unstack_frameTstackr   typer   rz   _unstack_extension_seriesr&   _constructor_expanddimr   _values)r  r(   r   r)   	unstackers        r5   r   r     s   %%'' u::?? %S%JTRRRR!HEe +U.?%?%?	##E***#y!! 
ci,, 	2!#u$OOOO5;;D;111	:.. 
 Rd39ooRRR
 
 	
 sy)) 	P,S%$OOOOIU0JQU
 
 
	 ##Kt
 $ 
 
 	
r7   r   r+   c                6   t          | j        t                    sJ t          | j        || j        |          }| j        s8| j                            ||          }|                     ||j	                  S |
                    | j        | j        |          S )Nr  r   )axesr  )r   r'   r   r&   _constructor_can_fast_transpose_mgrr   _constructor_from_mgrr  r   r  r   )r  r(   r   r)   r  mgrs         r5   r  r    s     ci,,,,,	C,<4  I " 
hyZ@@((38(<<<##Ks{z $ 
 
 	
r7   seriesr   c                    |                                  }|                    |||          }|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)r"  r(   r   r)   dfr
  s         r5   r  r    sJ    8 
		BZZe
ZFFF ^77<<FNMr7   r.   framedropnac                   d }| j         \  }| j                            |          }t          | j        t                    rt          | |||          S t          | j        t                    rt          | j        j                  }fd| j        j	        D             } || j                  \  }	}
|
                    |	           |
                    t          j        |
|                                                     t          | j        j                  }|
                    | j        j                   t	          |||d          }nt!          t#          || j        | j        f           \  }\  }}
|                              t          j        |
|                                          f}t	          ||| j        j        | j        j        gd          }| j        s| j        rt          | j        j                  }|d         }t          |t.                    rW|                                }|                    d |                                 D                       }t7          ||          }n3| j                                        }n| j                                        }|rt9          |          }||         }||         }|                     ||          S )	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 rX   )	is_uniquerH   r   rZ   r   )r'   r<   
categoriess      r5   stack_factorizezstack.<locals>.stack_factorizeM  sD    ? 	0")CJJ////3E::z5  r7   )	level_numr(  r)   c                :    g | ]}|                               S r1   r   )r3   r   Ks     r5   r6   zstack.<locals>.<listcomp>^  s#    @@@sSZZ]]@@@r7   Fr   r   c                "    g | ]\  }}|j         S r1   )r  )r3   rt   cols      r5   r6   zstack.<locals>.<listcomp>}  s    999C999r7   r'   )r   r   r;   r   r   _stack_multi_columnsr'   r>   r?   r<   r   rH   r   ravelrA   r   zipmapr   r   _is_homogeneous_typedtypesr  r   r   _concat_same_typeitems"_reorder_for_extension_array_stackr   _constructor_sliced)r'  r(   r(  r)   r-  Nr.  r   r   clevclabr   r   r?   ilabr<   r:  rz   arrr   r   r1  s                        @r5   r  r  C  s   ! ! ! ;DAq //66I%-,, 
#YvD
 
 
 	
 
EK	,	, 
%+,--
@@@@ek.?@@@	$_U]33
d$q))//11222*++	+,,,YiRW
 
 
		  #C%+u}9U$V$VWtAa 0 0 6 6 8 88;#U]%78"	
 
 
	 ; +55 + el*++q	e^,, 	/,,..C..995;;==999 J <J1MMJJ ,,..JJ ]((**
 $Z  %
dO	$$Zy$AAAr7   c                \    t           fd|D                       r }|D ]t          |||          }nst          d |D                       rK } fd|D             }|r8|                    d          t          |||          }fd|D             }|8nt          d          |S )Nc              3  4   K   | ]}|j         j        v V  d S rX   )r   rA   r3   r   r'  s     r5   r]   z!stack_multiple.<locals>.<genexpr>  s-      
7
7#3%-%%
7
7
7
7
7
7r7   )r(  r)   c              3  @   K   | ]}t          |t                    V  d S rX   )r   int)r3   r   s     r5   r]   z!stack_multiple.<locals>.<genexpr>  s,      33cZS!!333333r7   c                D    g | ]}j                             |          S r1   )r   r;   rF  s     r5   r6   z"stack_multiple.<locals>.<listcomp>  s)    GGG#0055GGGr7   r   c                *    g | ]}|k    r|n|d z
  S r   r1   )r3   r_   r   s     r5   r6   z"stack_multiple.<locals>.<listcomp>  s)    ===!!s((QQA===r7   zTlevel should contain all level names or all level numbers, not a mixture of the two.)r   r  rC   r   )r'  r(   r(  r)   r
  r   s   `    @r5   stack_multiplerK    s    
7
7
7
7
7
7
777 
 	B 	BC63vDAAAFF	B 
33U333	3	3 
  HGGGGGG 	>))A,,C63vDAAAF >===u===E  	> 1
 
 	

 Mr7   r   r   c                   t          | j                  dk    r,| j        d                             | j        d                   S d t	          | j        dd         | j        dd                   D             }t	          | }d t          j        |          D             }t	          | }t          j	        d t	          || j                  D             | j        dd         	          S )
zBCreates a MultiIndex from the first N-1 levels of this MultiIndex.r   r   r   c                2    g | ]\  }fd |D             S )c                0    g | ]}|d k    r|         ndS )r   Nr1   )r3   cr   s     r5   r6   z8_stack_multi_column_index.<locals>.<listcomp>.<listcomp>  s)    333166Qt333r7   r1   )r3   r<   r   s     @r5   r6   z-_stack_multi_column_index.<locals>.<listcomp>  sA       C 	4333U333  r7   Nr.   c              3      K   | ]	\  }}|V  
d S rX   r1   )r3   keyrt   s      r5   r]   z,_stack_multi_column_index.<locals>.<genexpr>  s&      AAVS!SAAAAAAr7   c                L    g | ]!\  }}d |vrt          ||j                  n|"S )Nry   )r   rz   )r3   new_levr   s      r5   r6   z-_stack_multi_column_index.<locals>.<listcomp>  sL     	
 	
 	
  047/B/BE'++++	
 	
 	
r7   r   )
rZ   r?   r   rA   r7  r<   	itertoolsgroupbyr   from_arrays)r   r`   tuplesunique_tuplesnew_levss        r5   _stack_multi_column_indexrZ    s   
7>a~a ((gmA.>(??? gnSbS17="3EFF  D $ZFAAy'8'@'@AAAMM"H !	
 	
 !$Hgn = =	
 	
 	

 mCRC    r7   r.  rH  c                
  $% dd}|                      d          }|j        }t          |t                    sJ ||j        dz
  k    rW|}t          ||j        dz
            D ]3} |||          }	 ||dz   |          }
|                    |	|
          }4|x|_        }|                                s,|r* |d	|          }|                    |d
          }|j        }t          t          |          }t          |          }i }|j        d         }t          |j        d                   }|rt          j        |          }|                    t#          |          d           }t          j        ||          }t#          |          %g }|D ]}	 |j                            |          }n%# t(          $ r |                    |           Y @w xY wt          |t,                    st#          |          }n|j        |j        z
  }|%k    rb|j        d d |j        |         f         }|                    |j        j        d                   |_        |                    |          j        }n|j        d d |f         }t;          |j                                                  $t          $t@                    r$!                                "                    $fd|#                                D                       }|j$        \  }}t          j%        ||z            &                    ||          j'        (                                }|                    |          }n|j        }|j)        dk    r|(                                }|||<    t#          |          d	k    r|*                    |          }t#          |          }t          |j+        t                    rKtY          |j+        j                  }tY          |j+        j-                  }%fd|j+        j        D             }n=t]          |j+                  \  }} | g}|/                    %          g}|j+        j0        g}|                    |           |                    t          j1        ||                     |                    | j        j-        |                    t          |||d          }!| 2                    ||!|          }"| j        j        dk    rO| j        3                    |g                                          }#|"j        4                    |#          s|"|#         }"|r|"5                    d	d          }"|"S )Nr.  rH  r   r   c                2    | |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`.
        r   )r.  r   s     r5   _convert_level_numberz3_stack_multi_columns.<locals>._convert_level_number  s$     %%=++r7   Fr   r/   r   )r(   rq   r.   )r   c                N    g | ]!\  }}|j                             d           "S )Fr   )r  r   )r3   rt   r\   rz   s      r5   r6   z(_stack_multi_columns.<locals>.<listcomp>  s2    TTTTQQY%%e%%88TTTr7   c                :    g | ]}|                               S r1   r0  )r3   r   levsizes     r5   r6   z(_stack_multi_columns.<locals>.<listcomp>2  s%    EEESSZZ((EEEr7   r   )r'   r   r   )rq   how)r.  rH  r   r   )6r   r   r   r   r   r   	swaplevel_is_lexsorted
sort_indexr   rZ  r?   r   r<   rH   r)   r   rZ   rG   get_locKeyErrorr   slicestopstartlocreindexrn   ilocr	   r:  tolistr   r   r;  r<  r   r   r   r  r6  r   
differencer'   r>   rA   r   r   r   r   r  r%  equalsr(  )&r'  r.  r(  r)   r]  thismi_colsroll_columnsr   lev1lev2level_to_sortr  new_data
level_valsr   level_vals_nanlevel_vals_used	drop_colsrQ  rj  	slice_lenchunkvalue_slicesubsetr?  r1  idxr   r   r   	old_codes
old_levelsr   r
  desired_columnsrz   r`  s&                                       @@r5   r5  r5    sm       ::5:!!DlGgz***** GOa'''y'/A"566 	> 	>A((L99D((Q==D'11$==LL!--w  "" t  .-a99];;,:w''G+G44K H#Jr*++K +gk**&&s:==Ngnk::O+GI '$ '$	,&&s++CC 	 	 	S!!!H	 #u%% 	-CII39,IHQQQS 112E*//0CB0GHHEM---@@GKKYqqq#v&F$V]%9%9%;%;<<E%00 
, $88::LLTTTTV\\^^TTT  |1iA&&..q!446<<>>)..s33$ma%++--K#
9~~!,,Y77D		A$*j)) &$*+,,
)**	EEEEDJ4DEEE		 7
 C C	: \
%%g../	Z_%	j!!!RW[!,,---U](3444)e  I 	;OOF}q  -;;YKHHOOQQ~$$_55 	-O,F  2A511Ms   F--GGrC  r#   n_rows	n_columnsc                    t          j        ||z                                ||          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')
    )rH   r   r   r  r6  rG   )rC  r  r  r  s       r5   r=  r=  P  sH    B )FY&
'
'
/
/	6
B
B
D
J
J
L
LC88C==r7   r(   	list[int]c                0     j                                         t           j                   k    rt          d          t	          d          } j                             fdt           j         j                  D             d d d                   }t                    dk    r*t          j	                  }|
                    |          }n|}|                                }|                                }g }|D ]/}	t           j                   dk    r                                 }
nit                    dk    r|	f}	t          |	          t          fdt           j         j                  D                       } j        d d |f         }
t                     j         j        k     r |
j                             |          |
_         nD|j        dk    r9|
j        dk    rd|
_        n&t%          t          |
j                             |
_         |                    |
           1t          |          dk    r6 j        s/t+          |          }t          |          t                     z  }njt                     j         j        k     r- j                             |                                          }ndg}t-          | j        j        	          }d}t                     j         j        k     rN j                             |                                          }|j                             |          s||         }t5           j        t8                    r; j        j        }t=          t          j         j        j         d|f                    }n@tC           j        d
          \  }}|g}t=          t          j        |d|f                    }t5          |t8                    r!|j        }|"                                j         }n-|                                g}tC          |d
          d         g} fd|D             }t9          ||z   ||z    j        j#        t=          |j#                  z   d
          |_        t                     }t          |          }t          j$        |          }t          j        ||z  |          t          j%        t          j$        |          |          z   }|&                    |          }|j        dk    r\ j         j        t                    k    r?t          |j                   dk    rtO          |j                  }n|j(        d d df         }|j        dk    rd |_        |S )Nz8Columns with duplicate values are not supported in stackT)reversec                    g | ]}|v|	S r1   r1   )r3   kr(   s     r5   r6   zstack_v3.<locals>.<listcomp>|  s    CCCqAUNNNNNr7   r.   r/   c              3  \   K   | ]&}|v rt                    nt          d           V  'd S rX   )nextrg  )r3   r  genr(   s     r5   r]   zstack_v3.<locals>.<genexpr>  sO       # # %ZZS			U4[[# # # # # #r7   r   )r   rz   F)use_na_sentinelc                T    g | ]$}t          j        |t                              %S r1   )rH   r   rZ   )r3   r<   r'  s     r5   r6   zstack_v3.<locals>.<listcomp>  s+    KKKUBIeSZZ00KKKr7   r   r   r4  ))r   nuniquerZ   r   sortedr%  r   r   rH   argsort_reorder_ilevelsr   r   iterr^   rj  r   r   r   r   r   r   r   r  rz   ro  r   r'   r   r?   r>   r   r<   r   drop_duplicatesrA   r   r   rG   r   rl  )r'  r(   drop_levnums
stack_colssorterordered_stack_colsstack_cols_uniqueordered_stack_cols_uniquebufr  r   column_indexerr
  ratior  r  index_levelsindex_codesr<   uniquescolumn_levelscolumn_codeslen_df	n_uniquesrf   idxsr  s   ``                        @r5   stack_v3r  u  s?   }#em"4"444STTT %...L22CCCCE%-/00CCCDDbDI J 5zzA~~E""'88@@'"))++ 2 9 9 ; ; C   u}""::<<DD 5zzQfs))C" # # # # #u}455# # #  N 9QQQ./Du::---<;;LIIDLL1$$yA~~		)#dl*;*;<<

4 3xx!||EK|Fs5zz) u::----;;LIIPPRRKK#K;em6IJJJ
5zzEM)))-;;LIIPPRR~$$_55 	-O,F
 %+z** 7{)275;#4q%jAABB"5;FFFwy2751e*5566*j)) X*1)99;;A+22445!";USSSTUVWKKKKlKKKLm+L(k$'9'?"@"@@	  FL ZZF-..Ii	""G76G#V,,ry69J9JI/V/VVD[[F {aEM1SZZ??v~!##&,///FF[A&F{aMr7   )NT)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*   )TT)r   r   r+   r   )
r'  r   r.  rH  r(  r*   r)   r*   r+   r   )rC  r#   r  rH  r  rH  r+   r#   )r'  r   r(   r  r+   r   )L
__future__r   rT  typingr   r   rL   numpyrH   pandas._libs.reshape_libsr   r   pandas.errorsr   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   pandas.core.algorithmscore
algorithmsrr   r   r   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  rK  rZ  r5  r=  r  r1   r7   r5   <module>r     s   " " " " " "                 ) ) ) ) ) ) ) ) ) , , , , , , 2 2 2 2 2 2 4 4 4 4 4 4                   5 4 4 4 4 4 , , , , , , & & & & & & & & &        C B B B B B C C C C C C ' ' ' ' ' '         
 . - - - - - % % % % % %               6          211111555555K
 K
 K
 K
 K
 K
 K
 K
^
 DHX X X X Xv!
 !
 !
 !
 !
J :>
 
 
 
 
"" " " "JJB JB JB JB JBZ    B   8 NRA A A A AH" " " "Jh h h h h hr7   