
    d8y                    P   d Z ddlmZ ddlmZmZ ddl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 ddlm Z m!Z!m"Z" erddl#m$Z$ d`dZ%dadZ&dbdcdZ'g dZ(g dZ)ddd!Z*ded%Z+	 	 	 	 	 	 	 	 	 dfdgd5Z,	 	 	 	 	 dhdid7Z-djd8Z.	 	 	 	 	 	 	 dkdld=Z/	 	 	 dmdnd>Z0	 dodpdBZ1dqdrdCZ2	 	 	 dsdtdGZ3dudIZ4	 	 	 	 dvdwdKZ5	 dxdydMZ6dzdPZ7e7	 	 d{d|dR            Z8e7	 	 d{d|dS            Z9e7d{d}dT            Z:e7d{d~dU            Z;e8e9dVZ<dddYZ=ddZZ>dd\Z?dd_Z@dS )z$
Routines for filling missing data.
    )annotations)partialwraps)TYPE_CHECKINGAnycastN)NaTalgoslib)	ArrayLikeAxisAxisIntFnpt)import_optional_dependency)infer_dtype_from)is_array_likeis_numeric_v_string_likeis_object_dtypeneeds_i8_conversion)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      O/var/www/html/t/fyr/venv311/lib/python3.11/site-packages/pandas/core/missing.pycheck_value_sizer$   1   sk     U u::&#e** & &#& &   dL    arrr   returnc                t   t          |          \  }}t          j        ||          }d}t          |           rd}t	          |            }t	          |          }||          }t          j        | j        t                    }|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]
    )dtypeFT)r)   na_value)r   nparrayr   r   zerosshapeboolr   bool_
isinstancendarrayto_numpyany)
r&   values_to_maskr)   potential_naarr_maskna_masknonnar   xnew_masks
             r#   mask_missingr<   @   sF   " -^<<E>
 XnE:::NLs II:>""GG8$E 8CIT***D  #C++ 	 M8CIRX>>>%(]a%7""!8!(BJ77 M'00te0LLHHDD{{}} S		Kr%   Fmethod
str | Noneallow_nearestr/   c                    | dv rd S 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)Nasfreq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!   )r=   r?   valid_methods	expectings       r#   clean_fill_methodrL   y   s    !!!t&#  WFFwFJ'M1I ?Y'''>	]""T9TTFTTUUUMr%   )lineartimeindexvalues)rF   zeroslinear	quadraticcubicbarycentrickroghspline
polynomialfrom_derivativespiecewise_polynomialpchipakimacubicsplinerG   rO   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)rW   rX   z7You must specify the order of the spline or polynomial.zmethod must be one of z. Got 'z
' instead.)rV   rZ   r[   z4 interpolation requires that the index be monotonic.)getr!   
NP_METHODS
SP_METHODSis_monotonic_increasing)r=   rO   kwargsr_   valids        r#   clean_interp_methodrf      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 )
aG  
    Retrieves the index of the first valid value.

    Parameters
    ----------
    values : ndarray or ExtensionArray
    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      axisrk   rl   )r    ndimr4   argmax)rP   rg   rh   idxpos	chk_notnas        r#   find_valid_indexrv      s    $ #####
6{{at{a<<Q<''
g~~"""$$&&	Vq8DDbD>#8#8#:#:: I t Mr%   rC   forwarddata
np.ndarrayrp   r   Index | Nonelimitlimit_direction
limit_area
fill_value
Any | NonecoercedowncastNonec
                    	 t          |          }n# t          $ r d}Y nw xY w|'|t          d          t          | ||||           dS |J t          d| |||||||d|
 dS )z
    Wrapper to dispatch to either interpolate_2d or _interpolate_2d_with_fill.

    Notes
    -----
    Alters 'data' in-place.
    Nz&Cannot pass both fill_value and method)r=   rp   r{   r}   )rx   rO   rp   r=   r{   r|   r}   r~    )rL   r!   interpolate_2d_interpolate_2d_with_fill)rx   r=   rp   rO   r{   r|   r}   r~   r   r   rd   ms               r#   interpolate_array_2dr      s    (f%%    	}!EFFF!	
 	
 	
 	
 	
 	
    ! 
	
+!!
	
 
	
 
	
 
	
 
	
 
	
 
	
s    !!rM   c                8   t          |fi  t          | j                  rt          | j        d          dk    r%t	          |j                  st          d          dg d}	                                |	vrt          d|	 d d	          2ddg}
                                |
vrt          d|
 d d          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)compatrN   zStime-weighted interpolation only works on Series or DataFrames with a DatetimeIndexrP   )rw   backwardbothz*Invalid limit_direction: expecting one of z, got 'z'.Ninsideoutsidez%Invalid limit_area: expecting one of z, got .)nobsr{   yvaluesry   r'   r   c                2    t          d| dd d S )NF)indicesr   r=   r{   r|   r}   r~   bounds_errorr   )_interpolate_1d)r   r~   r   rd   r{   r}   r|   r=   s    r#   funcz'_interpolate_2d_with_fill.<locals>.funcR  sM     	 
	
+!!
	
 
	
 
	
 
	
 
	
 
	
 
	
r%   )r   ry   r'   r   )rf   r   r)   r   r   r!   rH   r
   validate_limit_index_to_interp_indicesr+   apply_along_axis)rx   rO   rp   r=   r{   r|   r}   r~   rd   valid_limit_directionsvalid_limit_areasr   r   s      ``````   @r#   r   r     s   , 00000Z44 B'
5AAA
"5;// 	   
 <<<%++--O444B%B B.=B B B
 
 	

 %y1%%''
...!8I ! !! ! !    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.
    i8rM   )rP   rO   )_valuesr   r)   viewr   r+   r2   asarrayobject_r   maybe_convert_objects)rO   r=   xarrindss       r#   r   r   j  s     =D4:&& yyBJ%%z$(((zRZ''066Kr%   r   r   r   r_   c	                   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          |          }t          |j                  }|r|                    d          }|t          v rRt	          j        | |                   }t	          j        | |
         | |         |         ||         |                   ||
<   n)t#          | |         ||         | |
         f||||d|	||
<   |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.
    Nrk   rg   rh   r   rl   rn   rw   r   r   r   r   )r=   r~   r   r_   )r   r4   allsetr+   flatnonzerorv   ranger    _interp_limitsortedr   r)   r   ra   argsortinterp_interpolate_scipy_wrapperr	   r"   nan)r   r   r=   r{   r|   r}   r~   r   r_   rd   invalidre   all_nansfirst_valid_index
start_nanslast_valid_indexend_nanspreserve_nansmid_nansis_datetimelikeindexers                        r#   r   r     s   0 7mmGHE99;; yy{{  2>'**++H(gNNN U,--..J'VeLLL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)'-88O %,,t$$ *WU^,,9GgenW5wu~g7N
 
 6ENENG	
 !%	
 	
 	
 	
  (!$!#
Fr%   c                f   | d}t          d|           ddlm}	 t          j        |          }|	j        |	j        t          t          d}
t          | dd          r/| j	        
                    d	          |
                    d	          }} |d
k    r|	j        |
d
<   n!|dk    rt          |
d<   n|dk    r
t          |
d<   g d}||v r.|dk    r|}|	                    | ||||          } ||          }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)rU   rV   rY   rZ   _is_all_datesFr   r[   r\   r]   )rF   rQ   rR   rS   rT   rX   rX   )kindr~   r   rW   z;order needs to be specified and greater than 0; got order: k)r   r   r   r+   r   barycentric_interpolatekrogh_interpolate_from_derivativesgetattrr   astypepchip_interpolate_akima_interpolate_cubicspline_interpolateinterp1dr   r!   UnivariateSplineflags	writeablecopy)r:   ynew_xr=   r~   r   r_   rd   r   r   alt_methodsinterp1d_methodsterpnew_ys                 r#   r   r     s9    555Ewe4444!!!!!!JuE #:.- 1	 K q/5)) >9##D))5<<+=+=5*<G	7		1G	=	 	 %=M"   !!!\!!F##qv*< $ 
 
 U	8		;; 	5A::UeUU   ,{+AqDDEDVDDU w  	Aw  	A{$ 	!JJLLEV$q!U--f--Lr%   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   rq   rn   )ordersr   )r   r   BPolyrY   reshape)	xiyir:   r_   r   r   r   r=   r   s	            r#   r   r   9  sW    H "!!!!! /Fr2::b!$$ULLLA1Q44Kr%   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 : array-like
        A sorted list of x-coordinates, of length N.
    yi : array-like
        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 : scalar or array-like
        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   ro   )nu)r   r   Akima1DInterpolator)r   r   r:   r   rp   r   Ps          r#   r   r   f  sC    H "!!!!!''BT'::A1Q3<<<r%   
not-a-knotbc_typestr | tuple[Any, Any]c                X    ddl m} |                    | ||||          } ||          S )aq  
    Convenience function for cubic spline data interpolator.

    See `scipy.interpolate.CubicSpline` for details.

    Parameters
    ----------
    xi : array-like, shape (n,)
        1-d array containing values of the independent variable.
        Values must be real, finite and in strictly increasing order.
    yi : array-like
        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 : scalar or array-like, 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   )rp   r   r   )r   r   CubicSpline)r   r   r:   rp   r   r   r   r   s           r#   r   r     sK    Z "!!!!!
BT7 	  	 	A 1Q44Kr%   rP   c                Z   t          |           }| }|                                st          | d|          }|d}t          | d|          }|t          |           }t	          | ||           |dk    rd|||d	z   <   n|d
k    rdx|d|<   ||d	z   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: str
        Limit area for interpolation. Can be "inside" or "outside"

    Notes
    -----
    Modifies values in-place.
    rk   r   Nr   rl   )r=   r{   r   Frn   r   )r   r   rv   r    r   r+   r   )rP   r=   r{   r}   r   rh   rk   rl   s           r#   _interpolate_with_limit_arear     s    , 6llGxH;;== ! WxHHH=EFXFFF<v;;D	
 	
 	
 	
 !!(-GED1H$%%9$$499GFUFOgdQhjj1&w'! !r%   r   c                   |.t          j        t          t          |||          ||            dS |dk    rd nd }| j        dk    r?|dk    rt          d          |                     t          d| j        z                       } t          |          } ||           }|d	k    rt          ||
           nt          ||
           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)r=   r{   r}   r   c                    | S Nr   r:   s    r#   <lambda>z interpolate_2d.<locals>.<lambda>I  s     r%   c                    | j         S r   )Tr   s    r#   r   z interpolate_2d.<locals>.<lambda>I  s     r%   rn   z0cannot interpolate on a ndim == 1 with axis != 0rn   rC   r{   )r+   r   r   r   rr   AssertionErrorr   tupler.   rL   _pad_2d_backfill_2d)rP   r=   rp   r{   r}   transftvaluess          r#   r   r     s    8 
 ,%	   %	
 	
 	
( 	"aiikkkmmF {a199 !STTTdV\&9 : :;;v&&FfVnnG u%%%%%WE****
Fr%   npt.NDArray[np.bool_] | Nonec                f    |t          |           }|                    t          j                  }|S r   )r   r   r+   uint8)rP   r   s     r#   _fillna_prepr   ]  s,    
 |F||99RXDKr%   r   r   c                d     t                     d fd	            }t          t          |          S )z>
    Wrapper to handle datetime64 and timedelta64 dtypes.
    Nc                    t          | j                  rQ|t          |           } |                     d          ||          \  }}|                    | j                  |fS  | ||          S )Nr   )r{   r   )r   r)   r   r   )rP   r{   r   resultr   s       r#   new_funcz&_datetimelike_compat.<locals>.new_funcn  s{    v|,, 	3|F||4D 1 1TJJJLFD;;v|,,d22tF%d3333r%   NN)r   r   r   )r   r   s   ` r#   _datetimelike_compatr  i  sE    
 4[[	4 	4 	4 	4 	4 [	4 8r%   (tuple[np.ndarray, npt.NDArray[np.bool_]]c                X    t          | |          }t          j        | ||           | |fS Nr   )r   r
   pad_inplacerP   r{   r   s      r#   _pad_1dr  }  s5     %%D	fd%00004<r%   c                X    t          | |          }t          j        | ||           | |fS r  )r   r
   backfill_inplacer  s      r#   _backfill_1dr    s5     %%D	64u55554<r%   c                    t          | |          }t          j        | j                  rt	          j        | ||           n	 | |fS r  )r   r+   r   r.   r
   pad_2d_inplacer  s      r#   r   r     sO    %%D	vfl VT77777 	4<r%   c                    t          | |          }t          j        | j                  rt	          j        | ||           n	 | |fS r  )r   r+   r   r.   r
   backfill_2d_inplacer  s      r#   r   r     sO    %%D	vfl !&$e<<<<< 	4<r%   rC   rE   rn   rr   c                p    t          |           } |dk    rt          |          S t          t          d|          S )Nrn   r  )rL   _fill_methodsr   r   )r=   rr   s     r#   get_fill_funcr    s6    v&&FqyyV$$55f==r%   c                $    t          | d          S )NT)r?   )rL   )r=   s    r#   clean_reindex_fill_methodr    s    V48888r%   r   c                   t          |           t                      }t                      }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
    c           	     \   t          |          }t          | |dz                                 d          }t          t	          j        |          d         |z             t          t	          j        | d |dz                                             dk              d                   z  }|S )Nrn   r   )min_rolling_windowr   r   r+   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   rq   rn   )r    r   r+   r  listr   )r   fw_limitbw_limitf_idxb_idxr  	b_idx_invr  s          @r#   r   r     s    > 	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],
    ]
    Nrq   rn   )r.   strides)r.   r)  r+   r   stride_tricks
as_strided)r&  r'  r.   r)  s       r#   r  r    sb     GCRCLAGBK&014f==Ei19R=**G6**1E7*KKKr%   )r   r   r   r   )r&   r   r'   r   )F)r=   r>   r?   r/   )r=   rG   rO   r   r'   rG   )rg   rG   rh   r   r'   ri   )	rC   r   NNrw   NNFN)rx   ry   r=   rG   rp   r   rO   rz   r{   ri   r|   rG   r}   r>   r~   r   r   r/   r   r>   r'   r   )rM   Nrw   NN)rx   ry   rO   r   rp   r   r=   rG   r{   ri   r|   rG   r}   r>   r~   r   r'   r   )rO   r   r=   rG   r'   ry   )rM   Nrw   NNFN)r   ry   r   ry   r=   r>   r{   ri   r|   rG   r}   r>   r~   r   r   r/   r_   ri   r'   r   )NFN)r   r/   )Nr   F)r   r   r   r/   )r   r   )r   r   rp   r   )r   r   N)rp   r   r   r   )
rP   ry   r=   rG   r{   ri   r}   r>   r'   r   )rC   r   NN)rP   ry   r=   rG   rp   r   r{   ri   r}   r>   r'   r   r   )r   r   r'   r   )r   r   r'   r   r  )rP   ry   r{   ri   r   r   r'   r  )rP   ry   r   r   )r   r   r   )rr   r   )r'   r>   )r   r   )r&  r   r'  r   r'   r   )A__doc__
__future__r   	functoolsr   r   typingr   r   r   numpyr+   pandas._libsr	   r
   r   pandas._typingr   r   r   r   r   pandas.compat._optionalr   pandas.core.dtypes.castr   pandas.core.dtypes.commonr   r   r   r   pandas.core.dtypes.missingr   r   r   pandasr   r$   r<   rL   ra   rb   rf   rv   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>r8     s    # " " " " "                             
              ? > > > > > 4 4 4 4 4 4                         6 6 6 6r    0 322
  
$   && & & &V $!!2
 2
 2
 2
 2
r $!!O* O* O* O* O*d   2 "$!!i i i i ib 
J J J J J\ QV* * * * *Z( ( ( ( (^ %1S S S S Sl,! ,! ,! ,!b !D D D D DP 26	 	 	 	 	   (  )-      )-                \::> > > > >9 9 9 9< < < <~L L L L L Lr%   