U
    Mf                     @  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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)PerformanceWarning)find_stack_level)ABCDataFrame	ABCSeries)PandasObject)result_type_many)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-eb6vo0j3/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>7   s      z'_zip_axes_from_type.<locals>.<dictcomp>)	enumerateZ_AXIS_ORDERS)r   r   r   r"   r   r   4   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_objects:   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(   H   s     z9_filter_special_cases.<locals>.wrapper.<locals>.<genexpr>)lenr   r,   r   )r+   Zterm_valuesfr   r   wrapperB   s    z&_filter_special_cases.<locals>.wrapper)r   )r1   r2   r   r0   r   _filter_special_casesA   s    r3   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>U   s      z_align_core.<locals>.<listcomp>c                   s   g | ]} | j jqS r   )r   ndimr   r    r*   r   r   r4   V   s     r   )Seriesr-   c                 3  s   | ]} | j V  qd S r&   r.   r6   r*   r   r   r(   c   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pandasr7   dictzipZidxmaxr   Z_constructorr   r/   r   r
   indexis_joinitemsranger   r   log10maxabsreprr!   warningswarnr   r   r   r:   updatevaluesr   )r+   Z
term_indexZ	term_dimsr7   ZndimsZbiggestr   r   ZnaxesZgt_than_one_axisr   Z	is_seriesZis_series_and_gt_one_axisr=   rD   ZaxZitmr    r5   ZtiZ	transposeZ	reindexerZterm_axis_sizeZreindexer_sizeordmwr1   r   r*   r   _align_coreS   sN    


"  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.errorsr   Zpandas.util._exceptionsr   Zpandas.core.dtypes.genericr	   r
   Zpandas.core.baser   Zpandas.core.commoncorecommonrR   Zpandas.core.computation.commonr   Zpandas.core.genericr   Zpandas.core.indexes.apir   r   r   r,   r3   rP   rW   r]   r   r   r   r   <module>   s,   
;