a
    d}                     @  s*  d Z ddlmZ ddlmZmZ ddlmZmZm	Z	m
Z
 ddlZddlmZmZ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mZmZmZm Z  ddl!m"Z" ddl#m$Z$m%Z%m&Z& erddl'm(Z( dddddZ)dddddZ*ddddddZ+g dZ,g dZ-dddd d!d"Z.ddd#d$d%d&Z/dd'd(d)d*Z0d+d,d-d.d/Z1d0d1 Z2ddd2d3d4Z3dd7dd8dd#dd+d9d:d;	d<d=Z4ddd7d>d?d@Z5dd7d7dd#dd,d9dd#d:dA
dBdCZ6dd7d7d7dddDdEdFZ7dd7d7d7dGddHdIdJZ8dd7d7d7dGd8dKdLdMZ9dd7d7d7d8dOdPdQdRZ:d7dSd#dTd:dUdVdWZ;dd7dSd8d#d,d:dYdZd[Z<dd\dd]d^d_Z=d`d`dadbdcZ>e>dd7d#d\dddedfdgZ?e>dd7d#d\dddedhdiZ@e>dd7d#d\djdkdlZAe>dd#d\dmdndoZBe?e@dpZCdddrdsdtZDdudvdwdxZEdd#d#dydzd{ZFdddd|d}d~ZGdS )z$
Routines for filling missing data.
    )annotations)partialwraps)TYPE_CHECKINGAnyLiteralcastN)NaTalgoslib)	ArrayLikeAxisIntFReindexMethodnpt)import_optional_dependency)infer_dtype_from)is_array_likeis_numeric_dtypeis_numeric_v_string_likeis_object_dtypeneeds_i8_conversion)DatetimeTZDtype)is_valid_na_for_dtypeisnana_value_for_dtypeIndexznpt.NDArray[np.bool_]int)masklengthc                 C  s8   t | r4t| |kr,tdt|  d| | | } | S )zJ
    Validate the size of the values passed to ExtensionArray.fillna.
    z'Length of 'value' does not match. Got (z)  expected )r   len
ValueError)valuer   r     r$   \/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/pandas/core/missing.pycheck_value_size4   s    r&   r   )arrreturnc                 C  s  t |\}}t|tjr(tj||d}n(| }t|s@|g}|j||dd}d}t	| jrld}t
|  }t
|}||  }tj| jtd}|D ]b}	t| |	rq|rtj| jtjd}
| | |	k|
|< n"| |	k}
t|
tjs|
jtdd}
||
O }q| r|t
| O }|S )a	  
    Return a masking array of same size/shape as arr
    with entries equaling any member of values_to_mask set to True

    Parameters
    ----------
    arr : ArrayLike
    values_to_mask: list, tuple, or scalar

    Returns
    -------
    np.ndarray[bool]
    )dtypeF)r)   copyT)r)   Zna_value)r   
isinstancenpr)   arrayZconstruct_array_typer   Zis_list_likeZ_from_sequencer   r   zerosshapeboolr   Zbool_ndarrayZto_numpyany)r'   Zvalues_to_maskr)   clsZpotential_naZarr_maskZna_maskZnonnar   xZnew_maskr$   r$   r%   mask_missingC   s6    






r5   Fstrr0   )methodallow_nearestc                 C  sj   t | tr,|  } | dkr d} n| dkr,d} ddg}d}|rJ|d d}| |vrftd| d	|  | S )
Nffillpadbfillbackfillzpad (ffill) or backfill (bfill)nearestz(pad (ffill), backfill (bfill) or nearestzInvalid fill method. Expecting z. Got )r+   r6   lowerappendr"   )r7   r8   Zvalid_methodsZ	expectingr$   r$   r%   clean_fill_method   s    

r@   )lineartimeindexvalues)r=   zeroslinear	quadraticcubicbarycentrickroghspline
polynomialfrom_derivativespiecewise_polynomialpchipakimacubicspliner   )r7   rC   r(   c                 K  sh   | d}| dv r"|d u r"tdtt }| |vrHtd| d|  d| dv rd|jsdt|  d| S )	Norder)rK   rL   z7You must specify the order of the spline or polynomial.zmethod must be one of z. Got 'z
' instead.)rJ   rN   rO   z4 interpolation requires that the index be monotonic.)getr"   
NP_METHODS
SP_METHODSZis_monotonic_increasing)r7   rC   kwargsrR   validr$   r$   r%   clean_interp_method   s    
rX   
int | None)howis_validr(   c                 C  s   | dv sJ t |dkrdS |jdkr2|jdd}| dkrL|dd  }n&| dkrrt |d |ddd	   }|| }|sdS |S )
a+  
    Retrieves the positional index of the first valid value.

    Parameters
    ----------
    how : {'first', 'last'}
        Use this parameter to change between the first or last valid index.
    is_valid: np.ndarray
        Mask to find na_values.

    Returns
    -------
    int or None
    )firstlastr   N      axisr\   r]   )r!   ndimr2   Zargmax)rZ   r[   ZidxposZ	chk_notnar$   r$   r%   find_valid_index   s    
rd   z&Literal['forward', 'backward', 'both'])limit_directionr(   c                 C  s2   g d}|   } | |vr.td| d|  d| S )N)forwardbackwardZbothz*Invalid limit_direction: expecting one of z, got 'z'.r>   r"   )re   Zvalid_limit_directionsr$   r$   r%   validate_limit_direction   s    ri   z
str | Nonez#Literal['inside', 'outside'] | None)
limit_arear(   c                 C  s:   | d ur6ddg}|   } | |vr6td| d|  d| S )Ninsideoutsidez%Invalid limit_area: expecting one of z, got .rh   )rj   Zvalid_limit_areasr$   r$   r%   validate_limit_area   s    rn   c                 C  s`   | d u r|dv rd} q\d} n@|dv r<| dkr<t d| d|dv r\| dkr\t d| d| S )N)r<   r;   rg   rf   )r:   r9   z0`limit_direction` must be 'forward' for method ``z1`limit_direction` must be 'backward' for method `)r"   )re   r7   r$   r$   r%   infer_limit_direction   s    

rp   )rC   r(   c                 C  s   | dkr(ddl m} |tt|}nHh d}t|jpRt|jtpRt	
|jd}| |vrp|sptd|  dt| rtd|S )	NrA   r   r   >   rD   rB   rC   r=   mMz9Index column must be numeric or datetime type when using z_ method other than linear. Try setting a numeric or datetime index column before interpolating.zkInterpolation with NaNs in the index has not been implemented. Try filling those NaNs before interpolating.)pandasr   r,   Zaranger!   r   r)   r+   r   r   Zis_np_dtyper"   r   r2   NotImplementedError)r7   rC   r   methodsZis_numeric_or_datetimer$   r$   r%   get_interp_index  s(    

ru   rA   rf   
np.ndarrayr   z
Any | NoneNone)	datarC   ra   r7   limitre   rj   
fill_valuer(   c           
        s   t |fi  t | jr,t| jdd dkrJt|jsFtddtt|tj	ddt
|dd	d
 fdd}	t|	||  dS )z
    Column-wise application of _interpolate_1d.

    Notes
    -----
    Alters 'data' in-place.

    The signature does differ from _interpolate_1d because it only
    includes what is needed for Block.interpolate.
    F)compatrB   zStime-weighted interpolation only works on Series or DataFrames with a DatetimeIndexrD   N)Znobsry   rv   rw   )yvaluesr(   c                   s$   t f |  dd d S )NF)indicesr|   r7   ry   re   rj   rz   bounds_error)_interpolate_1d)r|   rz   r}   rV   ry   Zlimit_area_validatedre   r7   r$   r%   func]  s    	z$interpolate_2d_inplace.<locals>.func)rX   r   r)   r   r   r"   ri   rn   r
   Zvalidate_limit_index_to_interp_indicesr,   apply_along_axis)
rx   rC   ra   r7   ry   re   rj   rz   rV   r   r$   r   r%   interpolate_2d_inplace1  s    

 r   )rC   r7   r(   c                 C  s`   | j }t|jr|d}|dkr4|}ttj|}n(t|}|dv r\|jtjkr\t	
|}|S )zE
    Convert Index to ndarray of indices to pass to NumPy/SciPy.
    i8rA   )rD   rC   )Z_valuesr   r)   viewr   r,   r1   asarrayZobject_r   Zmaybe_convert_objects)rC   r7   ZxarrZindsr$   r$   r%   r   u  s    



r   )
r}   r|   r7   ry   re   rj   rz   r~   rR   r(   c	                 K  s  t |}
|
 }| sdS | r&dS tt|
}td|d}|du rLd}tt|}td|d}|du rtt|}ttd| t|}|dkr|tt	|
|dB }n.|dkr|tt	|
d|B }ntt	|
||}|d	kr|||B O }n|d
kr
|| | }||O }t
|}|jjdv }|r.|d}|tv rnt| | }t| |
 | | | || | ||
< n.t| | || | |
 f||||d|	||
< |rtj||< n
tj||< dS )a  
    Logic for the 1-d interpolation.  The input
    indices and yvalues will each be 1-d arrays of the same length.

    Bounds_error is currently hardcoded to False since non-scipy ones don't
    take it as an argument.

    Notes
    -----
    Fills 'yvalues' in-place.
    Nr\   rZ   r[   r   r]   r_   rf   rg   rk   rl   rq   r   )r7   rz   r~   rR   )r   r2   allsetr,   Zflatnonzerord   ranger!   _interp_limitsortedr)   kindr   rT   ZargsortZinterp_interpolate_scipy_wrapperr	   r#   nan)r}   r|   r7   ry   re   rj   rz   r~   rR   rV   invalidrW   Zall_nansZfirst_valid_indexZ
start_nansZlast_valid_indexZend_nansZpreserve_nansZmid_nansZis_datetimelikeZindexerr$   r$   r%   r     sd    





r   )r4   ynew_xr7   r~   c                 K  s  | d}t d|d ddlm}	 t|}|	j|	jtttt	|	j
d}
g d}||v r|dkrd|}n|}|	j| ||||d	}||}n|d
krt|s|dkrtd| |	j| |fd|i|}||}nL| jjs|  } |jjs| }|jjs| }|
| }|| ||fi |}|S )z
    Passed off to scipy.interpolate.interp1d. method is scipy's kind.
    Returns an array interpolated at new_x.  Add any new methods to
    the list in _clean_interp_method.
    z interpolation requires SciPy.scipy)extrar   interpolate)rI   rJ   rM   rN   rQ   rP   rO   )r=   rE   rF   rG   rH   rL   rL   )r   rz   r~   rK   z;order needs to be specified and greater than 0; got order: k)r   r   r   r,   r   Zbarycentric_interpolateZkrogh_interpolate_from_derivatives_cubicspline_interpolate_akima_interpolateZpchip_interpolateZinterp1dr   r"   ZUnivariateSplineflagsZ	writeabler*   )r4   r   r   r7   rz   r~   rR   rV   r   r   Zalt_methodsZinterp1d_methodsr   ZterpZnew_yr$   r$   r%   r     sJ    





r   zint | list[int] | None)xiyir4   derextrapolatec           	      C  s4   ddl m} |jj}|| |dd||d}||S )a  
    Convenience function for interpolate.BPoly.from_derivatives.

    Construct a piecewise polynomial in the Bernstein basis, compatible
    with the specified values and derivatives at breakpoints.

    Parameters
    ----------
    xi : array-like
        sorted 1D array of x-coordinates
    yi : array-like or list of array-likes
        yi[i][j] is the j-th derivative known at xi[i]
    order: None or int or array-like of ints. Default: None.
        Specifies the degree of local polynomials. If not None, some
        derivatives are ignored.
    der : int or list
        How many derivatives to extract; None for all potentially nonzero
        derivatives (that is a number equal to the number of points), or a
        list of derivatives to extract. This number includes the function
        value as 0th derivative.
     extrapolate : bool, optional
        Whether to extrapolate to ouf-of-bounds points based on first and last
        intervals, or to return NaNs. Default: True.

    See Also
    --------
    scipy.interpolate.BPoly.from_derivatives

    Returns
    -------
    y : scalar or array-like
        The result, of length R or length M or M by R.
    r   r   rb   r_   )Zordersr   )r   r   ZBPolyrM   reshape)	r   r   r4   rR   r   r   r   r7   mr$   r$   r%   r   >  s    )r   )r   r   r4   r   ra   c                 C  s(   ddl m} |j| ||d}|||dS )aQ  
    Convenience function for akima interpolation.
    xi and yi are arrays of values used to approximate some function f,
    with ``yi = f(xi)``.

    See `Akima1DInterpolator` for details.

    Parameters
    ----------
    xi : np.ndarray
        A sorted list of x-coordinates, of length N.
    yi : np.ndarray
        A 1-D array of real values.  `yi`'s length along the interpolation
        axis must be equal to the length of `xi`. If N-D array, use axis
        parameter to select correct axis.
    x : np.ndarray
        Of length M.
    der : int, optional
        How many derivatives to extract; None for all potentially
        nonzero derivatives (that is a number equal to the number
        of points), or a list of derivatives to extract. This number
        includes the function value as 0th derivative.
    axis : int, optional
        Axis in the yi array corresponding to the x-coordinate values.

    See Also
    --------
    scipy.interpolate.Akima1DInterpolator

    Returns
    -------
    y : scalar or array-like
        The result, of length R or length M or M by R,

    r   r   r`   )nu)r   r   ZAkima1DInterpolator)r   r   r4   r   ra   r   Pr$   r$   r%   r   p  s    *r   
not-a-knotzstr | tuple[Any, Any])r   r   r4   ra   bc_typec                 C  s(   ddl m} |j| ||||d}||S )ag  
    Convenience function for cubic spline data interpolator.

    See `scipy.interpolate.CubicSpline` for details.

    Parameters
    ----------
    xi : np.ndarray, shape (n,)
        1-d array containing values of the independent variable.
        Values must be real, finite and in strictly increasing order.
    yi : np.ndarray
        Array containing values of the dependent variable. It can have
        arbitrary number of dimensions, but the length along ``axis``
        (see below) must match the length of ``x``. Values must be finite.
    x : np.ndarray, shape (m,)
    axis : int, optional
        Axis along which `y` is assumed to be varying. Meaning that for
        ``x[i]`` the corresponding values are ``np.take(y, i, axis=axis)``.
        Default is 0.
    bc_type : string or 2-tuple, optional
        Boundary condition type. Two additional equations, given by the
        boundary conditions, are required to determine all coefficients of
        polynomials on each segment [2]_.
        If `bc_type` is a string, then the specified condition will be applied
        at both ends of a spline. Available conditions are:
        * 'not-a-knot' (default): The first and second segment at a curve end
          are the same polynomial. It is a good default when there is no
          information on boundary conditions.
        * 'periodic': The interpolated functions is assumed to be periodic
          of period ``x[-1] - x[0]``. The first and last value of `y` must be
          identical: ``y[0] == y[-1]``. This boundary condition will result in
          ``y'[0] == y'[-1]`` and ``y''[0] == y''[-1]``.
        * 'clamped': The first derivative at curves ends are zero. Assuming
          a 1D `y`, ``bc_type=((1, 0.0), (1, 0.0))`` is the same condition.
        * 'natural': The second derivative at curve ends are zero. Assuming
          a 1D `y`, ``bc_type=((2, 0.0), (2, 0.0))`` is the same condition.
        If `bc_type` is a 2-tuple, the first and the second value will be
        applied at the curve start and end respectively. The tuple values can
        be one of the previously mentioned strings (except 'periodic') or a
        tuple `(order, deriv_values)` allowing to specify arbitrary
        derivatives at curve ends:
        * `order`: the derivative order, 1 or 2.
        * `deriv_value`: array-like containing derivative values, shape must
          be the same as `y`, excluding ``axis`` dimension. For example, if
          `y` is 1D, then `deriv_value` must be a scalar. If `y` is 3D with
          the shape (n0, n1, n2) and axis=2, then `deriv_value` must be 2D
          and have the shape (n0, n1).
    extrapolate : {bool, 'periodic', None}, optional
        If bool, determines whether to extrapolate to out-of-bounds points
        based on first and last intervals, or to return NaNs. If 'periodic',
        periodic extrapolation is used. If None (default), ``extrapolate`` is
        set to 'periodic' for ``bc_type='periodic'`` and to True otherwise.

    See Also
    --------
    scipy.interpolate.CubicHermiteSpline

    Returns
    -------
    y : scalar or array-like
        The result, of shape (m,)

    References
    ----------
    .. [1] `Cubic Spline Interpolation
            <https://en.wikiversity.org/wiki/Cubic_Spline_Interpolation>`_
            on Wikiversity.
    .. [2] Carl de Boor, "A Practical Guide to Splines", Springer-Verlag, 1978.
    r   r   )ra   r   r   )r   r   ZCubicSpline)r   r   r4   ra   r   r   r   r   r$   r$   r%   r     s
    M
r   zLiteral['pad', 'backfill']zLiteral['inside', 'outside'])rD   r7   ry   rj   r(   c                 C  s   t | }| }| std|d}|du r.d}td|d}|du rJt| }t| ||d |dkrrd|||d	 < n.|d
krd |d|< ||d	 d< ntdtj| |< dS )a  
    Apply interpolation and limit_area logic to values along a to-be-specified axis.

    Parameters
    ----------
    values: np.ndarray
        Input array.
    method: str
        Interpolation method. Could be "bfill" or "pad"
    limit: int, optional
        Index limit on interpolation.
    limit_area: {'inside', 'outside'}
        Limit area for interpolation.

    Notes
    -----
    Modifies values in-place.
    r\   r   Nr   r]   )r7   ry   rk   Fr_   rl   z*limit_area should be 'inside' or 'outside')r   r   rd   r!   pad_or_backfill_inplacer"   r,   r   )rD   r7   ry   rj   r   r[   r\   r]   r$   r$   r%   _interpolate_with_limit_area  s(    r   r:   )rD   r7   ra   ry   rj   r(   c                 C  s   |dur&t tt|||d||  dS |dkr6dd ndd }| jdkrl|dkrXtd| td	| j } t	|}|| }t
|d
d}|||d dS )a  
    Perform an actual interpolation of values, values will be make 2-d if
    needed fills inplace, returns the result.

    Parameters
    ----------
    values: np.ndarray
        Input array.
    method: str, default "pad"
        Interpolation method. Could be "bfill" or "pad"
    axis: 0 or 1
        Interpolation axis
    limit: int, optional
        Index limit on interpolation.
    limit_area: str, optional
        Limit area for interpolation. Can be "inside" or "outside"

    Notes
    -----
    Modifies values in-place.
    N)r7   ry   rj   r   c                 S  s   | S Nr$   r4   r$   r$   r%   <lambda>\      z)pad_or_backfill_inplace.<locals>.<lambda>c                 S  s   | j S r   )Tr   r$   r$   r%   r   \  r   r_   z0cannot interpolate on a ndim == 1 with axis != 0)r_   r^   rc   ry   )r,   r   r   r   rc   AssertionErrorr   tupler/   r@   get_fill_func)rD   r7   ra   ry   rj   ZtransfZtvaluesr   r$   r$   r%   r   +  s,    	
r   znpt.NDArray[np.bool_] | None)r   r(   c                 C  s    |d u rt | }|tj}|S r   )r   r   r,   Zuint8)rD   r   r$   r$   r%   _fillna_prepm  s    r   r   )r   r(   c                   s&   t  ddd fdd}tt|S )z>
    Wrapper to handle datetime64 and timedelta64 dtypes.
    NrY   r   c                   sP   t | jrB|d u rt| } | d||d\}}|| j|fS  | ||dS )Nr   ry   r   )r   r)   r   r   )rD   ry   r   resultr   r$   r%   new_func~  s    
z&_datetimelike_compat.<locals>.new_func)NN)r   r   r   )r   r   r$   r   r%   _datetimelike_compaty  s    r   z(tuple[np.ndarray, npt.NDArray[np.bool_]])rD   ry   r   r(   c                 C  s"   t | |}tj| ||d | |fS Nr   )r   r
   Zpad_inplacerD   ry   r   r$   r$   r%   _pad_1d  s    
r   c                 C  s"   t | |}tj| ||d | |fS r   )r   r
   Zbackfill_inplacer   r$   r$   r%   _backfill_1d  s    
r   r   c                 C  s*   t | |}| jr"tj| ||d n | |fS r   )r   sizer
   Zpad_2d_inplacer   r$   r$   r%   _pad_2d  s    
r   r   c                 C  s*   t | |}| jr"tj| ||d n | |fS r   )r   r   r
   Zbackfill_2d_inplacer   r$   r$   r%   _backfill_2d  s    
r   r:   r<   r_   r   c                 C  s&   t | } |dkrt|  S ttd|  S )Nr_   r   )r@   _fill_methodsr   r   )r7   rc   r$   r$   r%   r     s    r   zReindexMethod | None)r(   c                 C  s   | d u rd S t | ddS )NT)r8   )r@   )r7   r$   r$   r%   clean_reindex_fill_method  s    r   )r   fw_limitbw_limitc                   s   t |  t }t }dd fdd}|durT|dkrJtt| d }n
|| |}|dur|dkrh|S t|| ddd |}t d t| }|dkr|S ||@ S )	ak  
    Get indexers of values that won't be filled
    because they exceed the limits.

    Parameters
    ----------
    invalid : np.ndarray[bool]
    fw_limit : int or None
        forward limit to index
    bw_limit : int or None
        backward limit to index

    Returns
    -------
    set of indexers

    Notes
    -----
    This is equivalent to the more readable, but slower

    .. code-block:: python

        def _interp_limit(invalid, fw_limit, bw_limit):
            for x in np.where(invalid)[0]:
                if invalid[max(0, x - fw_limit):x + bw_limit + 1].all():
                    yield x
    r   r   c                   s`   t | }t| |d d}tt|d | tt| d |d    dkd B }|S )Nr_   r   )min_rolling_windowr   r   r,   whereZcumsum)r   ry   ZwindowedidxNr$   r%   inner  s    
"z_interp_limit.<locals>.innerNr   rb   r_   )r!   r   r,   r   listr   )r   r   r   Zf_idxZb_idxr   Z	b_idx_invr$   r   r%   r     s     !
r   )awindowr(   c                 C  sJ   | j dd | j d | d |f }| j| jd f }tjjj| ||dS )z
    [True, True, False, True, False], 2 ->

    [
        [True,  True],
        [True, False],
        [False, True],
        [True, False],
    ]
    Nrb   r_   )r/   strides)r/   r   r,   r   Zstride_tricksZ
as_strided)r   r   r/   r   r$   r$   r%   r     s    $r   )F)rA   Nrf   NN)rA   Nrf   NNFN)NFN)Nr   F)r   r   )r   r   N)r:   r   NN)N)NN)NN)NN)NN)r_   )H__doc__
__future__r   	functoolsr   r   typingr   r   r   r   numpyr,   Zpandas._libsr	   r
   r   Zpandas._typingr   r   r   r   r   Zpandas.compat._optionalr   Zpandas.core.dtypes.castr   Zpandas.core.dtypes.commonr   r   r   r   r   Zpandas.core.dtypes.dtypesr   Zpandas.core.dtypes.missingr   r   r   rr   r   r&   r5   r@   rT   rU   rX   rd   ri   rn   rp   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   <module>   s   <&#      D       "q   K   6  5   V6    C   
  
   
A