U
    f/e`                     @  s   d Z ddlmZ ddlmZmZ ddlmZmZ ddl	Z	ddl
ZddlmZ ddlmZ ddlmZmZ dd	lmZ ddlm  mZ dd
lmZ erddlmZ ddddZddddddZddddZdd Z e dd Z!dd Z"dd  Z#dS )!z!
Core eval alignment algorithms.
    )annotations)partialwraps)TYPE_CHECKINGSequenceN)FrameOrSeries)PerformanceWarning)ABCDataFrame	ABCSeries)PandasObject)result_type_many)Indexz=tuple[partial | type[FrameOrSeries], dict[str, Index] | None])returnc                 C  sR   d }t | jtjr&ttj| jjd}n$t| j}t| jdrJt	|| jj
}||fS )N)dtypeaxes)
isinstancevaluenpndarrayr   Z
asanyarrayr   typehasattr_zip_axes_from_typer   )termr   typ r   A/tmp/pip-unpacked-wheel-tiezk1ph/pandas/core/computation/align.py_align_core_single_unary_op"   s    
r   ztype[FrameOrSeries]zSequence[Index]zdict[str, Index])r   new_axesr   c                   s    fddt | jD S )Nc                   s   i | ]\}}| | qS r   r   ).0inamer   r   r   
<dictcomp>6   s      z'_zip_axes_from_type.<locals>.<dictcomp>)	enumerateZ_AXIS_ORDERS)r   r   r   r!   r   r   3   s    r   boolc                 C  s   t dd | D S )zB
    Check a sequence of terms for instances of PandasObject.
    c                 s  s   | ]}t |jtV  qd S N)r   r   r   r   r   r   r   r   	<genexpr>=   s     z&_any_pandas_objects.<locals>.<genexpr>)anytermsr   r   r   _any_pandas_objects9   s    r+   c                   s   t   fdd}|S )Nc                   sB   t | dkrt| d S dd | D }t| s:t| d fS  | S )N   r   c                 s  s   | ]}|j V  qd S r%   r   r&   r   r   r   r'   G   s     z9_filter_special_cases.<locals>.wrapper.<locals>.<genexpr>)lenr   r+   r   )r*   Zterm_valuesfr   r   wrapperA   s    z&_filter_special_cases.<locals>.wrapper)r   )r0   r1   r   r/   r   _filter_special_cases@   s    r2   c              	     s  dd t  D } fdd|D }ddlm} |tt||} |  j}|j}|j}t	|}|dk}	 fdd|D D ]n}
t
|
t}|o|	}t |
jD ]L\}}|r|d |
j }}n
|| }}|| |s|| j|d	d
||< qq~| D ]\}}tt||D ]\}} | j}t|drt
|to>|dk}|rR||d  n|}t	|j| }t	|}ttdt|| }|dkr|dkrd| dt | j d|dd}tj|tdd t|j||dd} | |  q |  | jj q|t||fS )Nc                 S  s    g | ]\}}t |jd r|qS )r   )r   r   )r   r   r   r   r   r   
<listcomp>T   s      z_align_core.<locals>.<listcomp>c                   s   g | ]} | j jqS r   )r   ndimr   r   r)   r   r   r3   U   s     r   )Seriesr,   c                 3  s   | ]} | j V  qd S r%   r-   r5   r)   r   r   r'   b   s     z_align_core.<locals>.<genexpr>outer)howreindexi'  zAlignment difference on axis z. is larger than an order of magnitude on term z, by more than z.4gz; performance may suffer   )category
stacklevelF)axiscopy) r#   Zpandasr6   dictzipZidxmaxr   Z_constructorr   r.   r   r
   indexis_joinitemsranger   r   log10maxabsreprr    warningswarnr   r   r9   updatevaluesr   )r*   Z
term_indexZ	term_dimsr6   ZndimsZbiggestr   r   ZnaxesZgt_than_one_axisr   Z	is_seriesZis_series_and_gt_one_axisr=   rD   ZaxZitmr   r4   ZtiZ	transposeZ	reindexerZterm_axis_sizeZreindexer_sizeordmwr0   r   r)   r   _align_coreR   sF    


"rP   c                 C  s   zt t| } W nT tk
rf   t| jttfrRt| j}|t	|| jj
f Y S t| jdf Y S X tdd | D rtdd | D  jdfS t| \}}||fS )z
    Align a set of terms.
    Nc                 s  s   | ]}|j V  qd S r%   )Z	is_scalarr&   r   r   r   r'      s     zalign_terms.<locals>.<genexpr>c                 s  s   | ]}|j V  qd S r%   r-   r&   r   r   r   r'      s     )listcomflatten	TypeErrorr   r   r
   r	   r   r   r   r   result_typeallr   rP   )r*   r   r   r   r   r   align_terms   s    
rW   c                 C  s   z
| j } W n tk
r   Y nX t|j|}t| tsVt| trV| |fd|i|S t	|dr| tj
kr|tj
kr| |}nF| ||}t|jdkrt|dkrt|tjst|g|}|S )a  
    Reconstruct an object given its type, raw value, and possibly empty
    (None) axes.

    Parameters
    ----------
    typ : object
        A type
    obj : object
        The value to use in the type constructor
    axes : dict
        The axes to use to construct the resulting pandas object

    Returns
    -------
    ret : typ
        An object of type ``typ`` with the value `obj` and possible axes
        `axes`.
    r   r   r,   )r   AttributeErrorr   rU   r   r   r   
issubclassr   r   Zbool_Zastyper.   shaper   array)r   objr   r   Zres_tZ	ret_valuer   r   r   reconstruct_object   s$    


r]   )$__doc__
__future__r   	functoolsr   r   typingr   r   rJ   Znumpyr   Zpandas._typingr   Zpandas.errorsr   Zpandas.core.dtypes.genericr	   r
   Zpandas.core.baser   Zpandas.core.commoncorecommonrR   Zpandas.core.computation.commonr   Zpandas.core.indexes.apir   r   r   r+   r2   rP   rW   r]   r   r   r   r   <module>   s*   
9