o
    5cA                     @  s   d Z ddlmZ ddlmZ ddlZddlm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dZd#ddZd$ddZd%ddZd&d d!ZdS )'z&
EA-compatible analogue to np.putmask
    )annotations)AnyN)lib)	ArrayLikenpt)np_version_under1p21)infer_dtype_from)is_list_like)ExtensionArrayvaluesr   masknpt.NDArray[np.bool_]valuer   returnNonec                 C  s   t | tjr| jtkrt|rt |tjr8t|j| js8t|r2t	|t	| kr2|| | |< dS || |< dS t
| || dS )aD  
    ExtensionArray-compatible implementation of np.putmask.  The main
    difference is we do not handle repeating or truncating like numpy.

    Parameters
    ----------
    values: np.ndarray or ExtensionArray
    mask : np.ndarray[bool]
        We assume extract_bool_array has already been called.
    value : Any
    N)
isinstancenpndarraydtypeobjectr   	is_scalarcan_castr	   lenputmask)r   r   r    r   U/var/www/html/gps/gps/lib/python3.10/site-packages/pandas/core/array_algos/putmask.pyputmask_inplace   s   

r   
np.ndarraynewc                 C  s   t r
t| | |}t|dddkr|j| jdd}| }|dkr^t|r^t|dddkr^t|}||d krBt	| || dS |jd |d ksQ|d dkrZt
| || dS tdt
| || dS )	z
    np.putmask will truncate or repeat if `new` is a listlike with
    len(new) != len(values).  We require an exact match.

    Parameters
    ----------
    values : np.ndarray
    mask : np.ndarray[bool]
    new : Any
    ndimr      F)copyz-cannot assign mismatch length to masked arrayN)r   setitem_datetimelike_compatsumgetattrastyper   r	   r   shapeplacer   
ValueError)r   r   r   nlocsr'   r   r   r   putmask_without_repeat8   s    
r+   "tuple[npt.NDArray[np.bool_], bool]c                 C  s.   t |}|j| jkrtd|  }||fS )zG
    Validate mask and check if this putmask operation is a no-op.
    z,putmask: mask and data must be the same size)extract_bool_arrayr'   r)   any)r   r   noopr   r   r   validate_putmaskb   s
   
r0   c                 C  s*   t | tr| jtdd} tj| td} | S )zP
    If we have a SparseArray or BooleanArray, convert it to ndarray[bool].
    F)r   na_value)r   )r   r
   to_numpyboolr   asarray)r   r   r   r   r-   p   s   
r-   num_setintc                 C  sR   | j tkr't|dd\}}t|tj r'|jdv r't|s#|g| }|S t|}|S )z
    Parameters
    ----------
    values : np.ndarray
    num_set : int
        For putmask, this is mask.sum()
    other : Any
    T)pandas_dtype)mM)r   r   r   r   r   kindr	   list)r   r5   otherr   _r   r   r   r#   ~   s   
	
r#   )r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   )r   r   r   r   r   r,   )r   r   r   r   )r   r   r5   r6   )__doc__
__future__r   typingr   numpyr   pandas._libsr   pandas._typingr   r   pandas.compatr   pandas.core.dtypes.castr   pandas.core.dtypes.commonr	   pandas.core.arraysr
   r   r+   r0   r-   r#   r   r   r   r   <module>   s    

!
*
