U
    c(                     @  s  d dl mZ d dlZd dlmZ d dl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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 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* e+dZ,dddddddddddddd d!d"d#d$d%d&d'd(d)gZ-dBd,d,d,dd-d.d$Z.d/d/d0d1d2Z/dCd/d,d,d,dd3d4d5Z0ddd6d7d)Z1dDd8dd9d:d%Z2d;d< Z3d,d=d>d'Z4d?dd@dAd(Z5dS )E    )annotationsN)cast)NaTlib)InvalidIndexErrorfind_common_type)is_dtype_equal)	safe_sort)Index
_new_Indexensure_indexensure_index_from_sequencesget_unanimous_names)CategoricalIndex)DatetimeIndex)IntervalIndex)
MultiIndex)Float64Index
Int64IndexNumericIndexUInt64Index)PeriodIndex)
RangeIndex)TimedeltaIndexzSorting because non-concatenation axis is not aligned. A future version
of pandas will change to not sort by default.

To accept the future behavior, pass 'sort=False'.

To retain the current behavior and silence the warning, pass 'sort=True'.
r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   get_objs_combined_axisunion_indexesr   all_indexes_samedefault_indexsafe_sort_indexFTbool)	intersectsortcopyreturnc                   s"    fdd| D }t ||||dS )a  
    Extract combined index: return intersection or union (depending on the
    value of "intersect") of indexes on given axis, or None if all objects
    lack indexes (e.g. they are numpy arrays).

    Parameters
    ----------
    objs : list
        Series or DataFrame objects, may be mix of the two.
    intersect : bool, default False
        If True, calculate the intersection between indexes. Otherwise,
        calculate the union.
    axis : {0 or 'index', 1 or 'outer'}, default 0
        The axis to extract indexes from.
    sort : bool, default True
        Whether the result index should come out sorted or not.
    copy : bool, default False
        If True, return a copy of the combined index.

    Returns
    -------
    Index
    c                   s   g | ]}|  qS  )Z	_get_axis).0objaxisr%   ;/tmp/pip-unpacked-wheel-g7fro6k3/pandas/core/indexes/api.py
<listcomp>h   s     z*get_objs_combined_axis.<locals>.<listcomp>)r!   r"   r#   )_get_combined_index)objsr!   r)   r"   r#   Z	obs_idxesr%   r(   r*   r   N   s    zlist[Index])r-   r$   c                 C  s<   t  }g }| D ](}t||kr|t| || q|S )z^
    Return a list with distinct elements of "objs" (different ids).
    Preserves order.
    )setidaddappend)r-   idsresr'   r%   r%   r*   _get_distinct_objsl   s    r4   )indexesr!   r"   r#   r$   c                 C  s   t | } t| dkrtg }nTt| dkr4| d }n>|r^| d }| dd D ]}||}qLnt| dd}t|}|r~t|}|r| }|S )a  
    Return the union or intersection of indexes.

    Parameters
    ----------
    indexes : list of Index or list objects
        When intersect=True, do not accept list of lists.
    intersect : bool, default False
        If True, calculate the intersection between indexes. Otherwise,
        calculate the union.
    sort : bool, default False
        Whether the result index should come out sorted or not.
    copy : bool, default False
        If True, return a copy of the combined index.

    Returns
    -------
    Index
    r      NFr"   )r4   lenr   intersectionr   r   r   r#   )r5   r!   r"   r#   indexotherr%   r%   r*   r,   z   s     

r,   )r:   r$   c                 C  sx   | j r
| S zt| }W n tk
r*   Y nJX t|tr:|S ttj|}t| trbtj|| j	d} nt
|| j| jd} | S )z
    Returns the sorted index

    We keep the dtypes and the name attributes.

    Parameters
    ----------
    index : an Index

    Returns
    -------
    Index
    )names)namedtype)Zis_monotonic_increasingr
   	TypeError
isinstancer   r   npZndarrayfrom_tuplesr<   r   r=   r>   )r:   Zarray_sortedr%   r%   r*   r      s    

zbool | None)r"   r$   c                   s  t dkrtdt dkrBd }t|tr>tt|}|S t\}ddfdd}fdd	}|d
krTd }| dd D }dd |D }t |dt |fkrtdt |t krdt fddD sdd D d }n(t |dkr$ddd D d }dd D ]}|j	|rDdndd}q0|S |dkr|}	d tfdddd D s||	t
 d }
|
jkr|
S |}	||	S dS )a)  
    Return the union of indexes.

    The behavior of sort and names is not consistent.

    Parameters
    ----------
    indexes : list of Index or list objects
    sort : bool, default True
        Whether the result index should come out sorted or not.

    Returns
    -------
    Index
    r   z#Must have at least 1 Index to unionr6   r   r$   c                   s,   dd  t tj fdd| D d|dS )a3  
        Convert indexes to lists and concatenate them, removing duplicates.

        The final dtype is inferred.

        Parameters
        ----------
        inds : list of Index or list objects
        dtype : dtype to set for the resulting Index

        Returns
        -------
        Index
        c                 S  s   t | tr|  } | S N)r@   r   tolist)ir%   r%   r*   conv   s    
z4union_indexes.<locals>._unique_indices.<locals>.convc                   s   g | ]} |qS r%   r%   )r&   rF   rG   r%   r*   r+      s     z:union_indexes.<locals>._unique_indices.<locals>.<listcomp>r7   )r>   )r   r   Zfast_unique_multiple_list)indsr>   r7   rH   r*   _unique_indices   s
    z&union_indexes.<locals>._unique_indicesc                   s$   dd  D }|rt |}nd}|S )a  
        Finds a common type for the indexes to pass through to resulting index.

        Parameters
        ----------
        inds: list of Index or list objects

        Returns
        -------
        The common type or None if no indexes were given
        c                 S  s   g | ]}t |tr|jqS r%   )r@   r   r>   )r&   idxr%   r%   r*   r+     s     
 zCunion_indexes.<locals>._find_common_index_dtype.<locals>.<listcomp>Nr   )rI   Zdtypesr>   )r5   r%   r*   _find_common_index_dtype   s
    
z/union_indexes.<locals>._find_common_index_dtypespecialc                 S  s   g | ]}t |tr|qS r%   )r@   r   r&   xr%   r%   r*   r+     s     
 z!union_indexes.<locals>.<listcomp>c                 S  s   g | ]}|j d k	r|qS rD   )tzrN   r%   r%   r*   r+     s     
 z0Cannot join tz-naive with tz-aware DatetimeIndexTc                 3  s   | ]}t |j jV  qd S rD   )r	   r>   rN   firstr%   r*   	<genexpr>#  s     z union_indexes.<locals>.<genexpr>c                 S  s   g | ]}| d qS )UTC)Z
tz_convertrN   r%   r%   r*   r+   '  s     Fc                 S  s   g | ]}|j td dqS )F)r#   )ZastypeobjectrN   r%   r%   r*   r+   2  s     Nr7   arrayc                 3  s   | ]}  |V  qd S rD   equals)r&   r;   )r:   r%   r*   rS   <  s     )r8   AssertionErrorr@   listr   sorted_sanitize_and_checkr?   allunionr   r=   rename)r5   r"   resultkindrJ   rL   ZdtisZdti_tzsr;   r>   r=   r%   )rR   r:   r5   r"   r*   r      sP    



 

c                 C  sp   t dd | D }t |krHt|dkr@dd | D } |t  n| dfS t|dks\t|krd| dfS | dfS d	S )
aN  
    Verify the type of indexes and convert lists to Index.

    Cases:

    - [list, list, ...]: Return ([list, list, ...], 'list')
    - [list, Index, ...]: Return _sanitize_and_check([Index, Index, ...])
        Lists are sorted and converted to Index.
    - [Index, Index, ...]: Return ([Index, Index, ...], TYPE)
        TYPE = 'special' if at least one special type, 'array' otherwise.

    Parameters
    ----------
    indexes : list of Index or list objects

    Returns
    -------
    sanitized_indexes : list of Index or list objects
    type : {'list', 'array', 'special'}
    c                 S  s   h | ]}t |qS r%   )typer&   r:   r%   r%   r*   	<setcomp>]  s     z&_sanitize_and_check.<locals>.<setcomp>r6   c                 S  s&   g | ]}t |tstt|n|qS r%   )r@   r   rZ   rN   r%   r%   r*   r+   a  s    z'_sanitize_and_check.<locals>.<listcomp>rZ   rM   rV   N)rZ   r8   remover   )r5   kindsr%   r%   r*   r\   H  s    r\   rC   c                   s&   t | }t| t fdd|D S )z
    Determine if all indexes contain the same elements.

    Parameters
    ----------
    indexes : iterable of Index objects

    Returns
    -------
    bool
        True if all indexes contain the same elements, False otherwise.
    c                 3  s   | ]}  |V  qd S rD   rW   rc   rQ   r%   r*   rS   }  s     z#all_indexes_same.<locals>.<genexpr>)iternextr]   )r5   itrr%   rQ   r*   r   n  s    int)nr$   c                 C  s   t d| }tj|d dS )Nr   )r=   )ranger   Z_simple_new)rk   rngr%   r%   r*   r     s    
)Fr   TF)FFF)T)6
__future__r   textwraptypingr   ZnumpyrA   Zpandas._libsr   r   Zpandas.errorsr   Zpandas.core.dtypes.castr   Zpandas.core.dtypes.commonr	   Zpandas.core.algorithmsr
   Zpandas.core.indexes.baser   r   r   r   r   Zpandas.core.indexes.categoryr   Zpandas.core.indexes.datetimesr   Zpandas.core.indexes.intervalr   Zpandas.core.indexes.multir   Zpandas.core.indexes.numericr   r   r   r   Zpandas.core.indexes.periodr   Zpandas.core.indexes.ranger   Zpandas.core.indexes.timedeltasr   dedentZ	_sort_msg__all__r   r4   r,   r   r   r\   r   r   r%   r%   r%   r*   <module>   sv             0"|&