
    Pi                       U d 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Zddlm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$m%Z%m&Z& ddl'm(Z(m)Z)m*Z* erddl+m,Z, ddlm-Z- ddl.m/Z/ ed         Z0de1d<   d|dZ2d}dZ3e
ddd~d$            Z4e
dd(            Z4d)ddd+Z4g d,Z5g d-Z6dd1Z7dd5Z8dd8Z9dd<Z:dd?Z;dd@Z<	 	 	 	 	 	 dddKZ=ddLZ>	 	 	 	 	 	 	 	 dddQZ?	 	 	 dddUZ@	 	 	 ddd[ZA	 	 ddd\ZB	 	 	 dddaZC	 	 	 	 ddddZD	 dddfZEddiZFeF	 	 	 dddk            ZGeF	 	 	 dddl            ZHeF	 	 	 dddm            ZIeF	 	 	 dddn            ZJddpZKddqZLeGeHdrZMddduZNddwZOdd{ZPdS )z$
Routines for filling missing data.
    )annotations)wraps)TYPE_CHECKINGAnyLiteralcastoverloadN)	is_nan_na)NaTalgoslib)	ArrayLikeAxisIntFReindexMethodnpt)import_optional_dependency)infer_dtype_from)is_array_likeis_bool_dtypeis_numeric_dtypeis_object_dtypeneeds_i8_conversion)
ArrowDtypeBaseMaskedDtypeDatetimeTZDtype)is_valid_na_for_dtypeisnana_value_for_dtype)Callable)	TypeAlias)Index)
not-a-knotclampednaturalperiodicr!   _CubicBCmasknpt.NDArray[np.bool_]lengthintc                    t          |           r=t          |           |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*   s      g/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/pandas/core/missing.pycheck_value_sizer1   >   sk     U u::&#e** & &#& &   dL    arrr   returnc                   t          |          \  }}t          | j        t          t          f          rt          j        |          rt          j        |          rt                      s| j        j
        dk    rt          | j        t                    r1t          j        | j                  |                                  z  }|S ddlm} |                    | j                                      d                                          }|S | j        j
        dv r"t          j        | j        t*                    }|S t          |          rt          |           S t          j        | j        t*                    }t-          | j                  r)t/          | j                  st          j        |          rnt/          | j                  r$t-          |          rt          j        |          snt-          | j                  rt          |t2                    rnrt5          | j                  r t          |            }| |         |k    ||<   n>| |k    }t          |t          j                  s|                    t*          d          }|}|S )a?  
    Return a masking array of same size/shape as arr
    with entries equaling value set to True.

    Parameters
    ----------
    arr : ArrayLike
    value : scalar-like
        Caller has ensured `not is_list_like(value)` and that it can be held
        by `arr`.

    Returns
    -------
    np.ndarray[bool]
    fr   NFiudtype)r9   na_value)r   
isinstancer9   r   r   r   is_floatnpisnanr
   kind_datar   pyarrow.computecomputeis_nan	_pa_array	fill_nullto_numpyzerosshapeboolr   r   is_boolstrr   ndarray)r3   r/   r9   r(   pcarr_masknew_masks          r0   mask_missingrP   M   s`     $E**LE5 	39
;<<L HUOO 	 9>S  #)_55 	x	**chhjj[8 -,,,,,yy//99%@@IIKKY^t##8CIT222DKE{{ Cyy 8CIT***D##ci(( K 	ci  %5e%<%<EH[QVEWEW 		#)	$	$ E3)?)? 		#	#  II:X%/X%<(BJ// 	E((te(DDHKr2   .allow_nearestmethod,Literal['ffill', 'pad', 'bfill', 'backfill']rR   Literal[False]Literal['pad', 'backfill']c                   d S N rS   rR   s     r0   clean_fill_methodr[      s	    
 "%r2   7Literal['ffill', 'pad', 'bfill', 'backfill', 'nearest']Literal[True]%Literal['pad', 'backfill', 'nearest']c                   d S rX   rY   rZ   s     r0   r[   r[      s	    
 -0Cr2   FrI   c                   t          | t                    r%|                                 } | dk    rd} n| dk    rd} ddg}d}|r|                    d           d}| |vrt	          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;   rK   lowerappendr.   )rS   rR   valid_methods	expectings       r0   r[   r[      s    
 &#   WFFwFJ'M1I ?Y'''>	]""T9TTFTTUUUMr2   )lineartimeindexvalues)re   zeroslinear	quadraticcubicbarycentrickroghspline
polynomialfrom_derivativespiecewise_polynomialpchipakimacubicsplinerK   rl   r"   c                    |                     d          }| dv r|t          d          t          t          z   }| |vrt          d| d|  d          | dv r|j        st          |  d          | S )	Norder)rt   ru   z7You must specify the order of the spline or polynomial.zmethod must be one of z. Got 'z
' instead.)rs   rw   rx   z4 interpolation requires that the index be monotonic.)getr.   
NP_METHODS
SP_METHODSis_monotonic_increasing)rS   rl   kwargsr|   valids        r0   clean_interp_methodr      s    JJwE)))emRSSS#EUR%RRRRRSSS;;;, 	OOO   Mr2   howis_valid
int | Nonec                H   | dv sJ t          |          dk    rdS |j        dk    r|                    d          }| dk    r|dd                                         }n6| dk    r0t          |          dz
  |ddd	                                         z
  }||         }|sd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-   ndimanyargmax)r   r   idxpos	chk_notnas       r0   find_valid_indexr      s     #####
8}}t}<<Q<''
g~~"""$$&&	X"Xddd^%:%:%<%<< I t Mr2   limit_direction&Literal['forward', 'backward', 'both']c                j    g d}|                                  } | |vrt          d| d|  d          | S )N)forwardbackwardbothz*Invalid limit_direction: expecting one of z, got 'z'.rf   r.   )r   valid_limit_directionss     r0   validate_limit_directionr     sq     =<<%++--O444B%B B.=B B B
 
 	
 r2   
limit_area
str | None#Literal['inside', 'outside'] | Nonec                n    | 2ddg}|                                  } | |vrt          d| d|  d          | S )Ninsideoutsidez%Invalid limit_area: expecting one of z, got .r   )r   valid_limit_areass     r0   validate_limit_arear   %  sn    %y1%%''
...!8I ! !! ! !   r2   -Literal['backward', 'forward', 'both'] | None&Literal['backward', 'forward', 'both']c                    | 
|dv rd} n=d} n:|dv r| dk    rt          d| d          |dv r| dk    rt          d| d          | S )N)rd   rc   r   r   )rb   ra   z0`limit_direction` must be 'forward' for method ``z1`limit_direction` must be 'backward' for method `)r.   )r   rS   s     r0   infer_limit_directionr   3  s     ***(OO'OO%%%/Y*F*FL6LLL   ****/L/LMFMMM   r2   c                   | dk    rddl m}  |t          |                    }nh d}t          |j                  p3t          |j        t                    pt          j        |j        d          }t          t          z   }| |v r| |vr|st          d|  d          nt          d|  d	          t          |                                          rt          d
          |S )Nrj   r   )
RangeIndex>   rk   rl   rm   re   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. Can not interpolate with method=r   zkInterpolation with NaNs in the index has not been implemented. Try filling those NaNs before interpolating.)pandasr   r-   r   r9   r;   r   r   is_np_dtyper~   r   r.   r   r   NotImplementedError)rS   rl   r   methodsis_numeric_or_datetimer   s         r0   get_interp_indexr   H  s   %%%%%%
3u::&&888U[)) 2%+772u{D11 	
 Z'U??W$$-C$ %#% % %   IIIIJJJE{{ 
!/
 
 	

 Lr2   rj   r   data
np.ndarrayr   r   limit
fill_value
Any | NoneNonec	           	       	 t          |fi 	 t          | j                  rt          | j        d          dk    r%t	          |j                  st          d          dt                    t          |          t          j	        d          t          |          d	fd}
t          j        |
||            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)compatrk   zStime-weighted interpolation only works on Series or DataFrames with a DatetimeIndexrm   N)nobsr   yvaluesr   r4   r   c                4    t          d| dd	 d S )NF)	indicesr   rS   r   r   r   r   bounds_errorr(   rY   )_interpolate_1d)	r   r   r   r   r   limit_area_validatedr   r(   rS   s	    r0   funcz$interpolate_2d_inplace.<locals>.func  sP     	 	
++!	
 	
 	
 	
 	
 	
 	
r2   )r   r   r4   r   )r   r   r9   r   r   r.   r   r   r   validate_limit_index_to_interp_indicesr=   apply_along_axis)r   rl   r   rS   r   r   r   r   r(   r   r   r   r   s      ``` ``` @@r0   interpolate_2d_inplacer   k  s'   . 00000Z44 B'
5AAA
"5;// 	   
 .??O.z::  d%888E&uf55G
 
 
 
 
 
 
 
 
 
 
 
 
  dD)))))r2   c                .   | j         }t          |j                  r|                    d          }|dk    r|}t	          t
          j        |          }nAt          j        |          }|dv r)|j        t
          j        k    rt          j
        |          }|S )zE
    Convert Index to ndarray of indices to pass to NumPy/SciPy.
    i8rj   )rm   rl   )_valuesr   r9   viewr   r=   rL   asarrayobject_r   maybe_convert_objects)rl   rS   xarrindss       r0   r   r     s     =D4:&& yyBJ%%z$(((zRZ''066Kr2   r   r   r   r|   c
                ,   |	|	}nt          |          }| }|                                sdS |                                rdS t          j        |          }t          d|          }|d}t          j        |          }t          d|          }|t          |          }t          j        d|z   t          |                    }|dk    r%t          j        |t          ||d                    }nN|dk    r%t          j        |t          |d|                    }n#t          j
        t          |||                    }|d	k    r+t          j        ||          }t          j        ||          }nI|d
k    rCt          j        ||d          }t          j        ||d          }t          j        ||          }|j        j        dv }|r|                    d          }|t          v rRt          j        | |                   }t          j        | |         | |         |         ||         |                   ||<   n)t%          | |         ||         | |         f||||d|
||<   |	d|	dd<   d|	|<   n!|rt&          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   )r   r   r   r   r   r   r   r   r   Tassume_uniquer   r   )rS   r   r   r|   F)r   r   allr=   flatnonzeror   aranger-   union1d_interp_limitunique	setdiff1dr9   r?   r   r~   argsortinterp_interpolate_scipy_wrapperr   r/   nan)r   r   rS   r   r   r   r   r   r|   r(   r   invalidr   all_nansfirst_valid_index
start_nanslast_valid_indexend_nanspreserve_nansmid_nansis_datetimelikeindexers                         r0   r   r     s   0 w--HE99;; yy{{  ~g&&H(WuEEE ,--J'FUCCCw<<y--s5zz::H )##
:}WeQ/O/OPP	J	&	&
8]7Au-M-MNN 	-"F"FGG X
=*==
=(;;	y	 	 <*DIII<($GGG
=(;;m(D0O %,,t$$ *WU^,,9GgenW5wu~g7N
 
 6ENENG	
 !%	
 	
 	
 	
 QQQ"]	 (!$!#
Fr2   xynew_xc                   | d}t          d|           ddlm}	 t          j        |          }|	j        |	j        t          t          t          t          |	j
        d}
g d}||v r1|dk    r|}n|}|	                    | ||||	          } ||          }n|d
k    rDt          |          s|dk    rt          d|            |	j        | |fd|i|} ||          }n| j        j        s|                                 } |j        j        s|                                }|j        j        s|                                }|
                    |d          }|t          d| d          |                    dd            || ||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)rr   rs   rv   rw   rz   ry   rx   )re   rn   ro   rp   rq   ru   ru   )r?   r   r   rt   z;order needs to be specified and greater than 0; got order: kNr   r   downcast)r   r   r   r=   r   barycentric_interpolatekrogh_interpolate_from_derivatives_cubicspline_interpolate_akima_interpolatepchip_interpolateinterp1dr   r.   UnivariateSplineflags	writeablecopyr}   pop)r   r   r   rS   r   r   r|   r   r   r   alt_methodsinterp1d_methodsr?   terpnew_ys                  r0   r   r   1  s    555Ewe4444!!!!!!JuE #:.- 1/#.9 9K   !!!\!!DDD##qt
 $ 
 
 U	8		;; 	5A::UeUU   ,{+AqDDEDVDDU w  	Aw  	A{$ 	!JJLLEvt,,<IIIIJJJ 	

:t$$$Q5++F++Lr2   xiyiderint | list[int] | Noneextrapolatec                    ddl m} |j        j        } || |                    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   r   r   )ordersr	  )r   r   BPolyrv   reshape)	r  r  r   r|   r  r	  r   rS   ms	            r0   r   r   ~  sW    R "!!!!! /Fr2::b!$$ULLLA1Q44Kr2   c                X    ddl m} |                    | ||          } |||          S )a  
    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. 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   Akima1DInterpolator)r  r  r   r  r   r   Ps          r0   r   r     sC    P "!!!!!''BT'::A1Q3<<<r2   r#   bc_type_CubicBC | tuple[Any, Any]!Literal['periodic'] | bool | Nonec                X    ddl m} |                    | ||||          } ||          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   )r   r  r	  )r   r   CubicSpline)r  r  r   r   r  r	  r   r  s           r0   r   r     sK    Z "!!!!!
BT7 	  	 	A 1Q44Kr2   rb   rm   c                   |dk    rd nd }| j         dk    r3|dk    rt          d          |                     dg| j        R           } t	          |          } ||           }t          |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.
    r   c                    | S rX   rY   r   s    r0   <lambda>z)pad_or_backfill_inplace.<locals>.<lambda>Q  s     r2   c                    | j         S rX   )Tr  s    r0   r  z)pad_or_backfill_inplace.<locals>.<lambda>Q  s     r2   r   z1cannot interpolate on an ndim == 1 with axis != 0r   )r   )r   r   N)r   AssertionErrorr  rH   r[   get_fill_func)rm   rS   r   r   r   transftvaluesr   s           r0   pad_or_backfill_inplacer"  5  s    8 #aiikkkmmF {a199 !TUUU 2V\ 2 233v&&FfVnnGa(((DD*555555r2   npt.NDArray[np.bool_] | Nonec                (    |t          |           }|S rX   )r   )rm   r(   s     r0   _fillna_prepr%  a  s    
 |F||Kr2   r   r   c                l     t                     	 	 	 dd fd            }t          t          |          S )	z>
    Wrapper to handle datetime64 and timedelta64 dtypes.
    Nr   r   r   r   c                    t          | j                  rR|t          |           } |                     d          |||          \  }}|                    | j                  |fS  | |||          S )Nr   )r   r   r(   )r   r9   r   r   )rm   r   r   r(   resultr   s        r0   new_funcz&_datetimelike_compat.<locals>.new_funcq  s     v|,, 	3|F||4D!!:D  LFD ;;v|,,d22tF%JTJJJJr2   NNN)r   r   r   r   )r   r   r   )r   r)  s   ` r0   _datetimelike_compatr+  l  s\    
 4[[ !:>	K K K K K K [K$ 8r2   (tuple[np.ndarray, npt.NDArray[np.bool_]]c                    t          | |          }|$|                                st          ||           t          j        | ||           | |fS N)r   )r%  r   _fill_limit_area_1dr   pad_inplacerm   r   r   r(   s       r0   _pad_1dr2    sX     %%DdhhjjD*---	fd%00004<r2   c                    t          | |          }|$|                                st          ||           t          j        | ||           | |fS r.  )r%  r   r/  r   backfill_inplacer1  s       r0   _backfill_1dr5    sX     %%DdhhjjD*---	64u55554<r2   c                    t          | |          }|t          ||           | j        rt          j        | ||           | |fS r.  )r%  _fill_limit_area_2dsizer   pad_2d_inplacer1  s       r0   _pad_2dr:    sU     %%DD*---{ 8VT77774<r2   c                    t          | |          }|t          ||           | j        rt          j        | ||           n	 | |fS r.  )r%  r7  r8  r   backfill_2d_inplacer1  s       r0   _backfill_2dr=    s]     %%DD*---{ !&$e<<<<< 	4<r2   Literal['outside', 'inside']c                    |  }|                                 }t          |          |ddd                                          z
  dz
  }|dk    rd| d|<   d| |dz   d<   dS |dk    rd| |dz   |<   dS dS )a  Prepare 1d mask for ffill/bfill with limit_area.

    Caller is responsible for checking at least one value of mask is False.
    When called, mask will no longer faithfully represent when
    the corresponding are NA or not.

    Parameters
    ----------
    mask : np.ndarray[bool, ndim=1]
        Mask representing NA values when filling.
    limit_area : { "outside", "inside" }
        Whether to limit filling to outside or inside the outer most non-NA value.
    Nr   r   r   Fr   )r   r-   )r(   r   neg_maskr   r   s        r0   r/  r/    s      uHOOEx==8DDbD>00222Q6DXVeV TAXZZ	y	 	 !&UQY 
!	 r2   c                   | j          }|dk    rVt          j                            |d          t          j                            |ddd         d          ddd         z  }nWt          j                            |d           t          j                            |ddd         d          ddd          z  }d| |j         <   dS )a  Prepare 2d mask for ffill/bfill with limit_area.

    When called, mask will no longer faithfully represent when
    the corresponding are NA or not.

    Parameters
    ----------
    mask : np.ndarray[bool, ndim=1]
        Mask representing NA values when filling.
    limit_area : { "outside", "inside" }
        Whether to limit filling to outside or inside the outer most non-NA value.
    r   r   r   Nr   F)r  r=   maximum
accumulate)r(   r   r@  la_masks       r0   r7  r7    s     wHY J!!(!33j##HTTrTN#;;DDbDAB 	 Z""8!"444z$$Xddd^!$<<TTrTBBC 	 DOOOr2   rb   rd   r   r   c                p    t          |           } |dk    rt          |          S t          t          d|          S )Nr   rE  )r[   _fill_methodsr:  r=  )rS   r   s     r0   r  r    s6    v&&FqyyV$$55f==r2   ReindexMethod | Nonec                ,    | d S t          | d          S )NTrQ   )r[   )rS   s    r0   clean_reindex_fill_methodrJ  	  s    ~tV48888r2   r   fw_limitbw_limitc                   t          |           t          j        g t          j                  }t          j        g t          j                  }d}dfd}|/|dk    rt          j        |           d         }d}n || |          }|+|dk    r|S d	z
   || ddd
         |          z
  }|dk    r|S t          j        |||          S )am  
    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
    r8   Tr   r+   c           	     r   t          |          }t          j        j                            | |dz                                 d          }t          j        t          j        |          d         |z   t          j        | d |dz                                             dk              d                   }|S )Nr   r   )	minr=   r   stride_trickssliding_window_viewr   r   wherecumsum)r   r   windowedidxNs       r0   innerz_interp_limit.<locals>.inner5  s    E16';;GUQYOOSSTUVVjHXq!E)Hw{{++3355:;;A>
 
 
r2   Nr   Fr   r   r   )r   r+   )r-   r=   arrayint64rR  intersect1d)r   rK  rL  f_idxb_idxr   rW  rV  s          @r0   r   r     s    B 	GAHRrx(((EHRrx(((EM      q==HW%%a(E!MME'8,,Eq== LEEE'$$B$-:::E1}}>%mDDDDr2   )r(   r)   r*   r+   )r3   r   r4   r)   )rS   rT   rR   rU   r4   rV   )rS   r\   rR   r]   r4   r^   )rS   r\   rR   rI   r4   r^   )rS   rK   rl   r"   r4   rK   )r   rK   r   r)   r4   r   )r   rK   r4   r   )r   r   r4   r   )r   r   rS   rK   r4   r   )rl   r"   r4   r"   )rj   Nr   NNN)r   r   rl   r"   r   r   rS   rK   r   r   r   rK   r   r   r   r   r4   r   )rl   r"   rS   rK   r4   r   )rj   Nr   NNFNN)r   r   r   r   rS   rK   r   r   r   rK   r   r   r   r   r   rI   r|   r   r4   r   )NFN)
r   r   r   r   r   r   rS   rK   r   rI   )Nr   F)
r  r   r  r   r   r   r  r  r	  rI   )r   r   )
r  r   r  r   r   r   r  r+   r   r   )r   r#   N)r  r   r  r   r   r   r   r   r  r  r	  r  r4   r   )rb   r   NN)rm   r   rS   rV   r   r   r   r   r   r   r4   r   rX   )r(   r#  r4   r)   )r   r   r4   r   r*  )
rm   r   r   r   r   r   r(   r#  r4   r,  )r   r   r   r   r(   r#  )r(   r)   r   r>  r4   r   )r   )r   r+   )r4   rH  )r   r)   rK  r   rL  r   r4   r   )Q__doc__
__future__r   	functoolsr   typingr   r   r   r   r	   numpyr=   pandas._configr
   pandas._libsr   r   r   pandas._typingr   r   r   r   r   pandas.compat._optionalr   pandas.core.dtypes.castr   pandas.core.dtypes.commonr   r   r   r   r   pandas.core.dtypes.dtypesr   r   r   pandas.core.dtypes.missingr   r   r   collections.abcr    r!   r   r"   r'   __annotations__r1   rP   r[   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"  r%  r+  r2  r5  r:  r=  r/  r7  rG  r  rJ  r   rY   r2   r0   <module>rl     s9     # " " " " "                        $ $ $ $ $ $         
              ? > > > > > 4 4 4 4 4 4                      
           R((((((      !"PQHQQQQ   L L L L^ 
 %(% % % % % 
% 
0 0 0 
0       4 322
  
$   &$ $ $ $N         *       N $!!	=* =* =* =* =*@   2 $6:!	m m m m mj 
J J J J Jb "#/ / / / /l , , , , ,f *659S S S S Sp */6:)6 )6 )6 )6 )6Z 26       6  6:)-	
 
 
 
 
  6:)-	
 
 
 
 
  6:)-	      6:)-	    $' ' ' '4   >  \::> > > > >9 9 9 9@E @E @E @E @E @Er2   