U
    c
                     @  s  d 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
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lmZ ddl m!Z! ddddZ"ddddddZ#ddddZ$dd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CallableSequenceN)PerformanceWarning)find_stack_level)ABCDataFrame	ABCSeries)PandasObject)result_type_many)F)NDFrame)Indexz7tuple[partial | type[NDFrame], 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-g7fro6k3/pandas/core/computation/align.py_align_core_single_unary_op&   s    
r   ztype[NDFrame]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>:   s      z'_zip_axes_from_type.<locals>.<dictcomp>)	enumerateZ_AXIS_ORDERS)r   r    r   r$   r   r   7   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>A   s     z&_any_pandas_objects.<locals>.<genexpr>)anytermsr   r   r   _any_pandas_objects=   s    r.   zCallable[[F], F]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*   K   s     z9_filter_special_cases.<locals>.wrapper.<locals>.<genexpr>)lenr   r.   r   )r-   Zterm_valuesfr   r   wrapperE   s    z&_filter_special_cases.<locals>.wrapper)r   )r3   r4   r   r2   r   _filter_special_casesD   s    r5   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t 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>X   s      z_align_core.<locals>.<listcomp>c                   s   g | ]} | j jqS r   )r   ndimr!   r"   r,   r   r   r6   Y   s     r   )Seriesr/   c                 3  s   | ]} | j V  qd S r(   r0   r8   r,   r   r   r*   f   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pandasr9   dictzipZidxmaxr   Z_constructorr   r1   r   r   indexis_joinitemsranger   r   log10maxabsreprr#   warningswarnr   r	   r   r<   updatevaluesr   )r-   Z
term_indexZ	term_dimsr9   ZndimsZbiggestr   r   ZnaxesZgt_than_one_axisr   Z	is_seriesZis_series_and_gt_one_axisr?   rF   ZaxZitmr"   r7   ZtiZ	transposeZ	reindexerZterm_axis_sizeZreindexer_sizeordmwr3   r   r,   r   _align_coreV   sN    


"  rR   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(   r0   r)   r   r   r   r*      s     )listcomflatten	TypeErrorr   r   r   r
   r   r   r   r   result_typeallr   rR   )r-   r   r   r   r   r   align_terms   s    
rY   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   rW   r   r   r   
issubclassr   r   Zbool_Zastyper1   shaper   array)r   objr   r   Zres_tZ	ret_valuer   r   r   reconstruct_object   s$    


r_   ))__doc__
__future__r   	functoolsr   r   typingr   r   r   rL   Znumpyr   Zpandas.errorsr   Zpandas.util._exceptionsr	   Zpandas.core.dtypes.genericr
   r   Zpandas.core.baser   Zpandas.core.commoncorecommonrT   Zpandas.core.computation.commonr   Zpandas._typingr   Zpandas.core.genericr   Zpandas.core.indexes.apir   r   r   r.   r5   rR   rY   r_   r   r   r   r   <module>   s.   
;