
    i0;                       d dl mZ d dlmZmZ d dl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Z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 d dl m!Z!m"Z" d dl#m$Z$m%Z% er"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 m0Z0m1Z1 	 	 	 	 	 	 	 	 ddZ2	 	 	 	 	 	 	 	 d dZ3d!dZ4	 	 	 	 	 	 d"dZ5	 	 	 	 d#dZ6	 	 	 	 	 	 	 	 	 	 d$dZ7 G d d      Z8d%dZ9d&dZ:d'dZ;d(dZ<y))    )annotations)TYPE_CHECKINGcastN)NaTalgos	internalslib)NA)cache_readonly)ensure_dtype_can_hold_nafind_common_type)is_1d_only_ea_dtypeneeds_i8_conversion)concat_compat)ExtensionDtypeis_valid_na_for_dtype)ensure_wrapped_if_datetimelike)ensure_block_shapenew_block_2d)BlockManagermake_na_array)	GeneratorSequence)	ArrayLikeAxisIntDtypeObjShape)Index)BlockBlockPlacementc                   |xr |dk(  }|dk(  r"t        || |      }|d   j                  ||      S t        |       dkD  r| d   d   j                  dkD  r| d   d   j                  d   j
                  t        j                  t        j                  fv rNt        fd| D              r:t        |       dkD  r,t        d |D              }t        | |      }t        |f|      S t        || |      }t        |      dk(  r |d   }|j                  d      }	||	_        |	S g }
t        |      D ]  \  }}|d   }|j                   }t#        |      r|D cg c]  }|j                   j$                   }}|j&                  st        j(                  |d      }n>t+        |j
                        rt-        |dd	      }t/        |d
      }nt-        |d      }t1        |      }|j$                  j
                  |j
                  k(  }nt3        ||      }d}|r|j5                  ||      }nt7        ||      }|
j9                  |        t        t        |
      |      S c c}w )z
    Concatenate block managers into one.

    Parameters
    ----------
    mgrs_indexers : list of (BlockManager, {axis: indexer,...}) tuples
    axes : list of Index
    concat_axis : int
    copy : bool

    Returns
    -------
    BlockManager
    r   c              3  <   K   | ]  \  }}t        |        y wN)_is_homogeneous_mgr).0mgr_first_dtypes      Y/app/cer_product_mecsu/.venv/lib/python3.12/site-packages/pandas/core/internals/concat.py	<genexpr>z'concatenate_managers.<locals>.<genexpr>b   s     Vfc1'[9Vs      c              3  2   K   | ]  }t        |        y wr$   )len)r&   xs     r*   r+   z'concatenate_managers.<locals>.<genexpr>g   s     3c!f3s   FdeepaxisTr3   ea_compat_axis   )ndim)copy)	placement)_maybe_reindex_columns_na_proxyconcat_horizontalr.   nblocksblocksdtypenpfloat64float32alltuple_concat_homogeneous_fastpathr   r8   axes_get_combined_planblock_is_uniform_join_unitsvaluesis_extensionconcatenater   r   r   r   _concatenate_join_unitsmake_block_same_classr   append)mgrs_indexersrE   concat_axisr8   
needs_copymgrsshapenbr'   outr=   r9   
join_unitsunitblkjuvalsrI   fastpathbr)   s                       @r*   concatenate_managersr]   =   sF   $ *+*J a.t]JOAw((t44
=A-"21"5"="="A#A&q)003992::rzz22
 VVV&* 3d331-T#RE400*4
KD
4yA~1ghhEh"
F "4D!9 #	:!}jj!*-.89BHHOO9D9## 15$SYY/&t!DI+F;&t!43F;Fzz''6<<7H,ZdCFH))&I)FAVy9AaG#J ft,,A :s   Ic           
         g }|D ]^  \  }}|j                         D ]  \  }}|j                  | |   ||ddd      }! |r|s|j                  d      }|j                  |       ` |S )z
    Reindex along columns so that all of the BlockManagers being concatenated
    have matching columns.

    Columns added in this reindexing have dtype=np.void, indicating they
    should be ignored when choosing a column's final dtype.
    T)r3   
only_slice
allow_dupsuse_na_proxyr0   )itemsreindex_indexerr8   rN   )rE   rO   rQ   new_mgrsr'   indexersiindexers           r*   r:   r:      s     H& X #..* 	JAw%%Q! & C	 h(((%C  O    c                    | j                   dk7  ry| j                  d   }|j                  j                  r#|j                  j                  j
                  dk(  sy|j                  |k(  S )zC
    Check if this Manager can be treated as a single ndarray.
    r,   Fr   )r<   r=   mgr_locsis_slice_likeas_slicestepr>   )r'   r)   rX   s      r*   r%   r%      sV     {{a
**Q-CLL&&3<<+@+@+E+E+J99##rh   c           	        t        d | D              r| D cg c](  \  }}|j                  d   j                  j                  * }}}t	        j
                  |      j                  }t        j                  t        |d               }t        ||      }|S t	        j                  ||      }|t        j                  k(  rt        j                  }	nt        j                  }	d}
| D ]r  \  }}|j                  d   }|
|z   }d|v r. |	|j                  d   j                  |d   |dd|
|f          n"|j                  d   j                  |dd|
|f<   |
|z  }
t t        j                  t        |d               }t        ||      }|S c c}}w )zl
    With single-Block managers with homogeneous dtypes (that can already hold nan),
    we avoid [...]
    c              3  (   K   | ]
  \  }}|   y wr$    )r&   r(   re   s      r*   r+   z/_concat_homogeneous_fastpath.<locals>.<genexpr>   s     
9KAxx<
9s   r   )r>   r,   N)rB   r=   rI   Tr?   rK   libinternalsr!   slicer   emptyr@   libalgostake_2d_axis0_float64_float64take_2d_axis0_float32_float32rS   )rO   rS   r)   r'   r(   arrsarrbprT   	take_funcstartre   mgr_lenends                 r*   rD   rD      so    
9=
995BC63

1$$&&CCnnT"$$((uQx9#r"	
((5
,Cbjj ::	::	E& X))A,go=

1$$AuSyL! !$

1 4 4C59  
	$	$U58_	5B	c2	BIA Ds   -F	c              #  @  K   | d   j                   d   }| D cg c]  }|j                   }}t        j                  |      }|D ]P  \  }}g }t	        |       D ]5  \  }}||   }	t        |||	|      }
t        |
      }|j                  |       7 ||f R y c c}w w)Nr   )max_len)rS   blknosrr   get_concat_blkno_indexers	enumerate_get_block_for_concat_planJoinUnitrN   )rR   r   r'   blknos_listpairsr   rz   units_for_bpkblknorT   rW   s               r*   rF   rF      s      1gmmAG)-.#3::.K.22;?E 
 o 	&FAs1IE+CUGLBB<D%	& , /s   BBA2Bc                  | j                   |   }t        |      t        |j                        k(  r=|j                  j                  r'|j                  j                  j
                  dk(  r|}|S | j                  |j                     }t        j                  ||      }t        |t              r|j                  |      }|S |j                  |      }|S )Nr,   )r=   r.   rj   rk   rl   rm   blklocsrg   r	   maybe_indices_to_slice
isinstancers   slice_block_columnstake_block_columns)r'   rz   r   r   rX   rT   ax0_blk_indexerslcs           r*   r   r     s     **U
C 2w#cll##""s||'<'<'A'AQ'F I ++bjj1(('B c5!((-B
 I '',B Irh   c                  >    e Zd ZddZddZd	dZed
d       ZddZy)r   c                    || _         y r$   )rG   )selfrG   s     r*   __init__zJoinUnit.__init__.  s	    
rh   c                L    t        |       j                   d| j                  dS )N())type__name__rG   )r   s    r*   __repr__zJoinUnit.__repr__1  s$    t*%%&a

~Q77rh   c                x   | j                   sy| j                  }|j                  j                  dk(  ry|j                  t        k(  r0|j
                  }t        fd|j                  d      D              S |j                  }|t        u r|j                  k7  ry|t        u rt              ryt        |      S )z
        Check that we are all-NA of a type/dtype that is compatible with this dtype.
        Augments `self.is_na` with an additional check of the type of NA values.
        FVTc              3  6   K   | ]  }t        |        y wr$   r   )r&   r/   r>   s     r*   r+   z,JoinUnit._is_valid_na_for.<locals>.<genexpr>B  s     X1,Q6Xs   K)order)is_narG   r>   kindobjectrI   rB   ravel
fill_valuer   r
   r   r   )r   r>   rX   rI   na_values    `   r*   _is_valid_na_forzJoinUnit._is_valid_na_for4  s    
 zzjj99>>S 99ZZFXSV@WXXX>>s?syyE1 r>1%8  %Xu55rh   c                P    | j                   }|j                  j                  dk(  ryy)Nr   TFrG   r>   r   )r   rX   s     r*   r   zJoinUnit.is_naT  s!    jj99>>S rh   c                   |9| j                   j                  j                  dk7  r| j                   j                  S |}| j	                  |      r| j                   j                  }|t        j                  d      k(  rAt        t
        j                  | j                   j                        }|j                  r|d   d }t        || j                   j                  |      S | j                   j                  S )Nr   r   )r   r   )rG   r>   r   rI   r   r?   r   ndarraysizer   rS   )r   empty_dtypeupcasted_nar   	blk_dtyperI   s         r*   get_reindexed_valueszJoinUnit.get_reindexed_values[  s     4::#3#3#8#8C#?::$$$$J$$[1 JJ,,	 22 ""**djj.?.?@F{{vd|';%)
$[$**2B2BJOO::$$$rh   N)rG   r    returnNone)r   str)r>   r   r   bool)r   r   )r   r   r   r   )	r   
__module____qualname__r   r   r   r   r   r   rp   rh   r*   r   r   -  s+    86@  %rh   r   c                |   t        |       }t        d | D              }t        ||      }| D cg c]  }|j                  ||       }}t        d |D              rI|D cg c]"  }t	        |j
                        r|n|dddf   $ }}t        |dd      }t        |d      }|S t        |d	
      }|S c c}w c c}w )zB
    Concatenate values from several join units along axis=1.
    c              3  b   K   | ]'  }|j                   j                  j                  d k(   ) ywr   Nr   r&   rW   s     r*   r+   z*_concatenate_join_units.<locals>.<genexpr>{  %     N4$****//36N   -/)r   r   c              3  F   K   | ]  }t        |j                          y wr$   )r   r>   )r&   ts     r*   r+   z*_concatenate_join_units.<locals>.<genexpr>  s     
;Aqww'
;s   !r   NTr4   r6   r,   r2   )_get_empty_dtypeany_dtype_to_na_valuer   r   r>   r   r   )	rV   r8   r   has_none_blocksr   rY   	to_concatr   concat_valuess	            r*   rL   rL   u  s     #:.KN:NNO$[/BK  	K[QI 
 
;
;; 
 %QWW-A1QT7:
	 
 &iaM*=!<
  &ia8)
s   B4 'B9c                b   t        | t              r| j                  S | j                  dv r| j	                  d      S | j                  dv r| j	                  d      S | j                  dk(  ry| j                  dv r|syt
        j                  S | j                  dk(  rt
        j                  S t        )	z2
    Find the NA value to go with this dtype.
    mMr   fcNaNr\   NiuO)r   r   r   r   r   r?   nanNotImplementedError)r>   r   s     r*   r   r     s     %(~~	t	zz%  	t	zz%  	s		t	vv	s	vv
rh   c                r   t        j                  | D cg c]  }|j                  j                   c}      r| d   j                  j                  }|S t	        d | D              }| D cg c]%  }|j
                  r|j                  j                  ' }}t        |      }|rt        |      }|S c c}w c c}w )z
    Return dtype and N/A values to use when concatenating specified units.

    Returned N/A value may be None which means there was no casting involved.

    Returns
    -------
    dtype
    r   c              3  b   K   | ]'  }|j                   j                  j                  d k(   ) ywr   r   r   s     r*   r+   z#_get_empty_dtype.<locals>.<genexpr>  r   r   )r	   dtypes_all_equalrG   r>   r   r   r   r   )rV   rY   r   r   rW   dtypesr>   s          r*   r   r     s     jARXX^^AB m))//N:NNO+5H4TZZdjjHFHV$E(/L B Is   B/)B4;B4c                    | d   j                   j                  j                  dk(  ryt        fd| D              xr( t        fd| D              xr t        d | D              S )z
    Check if the join units consist of blocks of uniform type that can
    be concatenated using Block.concat_same_type instead of the generic
    _concatenate_join_units (which uses `concat_compat`).

    r   r   Fc              3  ^   K   | ]$  }t        |j                        t              u  & y wr$   )r   rG   r&   rY   firsts     r*   r+   z)_is_uniform_join_units.<locals>.<genexpr>  s"     ?bDNd5k)?s   *-c              3     K   | ]K  }|j                   j                  j                  k(  xs" |j                   j                  j                  d v  M yw)iubNr   r   s     r*   r+   z)_is_uniform_join_units.<locals>.<genexpr>  sN      

 	 HHNNekk) , xx~~""e+,
s   AAc              3  f   K   | ])  }|j                    xs |j                  j                   + y wr$   )r   rG   rJ   )r&   rY   s     r*   r+   z)_is_uniform_join_units.<locals>.<genexpr>  s(     GbL1BHH111Gs   /1)rG   r>   r   rB   )rV   r   s    @r*   rH   rH     ss     qME{{3 	?J?? 	H 	 

 !
 	
	H 	GJGGrh   )rE   list[Index]rP   r   r8   r   r   r   )rE   r   rO   z0list[tuple[BlockManager, dict[int, np.ndarray]]]rQ   r   r   list[BlockManager])r'   r   r)   r   r   r   )rS   r   r)   znp.dtyper   r    )rR   r   r   z0Generator[tuple[BlockPlacement, list[JoinUnit]]])
r'   r   rz   r!   r   intr   r   r   r    )rV   list[JoinUnit]r8   r   r   r   )r>   r   r   r   )rV   zSequence[JoinUnit]r   r   )rV   r   r   r   )=
__future__r   typingr   r   numpyr?   pandas._libsr   r   ru   r   rr   r	   pandas._libs.missingr
   pandas.util._decoratorsr   pandas.core.dtypes.castr   r   pandas.core.dtypes.commonr   r   pandas.core.dtypes.concatr   pandas.core.dtypes.dtypesr   pandas.core.dtypes.missingr   pandas.core.constructionr   pandas.core.internals.blocksr   r   pandas.core.internals.managersr   r   collections.abcr   r   pandas._typingr   r   r   r   pandasr   r    r!   r]   r:   r%   rD   rF   r   r   rL   r   r   rH   rp   rh   r*   <module>r      s@   "
   $ 2 4 4 < C
 
  ^-$^-3:^-BF^-^-B
C  	B
$,,.6,
,^
5,	)25CF
8E% E%P@.2rh   