
    bMhƉ                       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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 m!Z! ddl"m#Z# ddl$m%Z%m&Z&m'Z' erddl(m)Z) dzdZ*d{dZ+e
ddd|d            Z,e
d}d"            Z,d#dd~d%Z,g d&Z-g d'Z.dd+Z/dd/Z0dd2Z1dd6Z2dd9Z3dd:Z4	 	 	 	 	 	 dddEZ5ddFZ6	 	 	 	 	 	 	 	 dddKZ7	 	 	 dddOZ8	 	 	 dddUZ9	 	 dddVZ:	 	 	 dddZZ;dd]Z<	 	 	 	 ddd_Z=	 dddaZ>dddZ?e?	 	 	 dddf            Z@e?	 	 	 dddg            ZAe?	 	 	 dddh            ZBe?	 	 	 dddi            ZCddkZDddlZEe@eAdmZFdddpZGddrZHddvZIddyZJdS )z$
Routines for filling missing data.
    )annotations)wraps)TYPE_CHECKINGAnyLiteralcastoverloadN)NaTalgoslib)	ArrayLikeAxisIntFReindexMethodnpt)import_optional_dependency)infer_dtype_from)is_array_likeis_bool_dtype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Index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      S/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/pandas/core/missing.pycheck_value_sizer)   3   sk     U u::&#e** & &#& &   dL    arrr   returnc                .   t          |          \  }}t          |t          j                  rt          j        ||          }nC|                                }t          j        |          s|g}|                    ||d          }d}t          | j                  rd}t          |            }t          |          }||          }t          j        | j        t                    }t          | j                  r)t          | j                  st          |j                  rnt          | j                  r)t          |j                  rt          |j                  sn|D ]}	t!          | |	          r|r5t          j        | j        t          j                  }
| |         |	k    |
|<   n<| |	k    }
t          |
t          j                  s|
                    t          d          }
||
z  }|                                r|t          |           z  }|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.   na_value)r   
isinstancenpr.   arrayconstruct_array_typer   is_list_like_from_sequencer   r   zerosshapeboolr   r   r   bool_ndarrayto_numpyany)r+   values_to_maskr.   clspotential_naarr_maskna_masknonnar    xnew_masks              r(   mask_missingrF   B   s   " -^<<E>%"" U.>>>((**// 	.,-N++N%e+TTLsy!! II:>""GG8$E 8CIT***D##!ci((! %+&&!
 	ci  !U[))! ek**!
 	 	! 	!A'Q// ! Q!x	BBBH),X!);HX&&"axH%h
;; Q#+#4#44%#4#P#P {{}} S		Kr*   .allow_nearestmethod,Literal['ffill', 'pad', 'bfill', 'backfill']rH   Literal[False]Literal['pad', 'backfill']c                   d S N rI   rH   s     r(   clean_fill_methodrQ      	     Cr*   7Literal['ffill', 'pad', 'bfill', 'backfill', 'nearest']Literal[True]%Literal['pad', 'backfill', 'nearest']c                   d S rN   rO   rP   s     r(   rQ   rQ      rR   r*   Fr9   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 )r1   strlowerappendr&   )rI   rH   valid_methods	expectings       r(   rQ   rQ      s    
 &#   WFFwFJ'M1I ?Y'''>	]""T9TTFTTUUUMr*   )lineartimeindexvalues)r\   zeroslinear	quadraticcubicbarycentrickroghspline
polynomialfrom_derivativespiecewise_polynomialpchipakimacubicspliner]   rd   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)rl   rm   z7You must specify the order of the spline or polynomial.zmethod must be one of z. Got 'z
' instead.)rk   ro   rp   z4 interpolation requires that the index be monotonic.)getr&   
NP_METHODS
SP_METHODSis_monotonic_increasing)rI   rd   kwargsrt   valids        r(   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   Mr*   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%   ndimr=   argmax)r|   r}   idxpos	chk_notnas       r(   find_valid_indexr      s     #####
8}}t}<<Q<''
g~~"""$$&&	X"Xddd^%:%:%<%<< I t Mr*   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'.r^   r&   )r   valid_limit_directionss     r(   validate_limit_directionr     sq     =<<%++--O444B%B B.=B B B
 
 	
 r*   
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     r(   validate_limit_arear     sn    %y1%%''
...!8I ! !! ! !   r*   -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)r[   rZ   r   r   )rY   rX   z0`limit_direction` must be 'forward' for method ``z1`limit_direction` must be 'backward' for method `)r&   )r   rI   s     r(   infer_limit_directionr   #  s     ***(OO'OO%%%/Y*F*FL6LLL   ****/L/LMFMMM   r*   c                   | dk    r1ddl m}  |t          j        t	          |                              }neh d}t          |j                  p3t          |j        t                    pt          j
        |j        d          }| |vr|st          d|  d          t          |                                          rt          d          |S )	Nrb   r   r   >   rc   rd   re   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   r2   aranger%   r   r.   r1   r   r   is_np_dtyper&   r   r=   NotImplementedError)rI   rd   r   methodsis_numeric_or_datetimes        r(   get_interp_indexr   8  s          biE

++,,888U[)) 2%+772u{D11 	
   )? !! ! !   E{{ 
!/
 
 	

 Lr*   rb   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)compatrc   zStime-weighted interpolation only works on Series or DataFrames with a DatetimeIndexre   N)nobsr   yvaluesr   r,   r   c                4    t          d| dd	 d S )NF)	indicesr   rI   r   r   r   r   bounds_errorr    rO   )_interpolate_1d)	r   r   r   ry   r   limit_area_validatedr   r    rI   s	    r(   funcz$interpolate_2d_inplace.<locals>.func  sP     	 	
++!	
 	
 	
 	
 	
 	
 	
r*   )r   r   r,   r   )r{   r   r.   r   r   r&   r   r   r   validate_limit_index_to_interp_indicesr2   apply_along_axis)r   rd   r   rI   r   r   r   r   r    ry   r   r   r   s      ``` ``` @@r(   interpolate_2d_inplacer   W  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)))))r*   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.
    i8rb   )re   rd   )_valuesr   r.   viewr   r2   r;   asarrayobject_r   maybe_convert_objects)rd   rI   xarrindss       r(   r   r     s     =D4:&& yyBJ%%z$(((zRZ''066Kr*   r   r   r   rt   c
                   |	|	}nt          |          }| }|                                sdS |                                rdS t          t	          j        |                    }t          d|          }|d}t          t          |                    }t          d|          }|t          |          }t          t          d|z   t          |                              }|dk    r"|t          t          ||d                    z  }nF|dk    r"|t          t          |d|                    z  }nt          t          |||                    }|d	k    r	|||z  z  }n|d
k    r||z
  |z
  }||z  }t          |          }|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   r   r   )rI   r   r   rt   FT)r   r=   allsetr2   flatnonzeror   ranger%   _interp_limitsortedr.   kindr   rv   argsortinterp_interpolate_scipy_wrapperr
   r'   nan)r   r   rI   r   r   r   r   r   rt   r    ry   invalidrz   all_nansfirst_valid_index
start_nanslast_valid_indexend_nanspreserve_nansmid_nansis_datetimelikeindexers                         r(   r   r     s   0 w--HE99;; yy{{  2>'**++H(WuEEE U,--..J'FUCCCw<<5--s5zz::;;H )##"Swq)I)I%J%JJ	J	&	& 3}Wa'G'G#H#HH M'5%@@AA Xh..	y	 	 j(83! =))Mm(D0O %,,t$$ *WU^,,9GgenW5wu~g7N
 
 6ENENG	
 !%	
 	
 	
 	
 QQQ"]	 (!$!#
Fr*   rD   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|} ||          }ns| 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)rj   rk   rn   ro   rr   rq   rp   )r\   rf   rg   rh   ri   rm   rm   )r   r   r   rl   z;order needs to be specified and greater than 0; got order: k)r   r   r   r2   r   barycentric_interpolatekrogh_interpolate_from_derivatives_cubicspline_interpolate_akima_interpolatepchip_interpolateinterp1dr   r&   UnivariateSplineflags	writeabler/   )rD   r   r   rI   r   r   rt   ry   r   r   alt_methodsinterp1d_methodsr   terpnew_ys                  r(   r   r   %  s    555Ewe4444!!!!!!JuE #:.- 1/#. K   !!!\!!DDD##qt
 $ 
 
 U	8		;; 	5A::UeUU   ,{+AqDDEDVDDU w  	Aw  	A{$ 	!JJLLE6"Q5++F++Lr*   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   BPolyrn   reshape)	r   r   rD   rt   r   r   r   rI   ms	            r(   r   r   l  sW    R "!!!!! /Fr2::b!$$ULLLA1Q44Kr*   c                X    ddl m} |                    | ||          } |||          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   Akima1DInterpolator)r   r   rD   r   r   r   Ps          r(   r   r     sC    T "!!!!!''BT'::A1Q3<<<r*   
not-a-knotbc_typestr | tuple[Any, Any]c                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   rD   r   r  r   r   r  s           r(   r   r     sK    Z "!!!!!
BT7 	  	 	A 1Q44Kr*   re   Literal['inside', 'outside']c                x   t          |           }| }|                                st          d|          }|d}t          d|          }|t          |           }t	          | |||           |dk    rd|||d	z   <   n'|d
k    rdx|d|<   ||d	z   d<   nt          d          t          j        | |<   dS 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   )rI   r   r   r   Fr   r   z*limit_area should be 'inside' or 'outside')r   r   r   r%   pad_or_backfill_inplacer&   r2   r   )re   rI   r   r   r   r}   r   r   s           r(   _interpolate_with_limit_arear  %  s    2 6llGxH;;== ! Wx@@@=EFX>>><v;;D!		
 	
 	
 	
 !!(-GED1H$%%9$$499GFUFOgdQhjj11IJJJ&w-! !r*   rY   c                $   |dk    rd nd }| j         dk    r?|dk    rt          d          |                     t          d| j        z                       } 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 rN   rO   rD   s    r(   <lambda>z)pad_or_backfill_inplace.<locals>.<lambda>v  s     r*   c                    | j         S rN   )Tr  s    r(   r  z)pad_or_backfill_inplace.<locals>.<lambda>v  s     r*   r   z0cannot interpolate on a ndim == 1 with axis != 0r   r   )r   )r   r   N)r   AssertionErrorr   tupler8   rQ   get_fill_func)re   rI   r   r   r   transftvaluesr   s           r(   r  r  Z  s    8 #aiikkkmmF {a199 !STTTdV\&9 : :;;v&&FfVnnGa(((DD*555555r*   npt.NDArray[np.bool_] | Nonec                (    |t          |           }|S rN   )r   )re   r    s     r(   _fillna_prepr    s    
 |F||Kr*   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   r.   r   r   )re   r   r   r    resultr   s        r(   new_funcz&_datetimelike_compat.<locals>.new_func  s     v|,, 	3|F||4D!!:D  LFD ;;v|,,d22tF%JTJJJJr*   NNN)r   r~   r   r   )r   r   r   )r   r  s   ` r(   _datetimelike_compatr!    s\    
 4[[ !:>	K K K K K K [K$ 8r*   (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re   r   r   r    s       r(   _pad_1dr(    sX     %%DdhhjjD*---	fd%00004<r*   c                    t          | |          }|$|                                st          ||           t          j        | ||           | |fS r$  )r  r   r%  r   backfill_inplacer'  s       r(   _backfill_1dr+    sX     %%DdhhjjD*---	64u55554<r*   c                    t          | |          }|t          ||           | j        rt          j        | ||           n	 | |fS r$  )r  _fill_limit_area_2dsizer   pad_2d_inplacer'  s       r(   _pad_2dr0    s]     %%DD*---{ VT77777 	4<r*   c                    t          | |          }|t          ||           | j        rt          j        | ||           n	 | |fS r$  )r  r-  r.  r   backfill_2d_inplacer'  s       r(   _backfill_2dr3    s]     %%DD*---{ !&$e<<<<< 	4<r*   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        r(   r%  r%    s      uHOOEx==8DDbD>00222Q6DXVeV TAXZZ	y	 	 !&UQY 
!	 r*   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  r2   maximum
accumulate)r    r   r6  la_masks       r(   r-  r-    s     wHY J!!(!33j##HTTrTN#;;DDbDAB 	 Z""8!"444z$$Xddd^!$<<TTrTBBC 	 DOOOr*   rY   r[   r   r   c                p    t          |           } |dk    rt          |          S t          t          d|          S )Nr   r;  )rQ   _fill_methodsr0  r3  )rI   r   s     r(   r  r  *  s6    v&&FqyyV$$55f==r*   ReindexMethod | Nonec                ,    | d S t          | d          S )NTrG   )rQ   )rI   s    r(   clean_reindex_fill_methodr@  1  s    ~tV48888r*   r   fw_limitbw_limitc                   t          |           t                      }t                      }dfd}|:|dk    r(t          t          j        |           d                   }n || |          }|Y|dk    r|S t	           || ddd         |                    }t          dz
  t          j        |          z
            }|dk    r|S ||z  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           	     \   t          |          }t          | |dz                                 d          }t          t	          j        |          d         |z             t          t	          j        | d |dz                                             dk              d                   z  }|S )Nr   r   )min_rolling_windowr   r   r2   wherecumsum)r   r   windowedidxNs       r(   innerz_interp_limit.<locals>.inner\  s    E1"7EAI66::1=="(8$$Q'%/003Hw{{++3355:;;A>4
 4
 
 
r*   Nr   r   r   )r   r#   )r%   r   r2   rG  listr   )r   rA  rB  f_idxb_idxrL  	b_idx_invrK  s          @r(   r   r   7  s    B 	GAEEEEEE      q==))!,--EEE'8,,Eq== LUU744R4=(;;<<IA
9 5 5566E1}}5=r*   awindowc                    | j         dd         | j         d         |z
  dz   |fz   }| j        | j        d         fz   }t          j        j                            | ||          S )z
    [True, True, False, True, False], 2 ->

    [
        [True,  True],
        [True, False],
        [False, True],
        [True, False],
    ]
    Nr   r   )r8   strides)r8   rT  r2   r   stride_tricks
as_strided)rQ  rR  r8   rT  s       r(   rF  rF  x  sb     GCRCLAGBK&014f==Ei19R=**G6**1E7*KKKr*   )r    r!   r"   r#   )r+   r   r,   r!   )rI   rJ   rH   rK   r,   rL   )rI   rS   rH   rT   r,   rU   )rI   rS   rH   r9   r,   rU   )rI   r]   rd   r   r,   r]   )r|   r]   r}   r!   r,   r~   )r   r]   r,   r   )r   r   r,   r   )r   r   rI   r]   r,   r   )rd   r   r,   r   )rb   Nr   NNN)r   r   rd   r   r   r   rI   r]   r   r~   r   r]   r   r   r   r   r,   r   )rd   r   rI   r]   r,   r   )rb   Nr   NNFNN)r   r   r   r   rI   r]   r   r~   r   r]   r   r   r   r   r   r9   rt   r~   r,   r   )NFN)
rD   r   r   r   r   r   rI   r]   r   r9   )Nr   F)
r   r   r   r   rD   r   r   r   r   r9   )r   r   )
r   r   r   r   rD   r   r   r   r   r   )r   r  N)
r   r   r   r   rD   r   r   r   r  r  )
re   r   rI   rL   r   r~   r   r	  r,   r   )rY   r   NN)re   r   rI   rL   r   r   r   r~   r   r   r,   r   rN   )r    r  r,   r!   )r   r   r,   r   r   )
re   r   r   r~   r   r   r    r  r,   r"  )re   r   r   r~   r   r   r    r  )r   r~   r   r   r    r  )r    r!   r   r4  r,   r   r  )r   r#   )r,   r>  )r   r!   rA  r~   rB  r~   )rQ  r!   rR  r#   r,   r!   )K__doc__
__future__r   	functoolsr   typingr   r   r   r   r	   numpyr2   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   r   pandas.core.dtypes.dtypesr   pandas.core.dtypes.missingr   r   r   r   r   r)   rF   rQ   rv   rw   r{   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r!  r(  r+  r0  r3  r%  r-  r=  r  r@  r   rF  rO   r*   r(   <module>rc     s    # " " " " "                                
              ? > > > > > 4 4 4 4 4 4                6 5 5 5 5 5              F F F FR 
 %(     
 
   
       4 322
  
$   &# # # #L         *   F $!!	C* C* C* C* C*L   2 $6:!	o o o o on 
D D D D DV "#/ / / / /l #$. . . . .j %1S S S S Sl2! 2! 2! 2!n */6:)6 )6 )6 )6 )6Z 26       6  6:)-	
 
 
 
 
  6:)-	
 
 
 
 
  6:)-	    $  6:)-	    $' ' ' '4   >  \::> > > > >9 9 9 9> > > >BL L L L L Lr*   