U
    f/eK;                  2   @  sP  d Z ddlmZ ddlZddlmZmZ ddlZddlm	Z	 ddl
Z
ddlmZmZmZmZmZmZmZ ddlZddl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"m#Z#m$Z$m%Z% ddl&m'Z'm(Z(m)Z) ddl*m+Z+ ddl,m-Z- er
ddl.m/Z/ G dd de0Z1G dd de2Z3dd Z4dd Z5dddddZ6dudddd Z7d!d" Z8dd#d$d%Z9dd#d&d'Z:dd#d(d)Z;dd#d*d+Z<d,d#d-d.Z=dvd/d0d1d2d3Z>dwd/d0d1d4d5Z?d6d7 Z@d8d9d:d;d<ZAdd#d=d>ZBd?d#d@dAZCd,ddBdCdDZDdEdF ZEdGdH ZFdIdJ ZGdxdKdLZHdMdNdOdPdQZIdRdS ZJdTdUdVdWdXZKejLdYdZd[d\d]ZMd^d_d`daZNejOejOejPejPejQejQiZRejOdbejPdcejQddejSdeejTdfejOdbejUdbejVdgejWdgejXdhejYdhejZdiej[diej\djej]djej^dkej_dkejPdcej`dcejQddejaddejbdlejcdlejddmejedmiZfdndodpdqdrZgdsdt ZhdS )yzh
Misc tools for implementing data structures

Note: pandas.core.common is *not* part of the public API.
    )annotationsN)abcdefaultdict)partial)TYPE_CHECKINGAnyCallable
CollectionIterableIteratorcast)lib)AnyArrayLikeNpDtypeScalarT)np_version_under1p18)'construct_1d_object_array_from_listlike)is_array_likeis_bool_dtypeis_extension_array_dtype
is_integer)ABCExtensionArrayABCIndex	ABCSeries)iterable_not_string)isna)Indexc                   @  s   e Zd ZdS )SettingWithCopyErrorN__name__
__module____qualname__ r#   r#   6/tmp/pip-unpacked-wheel-tiezk1ph/pandas/core/common.pyr   9   s   r   c                   @  s   e Zd ZdS )SettingWithCopyWarningNr   r#   r#   r#   r$   r%   =   s   r%   c                 c  s,   | D ]"}t |r t|E dH  q|V  qdS )a  
    Flatten an arbitrarily nested sequence.

    Parameters
    ----------
    line : sequence
        The non string sequence to flatten

    Notes
    -----
    This doesn't consider strings sequences.

    Returns
    -------
    flattened : generator
    N)r   flatten)lineelementr#   r#   r$   r&   A   s    r&   c              	   C  sL   | d j }| dd  D ]0}z|j |kr*d }W q tk
rD   d }Y qX q|S )Nr      )name
ValueError)objsr*   objr#   r#   r$   consensus_name_attrY   s    

r.   r   bool)keyreturnc                 C  s   t | ttjtfs$t| rt| jr| jtjkrrt	| } t
| snd}t
| dkrjt|  rjt|dS dS t| jrdS n t | trt| dkot
| S dS )a  
    Check whether `key` is a valid boolean indexer.

    Parameters
    ----------
    key : Any
        Only list-likes may be considered boolean indexers.
        All other types are not considered a boolean indexer.
        For array-like input, boolean ndarrays or ExtensionArrays
        with ``_is_boolean`` set are considered boolean indexers.

    Returns
    -------
    bool
        Whether `key` is a valid boolean indexer.

    Raises
    ------
    ValueError
        When the array is an object-dtype ndarray or ExtensionArray
        and contains missing values.

    See Also
    --------
    check_array_indexer : Check that `key` is a valid array to index,
        and convert to an ndarray.
    z=Cannot mask with non-boolean array containing NA / NaN valuesbooleanFTr   )
isinstancer   npndarrayr   r   r   dtypeobject_asarrayr   Zis_bool_arrayZinfer_dtyper   anyr+   r   listlenZis_bool_list)r0   Zna_msgr#   r#   r$   is_bool_indexerd   s$    



r<   F)
warn_floatc                 C  s2   t | r.|  r.|r&tjdtdd t| S | S )a  
    To avoid numpy DeprecationWarnings, cast float to integer where valid.

    Parameters
    ----------
    val : scalar
    warn_float : bool, default False
        If True, issue deprecation warning for a float indexer.

    Returns
    -------
    outval : scalar
    zIndexing with a float is deprecated, and will raise an IndexError in pandas 2.0. You can manually convert to an integer key instead.   )
stacklevel)r   Zis_floatr   warningswarnFutureWarningint)valr=   r#   r#   r$   cast_scalar_indexer   s    rE   c                  G  s   dd | D S )zL
    Returns a generator consisting of the arguments that are not None.
    c                 s  s   | ]}|d k	r|V  qd S Nr#   .0argr#   r#   r$   	<genexpr>   s      znot_none.<locals>.<genexpr>r#   argsr#   r#   r$   not_none   s    rM   )r1   c                  G  s   t dd | D S )z?
    Returns a boolean indicating if any argument is None.
    c                 s  s   | ]}|d kV  qd S rF   r#   rG   r#   r#   r$   rJ      s     zany_none.<locals>.<genexpr>r9   rK   r#   r#   r$   any_none   s    rO   c                  G  s   t dd | D S )zA
    Returns a boolean indicating if all arguments are None.
    c                 s  s   | ]}|d kV  qd S rF   r#   rG   r#   r#   r$   rJ      s     zall_none.<locals>.<genexpr>allrK   r#   r#   r$   all_none   s    rR   c                  G  s   t dd | D S )zC
    Returns a boolean indicating if any argument is not None.
    c                 s  s   | ]}|d k	V  qd S rF   r#   rG   r#   r#   r$   rJ      s     zany_not_none.<locals>.<genexpr>rN   rK   r#   r#   r$   any_not_none   s    rS   c                  G  s   t dd | D S )zE
    Returns a boolean indicating if all arguments are not None.
    c                 s  s   | ]}|d k	V  qd S rF   r#   rG   r#   r#   r$   rJ      s     zall_not_none.<locals>.<genexpr>rP   rK   r#   r#   r$   all_not_none   s    rT   rC   c                  G  s   t dd | D S )z;
    Returns the count of arguments that are not None.
    c                 s  s   | ]}|d k	V  qd S rF   r#   rH   xr#   r#   r$   rJ      s     z!count_not_none.<locals>.<genexpr>)sumrK   r#   r#   r$   count_not_none   s    rX   zNpDtype | Nonez
np.ndarray)r6   r1   c                 C  s   t | ttfs"t| ds"t| } nt | tr2| jS t | trR|tjtfkrRt	| S tj
| |d}t|jjtr|tj
| td}|jdkrdd | D } t	| }|S )NZ	__array__r6      c                 S  s   g | ]}t |qS r#   )tuplerU   r#   r#   r$   
<listcomp>   s     z%asarray_tuplesafe.<locals>.<listcomp>)r3   r:   r[   hasattrr   Z_valuesr4   r7   objectr   r8   
issubclassr6   typestrndim)valuesr6   resultr#   r#   r$   asarray_tuplesafe   s     


re   c                 C  s\   t | ttfr| g} t | ttjfsLzt| } W n tk
rJ   | g} Y nX t| |d} | S )z
    Transform label or iterable of labels to array, for use in Index.

    Parameters
    ----------
    dtype : dtype
        If specified, use as dtype of the resulting array, otherwise infer.

    Returns
    -------
    array
    rY   )r3   ra   r[   r:   r4   r5   	TypeErrorre   )labelsr6   r#   r#   r$   index_labels_to_array   s    rh   c                 C  s    | d k	rt | ttfs| gS | S rF   )r3   r[   r:   r-   r#   r#   r$   maybe_make_list  s    rj   zIterable[T] | TzCollection[T] | T)r-   r1   c                 C  s.   t | tjr t | tjs t| S tt| } | S )zB
    If obj is Iterable but not list-like, consume into list.
    )r3   r   r
   Sizedr:   r   r	   ri   r#   r#   r$   maybe_iterable_to_list  s    
rl   c                 C  s(   t | to&| jdko&| jdko&| jdkS )z
    We have a null slice.
    Nr3   slicestartstopstepri   r#   r#   r$   is_null_slice%  s    
rr   z
list[bool]c                 C  s   dd | D S )zX
    Find non-trivial slices in "line": return a list of booleans with same length.
    c                 S  s    g | ]}t |tot| qS r#   )r3   rn   rr   )rH   kr#   r#   r$   r\   5  s     z"is_true_slices.<locals>.<listcomp>r#   )r'   r#   r#   r$   is_true_slices1  s    rt   )r'   r1   c                 C  s(   t | to&| jdko&| j|ko&| jdkS )z&
    We have a full length slice.
    r   Nrm   )r-   r'   r#   r#   r$   is_full_slice9  s    
ru   c                 C  s>   t | drt| dS t| tr(t| jS t| r:t| jS d S )Nr    )	r]   getattrr3   r   get_callable_namefunccallabler`   r    ri   r#   r#   r$   rw   E  s    




rw   c                 K  s   t | r| |f|S | S )z
    Evaluate possibly callable input using obj and kwargs if it is callable,
    otherwise return as it is.

    Parameters
    ----------
    maybe_callable : possibly a callable
    obj : NDFrame
    **kwargs
    )ry   )Zmaybe_callabler-   kwargsr#   r#   r$   apply_if_callableV  s    r{   c                 C  sX   t | s(t| tr tt| jS t| } t| tj	sDt
d|  n| tkrTt
d| S )a  
    Helper function to standardize a supplied mapping.

    Parameters
    ----------
    into : instance or subclass of collections.abc.Mapping
        Must be a class, an initialized collections.defaultdict,
        or an instance of a collections.abc.Mapping subclass.

    Returns
    -------
    mapping : a collections.abc.Mapping subclass or other constructor
        a callable object that can accept an iterator to create
        the desired Mapping.

    See Also
    --------
    DataFrame.to_dict
    Series.to_dict
    zunsupported type: z/to_dict() only accepts initialized defaultdicts)inspectisclassr3   r   r   default_factoryr`   r_   r   Mappingrf   )Zintor#   r#   r$   standardize_mappingg  s    

r   c                 C  sZ   t | s"t| s"ts.t| tjjr.tj| S t| tjjr@| S | dkrNtjS tddS )a  
    Helper function for processing random_state arguments.

    Parameters
    ----------
    state : int, array-like, BitGenerator (NumPy>=1.17), np.random.RandomState, None.
        If receives an int, array-like, or BitGenerator, passes to
        np.random.RandomState() as seed.
        If receives an np.random.RandomState object, just returns object.
        If receives `None`, returns np.random.
        If receives anything else, raises an informative ValueError.

        .. versionchanged:: 1.1.0

            array-like and BitGenerator (for NumPy>=1.18) object now passed to
            np.random.RandomState() as seed

        Default None.

    Returns
    -------
    np.random.RandomState or np.random if state is None

    NzYrandom_state must be an integer, array-like, a BitGenerator, a numpy RandomState, or None)	r   r   r   r3   r4   randomZBitGeneratorZRandomStater+   )stater#   r#   r$   random_state  s     r   z/Callable[..., T] | tuple[Callable[..., T], str]r   )rx   r1   c                 O  sR   t |tr>|\}}||kr,| d}t|| ||< |||S || f||S dS )ar  
    Apply a function ``func`` to object ``obj`` either by passing obj as the
    first argument to the function or, in the case that the func is a tuple,
    interpret the first element of the tuple as a function and pass the obj to
    that function as a keyword argument whose key is the value of the second
    element of the tuple.

    Parameters
    ----------
    func : callable or tuple of (callable, str)
        Function to apply to this object or, alternatively, a
        ``(callable, data_keyword)`` tuple where ``data_keyword`` is a
        string indicating the keyword of `callable`` that expects the
        object.
    *args : iterable, optional
        Positional arguments passed into ``func``.
    **kwargs : dict, optional
        A dictionary of keyword arguments passed into ``func``.

    Returns
    -------
    object : the return type of ``func``.
    z/ is both the pipe target and a keyword argumentN)r3   r[   r+   )r-   rx   rL   rz   targetmsgr#   r#   r$   pipe  s    


r   c                   s&   t  tjtfr fdd}n }|S )zv
    Returns a function that will map names/labels, dependent if mapper
    is a dict, Series or just a function.
    c                   s   |  kr |  S | S d S rF   r#   )rV   mapperr#   r$   f  s    zget_rename_function.<locals>.f)r3   r   r   r   )r   r   r#   r   r$   get_rename_function  s    r   z Scalar | Iterable | AnyArrayLikezlist | AnyArrayLike)rc   r1   c                 C  s>   t | ttjtttfr| S t | tjr8t | t	s8t| S | gS )z
    Convert list-like or scalar input to list-like. List, numpy and pandas array-like
    inputs are returned unmodified whereas others are converted to list.
    )
r3   r:   r4   r5   r   r   r   r   r
   ra   )rc   r#   r#   r$   convert_to_list_like  s
    r   ra   zIterator[None])attrr1   c                 c  s,   t | |}t| || | V  t| || dS )zTemporarily set attribute on an object.

    Args:
        obj: Object whose attribute will be modified.
        attr: Attribute to modify.
        value: Value to temporarily set attribute to.

    Yields:
        obj with modified attribute.
    N)rv   setattr)r-   r   value	old_valuer#   r#   r$   temp_setattr  s    
r   r   )indexc                 C  s2   t | t |kr.tdt |  dt | ddS )zC
    Check the length of data matches the length of the index.
    zLength of values (z") does not match length of index ()N)r;   r+   )datar   r#   r#   r$   require_length_match
  s    r   rW   maxminrQ   r9   meanprodstdvarmediancumprodcumsumr   z
str | None)rI   r1   c                 C  s
   t | S )zH
    if we define an internal function for this argument, return it
    )_cython_tablegetrI   r#   r#   r$   get_cython_func6  s    r   c                 C  s   t | | S )ze
    if we define an builtin function for this argument, return it,
    otherwise return the arg
    )_builtin_tabler   r   r#   r#   r$   is_builtin_func=  s    r   )F)N)N)N)i__doc__
__future__r   builtinscollectionsr   r   
contextlib	functoolsr   r|   typingr   r   r   r	   r
   r   r   r@   Znumpyr4   Zpandas._libsr   Zpandas._typingr   r   r   r   Zpandas.compatr   Zpandas.core.dtypes.castr   Zpandas.core.dtypes.commonr   r   r   r   Zpandas.core.dtypes.genericr   r   r   Zpandas.core.dtypes.inferencer   Zpandas.core.dtypes.missingr   Zpandasr   r+   r   Warningr%   r&   r.   r<   rE   rM   rO   rR   rS   rT   rX   re   rh   rj   rl   rr   rt   ru   rw   r{   r   r   r   r   r   contextmanagerr   r   rW   r   r   r   rQ   r9   Znansumr   Znanmeanr   Znanprodr   Znanstdr   Znanvarr   Z	nanmedianZnanmaxZnanminr   Z
nancumprodr   Z	nancumsumr   r   r   r#   r#   r#   r$   <module>   s   $	3
 
*%                         