o
    ŀgJ                     @  s  d dl mZ d dlmZmZ d dl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 d dlmZmZ d d	lmZmZmZ d d
lmZ d dlmZm Z  d dl!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. erd dl/m0Z0 d dl1m2Z2m3Z3m4Z4m5Z5m6Z6 d dl7m8Z8 d dl)m9Z9m:Z: dPddZ;dQd!d"Z<dRd'd(Z=dSd-d.Z>dTd3d4Z?dUd6d7Z@dVd=d>ZAG d?d@ d@ZBdWdDdEZCdXdHdIZDdYdLdMZEdZdNdOZFdS )[    )annotations)TYPE_CHECKINGcastN)NaTalgos	internalslib)NA)cache_readonly)find_stack_level)ensure_dtype_can_hold_nafind_common_type)is_1d_only_ea_dtype	is_scalarneeds_i8_conversion)concat_compat)ExtensionDtypeSparseDtype)is_valid_na_for_dtypeisnaisna_all)ensure_wrapped_if_datetimelike)ArrayManager)ensure_block_shapenew_block_2d)BlockManagermake_na_array)Sequence)	ArrayLikeAxisIntDtypeObj	Manager2DShape)Index)BlockBlockPlacementmgrslist[ArrayManager]axeslist[Index]concat_axisr   returnr!   c                 C  s4   |dkr| d  | |S |dksJ | d | |S )z
    Concatenate array managers into one.

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

    Returns
    -------
    ArrayManager
       r   )concat_verticalconcat_horizontal)r&   r(   r*    r/   P/var/www/html/myenv/lib/python3.10/site-packages/pandas/core/internals/concat.py_concatenate_array_managersF   s   r1   copyboolc                   s  |o|dk}t | d d trt|| |}t|||S |dkr-t|| |}|d ||S t| dkrt| d d jdkrt| d d jd j  t	j
t	jfv rtt fdd| D rtt| dkrttdd |D }t| | }t|f|S t|| |}t|dkr|d }|jdd}	||	_|	S t|}
g }|
D ]c\}}|d }|j}t|rdd	 |D }|jst	j|dd
}nt|jrt|ddd}t|dd}nt|dd
}t|}|jj|jk}nt||d}d}|r|j||d}nt||d}|| qtt||S )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  s    | ]
\}}t | V  qd S N)_is_homogeneous_mgr.0mgr_first_dtyper/   r0   	<genexpr>       z'concatenate_managers.<locals>.<genexpr>r,   c                 s      | ]}t |V  qd S r4   )lenr7   xr/   r/   r0   r<          F)deepc                 S     g | ]}|j jqS r/   )blockvaluesr7   jur/   r/   r0   
<listcomp>       z(concatenate_managers.<locals>.<listcomp>axisTrL   ea_compat_axis   )ndim)r2   )	placement) 
isinstancer   _maybe_reindex_columns_na_proxyr1   r.   r?   nblocksblocksdtypenpfloat64float32alltuple_concat_homogeneous_fastpathr   r2   r(   _get_combined_planrE   _is_uniform_join_unitsis_extensionconcatenater   r   r   r   rF   _concatenate_join_unitsmake_block_same_classr   append)mgrs_indexersr(   r*   r2   
needs_copyr&   shapenbr8   outconcat_planrU   rQ   
join_unitsunitblkvalsrF   fastpathbr/   r:   r0   concatenate_managers^   s\   

rp   rd   0list[tuple[BlockManager, dict[int, np.ndarray]]]re   list[BlockManager]c                 C  sb   g }|D ]*\}}|  D ]\}}|j| | || |ddddd}q|r)|s)| }|| q|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.
    FT)rL   r2   
only_slice
allow_dupsuse_na_proxy)itemsreindex_indexerr2   rc   )r(   rd   re   new_mgrsr8   indexersiindexerr/   r/   r0   rS      s    	rS   r8   r   r;   r    c                 C  s<   | j dkrdS | jd }|jjr|jjjdksdS |j|kS )zC
    Check if this Manager can be treated as a single ndarray.
    r,   Fr   )rT   rU   mgr_locsis_slice_likeas_slicesteprV   )r8   r;   rl   r/   r/   r0   r5      s   


r5   rf   r"   np.dtyper$   c                 C  s  t dd | D r&dd | D }t|j}tt|d }t||}|S tj||d}|tj	kr6t
j}nt
j}d}| D ]8\}	}
|	jd }|| }d|
v rc||	jd j|
d |dd||f  n|	jd j|dd||f< ||7 }q=tt|d }t||}|S )	zl
    With single-Block managers with homogeneous dtypes (that can already hold nan),
    we avoid [...]
    c                 s  s    | ]\}}| V  qd S r4   r/   )r7   r9   ry   r/   r/   r0   r<         z/_concat_homogeneous_fastpath.<locals>.<genexpr>c                 S  s   g | ]\}}|j d  jjqS )r   )rU   rF   Tr6   r/   r/   r0   rI     s    z0_concat_homogeneous_fastpath.<locals>.<listcomp>r   rV   r,   N)rZ   rW   r`   r   libinternalsr%   slicer   emptyrX   libalgostake_2d_axis0_float64_float64take_2d_axis0_float32_float32rf   rU   rF   )rd   rf   r;   arrsarrbprg   	take_funcstartr8   ry   mgr_lenendr/   r/   r0   r\      s2   






r\   +list[tuple[BlockPlacement, list[JoinUnit]]]c                 C  s   g }| d j d }dd | D }t|}t|D ]-\}\}}g }t| D ]\}	}
||	 }t|
|||d}t|}|| q%|||f q|S )Nr   c                 S  s   g | ]}|j qS r/   )blknos)r7   r8   r/   r/   r0   rI   /  s    z&_get_combined_plan.<locals>.<listcomp>)max_len)rf   r   get_concat_blkno_indexers	enumerate_get_block_for_concat_planJoinUnitrc   )r&   planr   blknos_listpairsindr   r   units_for_bpkr8   blknorg   rk   r/   r/   r0   r]   (  s   
r]   r   r%   r   intr   c                C  sx   | j | }t|t|jkr|jjr|jjjdkr|}|S | j|j }t	||}t
|tr5||}|S ||}|S )Nr,   )rU   r?   r|   r}   r~   r   blklocsr{   r   maybe_indices_to_slicerR   r   slice_block_columnstake_block_columns)r8   r   r   r   rl   rg   ax0_blk_indexerslcr/   r/   r0   r   B  s   



r   c                   @  sP   e Zd ZdddZddd	ZdddZedddZedddZdddZ	dS )r   rE   r$   r+   Nonec                 C  s
   || _ d S r4   )rE   )selfrE   r/   r/   r0   __init___  s   
zJoinUnit.__init__strc                 C  s   t | j dt| j dS )N())type__name__reprrE   )r   r/   r/   r0   __repr__b  s   zJoinUnit.__repr__rV   r    r3   c                   s   | j sdS | j}|jjdkrdS |jtkr'|j}t fdd|jddD S |j}|t	u r5|j kr5dS |t
u r?t r?dS 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  s    | ]}t | V  qd S r4   )r   r@   r   r/   r0   r<   s  r   z,JoinUnit._is_valid_na_for.<locals>.<genexpr>K)order)is_narE   rV   kindobjectrF   rZ   ravel
fill_valuer   r	   r   r   )r   rV   rl   rF   na_valuer/   r   r0   _is_valid_na_fore  s   

zJoinUnit._is_valid_na_forc                 C  s   | j }|jjdkrdS |jsdS |j}|jdkrdS t|jtr"dS |jdkr9|d }t	|r3t
|s5dS t|S |d d }t	|rGt
|sIdS tdd |D S )Nr   TFr   r,   c                 s  r>   r4   )r   )r7   rowr/   r/   r0   r<     rB   z!JoinUnit.is_na.<locals>.<genexpr>)rE   rV   r   _can_hold_narF   sizerR   r   rP   r   r   r   rZ   )r   rl   rF   valr/   r/   r0   r     s&   

zJoinUnit.is_nac                 C  s   | j }|jjdkrdS dS )z{
        Will self.is_na be True after values.size == 0 deprecation and isna_all
        deprecation are enforced?
        r   TFrE   rV   r   )r   rl   r/   r/   r0   )is_na_after_size_and_isna_all_deprecation  s   z2JoinUnit.is_na_after_size_and_isna_all_deprecationempty_dtyper   c                 C  s   |d u r| j jjdkr| j jS |}| |r<| j j}|tdkr4ttj| j j}|jr4|d d u r4d }t	|| j j
|S | j jS )Nr   r   )r   r   )rE   rV   r   rF   r   rW   r   ndarrayr   r   rf   )r   r   upcasted_nar   	blk_dtyperF   r/   r/   r0   get_reindexed_values  s   
zJoinUnit.get_reindexed_valuesN)rE   r$   r+   r   )r+   r   )rV   r    r+   r3   )r+   r3   )r   r    r+   r   )
r   
__module____qualname__r   r   r   r
   r   r   r   r/   r/   r/   r0   r   ^  s    


 
r   rj   list[JoinUnit]r   c                   s   t | \ }tdd | D }t | fdd| D }tdd |D r;dd |D }t|ddd	}t|d
}nt|dd} |krS |jkrStjdtt	 d |S )zB
    Concatenate values from several join units along axis=1.
    c                 s      | ]
}|j jjd kV  qdS r   Nr   r7   rk   r/   r/   r0   r<     r=   z*_concatenate_join_units.<locals>.<genexpr>c                   s   g | ]	}|j  d qS )r   r   )r   rG   r   r/   r0   rI     s    z+_concatenate_join_units.<locals>.<listcomp>c                 s  s    | ]}t |jV  qd S r4   r   rV   r7   tr/   r/   r0   r<     r   c                 S  s*   g | ]}t |jr|n|d ddf qS )r   Nr   r   r/   r/   r0   rI     s    r   TrM   rO   r,   rK   a  The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.)
stacklevel)
_get_empty_dtypeany_dtype_to_na_valuer   r   rV   warningswarnFutureWarningr   )rj   r2   empty_dtype_futurehas_none_blocks	to_concatconcat_valuesr/   r   r0   ra     s*   

	ra   rV   r   c                 C  sr   t | tr| jS | jdv r| dS | jdv r| dS | jdkr#dS | jdv r/|s,dS tjS | jdkr7tjS t)	z2
    Find the NA value to go with this dtype.
    mMr   fcNaNro   NiuO)rR   r   r   r   r   rW   nanNotImplementedError)rV   r   r/   r/   r0   r     s   







r   Sequence[JoinUnit]tuple[DtypeObj, DtypeObj]c                 C  s   t dd | D r| d jj}||fS tdd | D }dd | D }t|s/dd | D }t|}|r9t|}|}t|t| krgdd | D }t|sUd	d | D }t|t|krgt|}|rgt|}||fS )
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
    c                 S  rD   r/   )rE   rV   rG   r/   r/   r0   rI     rJ   z$_get_empty_dtype.<locals>.<listcomp>r   c                 s  r   r   r   r   r/   r/   r0   r<     r=   z#_get_empty_dtype.<locals>.<genexpr>c                 S     g | ]	}|j s|jjqS r/   )r   rE   rV   r   r/   r/   r0   rI     s    c                 S  "   g | ]}|j jjd kr|j jqS r   r   r   r/   r/   r0   rI          c                 S  r   r/   )r   rE   rV   r   r/   r/   r0   rI   *  s    c                 S  r   r   r   r   r/   r/   r0   rI   0  r   )r   dtypes_all_equalrE   rV   r   r?   r   r   )rj   r   r   dtypesrV   dtype_futuredtypes_futurer/   r/   r0   r     s4   
r   c                   sX   | d j   jjdkrdS t fdd| D o+t fdd| D o+td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  s"    | ]}t |jt  u V  qd S r4   )r   rE   rG   firstr/   r0   r<   H  s     z)_is_uniform_join_units.<locals>.<genexpr>c                 3  s,    | ]}|j j jkp|j jjd v V  qdS )iubNr   rG   r   r/   r0   r<   K  s    
c                 s  s     | ]}|j  p|jjV  qd S r4   )r   rE   r_   rG   r/   r/   r0   r<   U  s    )rE   rV   r   rZ   )rj   r/   r   r0   r^   <  s   
r^   )r&   r'   r(   r)   r*   r   r+   r!   )r(   r)   r*   r   r2   r3   r+   r!   )r(   r)   rd   rq   re   r3   r+   rr   )r8   r   r;   r    r+   r3   )rf   r"   r;   r   r+   r$   )r&   rr   r+   r   )
r8   r   r   r%   r   r   r   r   r+   r$   )rj   r   r2   r3   r+   r   )rV   r    r   r3   )rj   r   r+   r   )rj   r   r+   r3   )G
__future__r   typingr   r   r   numpyrW   pandas._libsr   r   r   r   r   r   pandas._libs.missingr	   pandas.util._decoratorsr
   pandas.util._exceptionsr   pandas.core.dtypes.castr   r   pandas.core.dtypes.commonr   r   r   pandas.core.dtypes.concatr   pandas.core.dtypes.dtypesr   r   pandas.core.dtypes.missingr   r   r   pandas.core.constructionr   #pandas.core.internals.array_managerr   pandas.core.internals.blocksr   r   pandas.core.internals.managersr   r   collections.abcr   pandas._typingr   r   r    r!   r"   pandasr#   r$   r%   r1   rp   rS   r5   r\   r]   r   r   ra   r   r   r^   r/   r/   r/   r0   <module>   sD    


l
"

/

k
.
.