o
    i6                    @  s  d dl mZ d dlmZ d dlZd dlmZmZmZm	Z	m
Z
mZmZ d dlZd dlZd dl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$ d dl%m&Z& d dl'm(Z( d dl)m*Z* d dl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: d dl;m<Z<m=Z=m>Z>m?Z? d dl@mAZAmBZBmCZCmDZD d dlEmFZF d dlGmHZHmIZImJZJ d dlKmL  mMZN d dlOmPZPmQZQmRZRmSZSmTZT d dlUmVZV d dlWmXZXmYZYmZZZ d dl[m\Z\ d dl]m^Z^m_Z_m`Z`maZambZbmcZcmdZd d dlemfZf d dlgmhZh d dlimL  mjZk d dllmL  mm  mnZn d dlompZpmqZq d dlrmsZs d dltmL  muZu erDd dlvmwZwmxZx d dlymzZz e{dZ|dcd#d$Z}G d%d& d&ehZ~G d'd( d(e~ZG d)d* d*ej~eZG d+d, d,eje~ZG d-d. d.eZG d/d0 d0ejeZddd4d5ZG d6d7 d7eZG d8d9 d9eZG d:d; d;eZG d<d= d=eZded@dAZdfdDdEZdgdHdIZdhdLdMZdidNdOZdjdSdTZdkdldVdWZdmdndYdZZd[ddd\d]dod_d`ZdedadbZdS )p    )annotations)wrapsN)TYPE_CHECKINGAnyCallableIterableSequencecastfinal)	Timestamp	internalslibwriters)BlockPlacement)IncompatibleFrequency)	ArrayLikeDtypeObjFIgnoreRaiseShapenptAbstractMethodError)cache_readonly)find_stack_level)validate_bool_kwarg)astype_array_safe)LossySetitemErrorcan_hold_elementfind_result_typemaybe_downcast_to_dtypenp_can_hold_elementsoft_convert_objects)ensure_platform_intis_1d_only_ea_dtypeis_1d_only_ea_objis_dtype_equalis_interval_dtypeis_list_like	is_sparseis_string_dtype)CategoricalDtypeExtensionDtypePandasDtypePeriodDtype)ABCDataFrameABCIndexABCPandasArray	ABCSeries)is_inferred_bool_dtype)is_valid_na_for_dtypeisnana_value_for_dtype)extract_bool_arrayputmask_inplaceputmask_without_repeatsetitem_datetimelike_compatvalidate_putmask)quantile_compat)compare_or_regex_searchreplace_regexshould_use_regex)shift)CategoricalDatetimeArrayExtensionArrayIntervalArrayPandasArrayPeriodArrayTimedeltaArray)SparseDtype)PandasObject)ensure_wrapped_if_datetimelikeextract_array)check_setitem_lengths)Float64IndexIndex)NDArrayBackedExtensionArrayobjectmethr   returnc                   s    t  d fdd}tt|S )zp
    If we have a multi-column block, split and operate block-wise.  Otherwise
    use the original method.
    rR   list[Block]c                   sF   | j dks| jd dkr | g|R i |S | j g|R i |S )N   r   )ndimshapesplit_and_operate)selfargskwargsrQ    W/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/pandas/core/internals/blocks.pynewfunc   s   zmaybe_split.<locals>.newfuncNrR   rS   )r   r	   r   )rQ   r^   r\   r[   r]   maybe_split{   s   
r`   c                   @  sl  e Zd ZU dZded< ded< ded< dZd	Zd	Zd	Zd
Z	d
Z
eedd ZeedddZeedddZeedddZedd Zeedd Zedd ZedddZejdd dZeddd"d#Ze	!ddd&d'Zedd)d*Zedd+d,Zedd/d0Zedd2d3Zedd6d7Zedd:d;Zedd=d>Zddd@dAZ eddCdDZ!eddEdFZ"eddGdHZ#eddIdJZ$edddLdMZ%ee&ddNdOZ'	
	
	
	
dddTdUZ(eddWdXZ)e	Yddd]d^Z*eddd`daZ+edddcddZ,e			!dddhdiZ-e			
	!dddkdlZ.e				dddrdsZ/e	
		dddudvZ0ddydzZ1d{d| Z2edd~dZ3dddZ4dddZ5ddddZ6d!e7j8fdddZ9dddZ:dddZ;dddZ<ddddZ=	!ddddZ>			!			!		!	!	!ddddZ?ddddZ@ddddZAe	ddddZBdddZCedddZDedddZEddddZFdddZGd!S )Blockz
    Canonical n-dimensional unit of homogeneous dtype contained in a pandas
    data structure

    Index-ignorant; let the container take care of that
    np.ndarray | ExtensionArrayvaluesintrU   r   __init__r\   FTc                 C  s   | j | jjfS N)_can_consolidatedtypenamerX   r\   r\   r]   _consolidate_key   s   zBlock._consolidate_keyrR   boolc                 C  s"   | j }t|tj r|jdvS |jS )z7
        Can we store NA values in this Block?
        )biu)rh   
isinstancenpkind_can_hold_narX   rh   r\   r\   r]   rs      s   
zBlock._can_hold_nac                 C  s   t jdtt d t| jtS )NzBlock.is_categorical is deprecated and will be removed in a future version.  Use isinstance(block.values, Categorical) instead. See https://github.com/pandas-dev/pandas/issues/40226
stacklevel)warningswarnDeprecationWarningr   rp   rc   rA   rj   r\   r\   r]   is_categorical   s   zBlock.is_categoricalc                 C  
   t | jS )z^
        We can be bool if a) we are bool dtype or b) object dtype with bool objects.
        )r3   rc   rj   r\   r\   r]   is_bool   s   
zBlock.is_boolc                 C  r{   rf   )external_valuesrc   rj   r\   r\   r]   r}         
zBlock.external_valuesc                 C  s   t | jddS )NF)compat)r6   rh   rj   r\   r\   r]   
fill_value      zBlock.fill_valuec                 C  s    | j tkrt|| j r| j}|S rf   )rh   
_dtype_objr4   r   rX   valuer\   r\   r]   _standardize_fill_value   s   zBlock._standardize_fill_valuer   c                 C     | j S rf   	_mgr_locsrj   r\   r\   r]   mgr_locs      zBlock.mgr_locsnew_mgr_locsNonec                 C  s
   || _ d S rf   r   )rX   r   r\   r\   r]   r      r~   Nc                 C  s2   |du r| j }| jrt|| jd}t||| jdS )zm
        Create a new block, with type inference propagate any values that are
        not specified
        NrU   	placementrU   )r   is_extensionensure_block_shaperU   	new_block)rX   rc   r   r\   r\   r]   
make_block   s
   zBlock.make_blockr   BlockPlacement | Nonec                 C  sT   |du r| j }|jjdv r t|}||urtjdtt d |}t| ||| j	dS )z2Wrap given values in a block of same type as self.N)mMzIn a future version, Block.make_block_same_class will assume that datetime64 and timedelta64 ndarrays have already been cast to DatetimeArray and TimedeltaArray, respectively.ru   r   )
r   rh   rr   rJ   rw   rx   ry   r   typerU   )rX   rc   r   
new_valuesr\   r\   r]   make_block_same_class   s   zBlock.make_block_same_classstrc                 C  sl   t | j}| jdkr| dt|  d| j }|S ddd | jD }| d| jj d| d| j }|S )	NrT   z: z dtype: z x c                 S     g | ]}t |qS r\   )r   .0sr\   r\   r]   
<listcomp>      z"Block.__repr__.<locals>.<listcomp>z, z	, dtype: )	r   __name__rU   lenrh   joinrV   r   indexer)rX   ri   resultrV   r\   r\   r]   __repr__  s   

 zBlock.__repr__c                 C  r{   rf   )r   rc   rj   r\   r\   r]   __len__  r~   zBlock.__len__slicerslice | npt.NDArray[np.intp]c                 C  s<   | j | }| |}|j| jjkrtdt| ||| jS z
        Perform __getitem__-like, return result as block.

        Only supports slices that preserve dimensionality.
        z Only same dim slicing is allowed)r   _slicerU   rc   
ValueErrorr   rX   r   r   r   r\   r\   r]   getitem_block  s
   

zBlock.getitem_blockslicec                 C  s2   |  |}|j| jjkrtdt| ||| jS r   )r   rU   rc   r   r   r   r\   r\   r]   getitem_block_columns-  s   
	zBlock.getitem_block_columnselementr   c                 C  s   t |dd}t| j|S )z#require the same dtype as ourselvesTextract_numpy)rK   r   rc   )rX   r   r\   r\   r]   _can_hold_element=  s   zBlock._can_hold_elementr   r   c                 C  s$   z|j | j kW S  ty   Y dS w )z
        Should we set self.values[indexer] = value inplace or do we need to cast?

        Parameters
        ----------
        value : np.ndarray or ExtensionArray

        Returns
        -------
        bool
        F)rh   	TypeErrorr   r\   r\   r]   should_storeC  s
   zBlock.should_storerS   c                 K  s   || j fi |}| |S )z[
        apply the function to my values; return a block if we are not
        one
        )rc   _split_op_result)rX   funcrZ   r   r\   r\   r]   applyY  s   
zBlock.applyignore_failuresc              	   C  sv   | j dksJ z|| j}W n ttfy   |rg  Y S  w | jj dkr-t|gg}n|dd}| |}|gS )N   rT   )rU   rc   r   NotImplementedErrorrq   arrayreshaper   )rX   r   r   r   
res_valuesnbr\   r\   r]   reducec  s   
zBlock.reducer   c                 C  s|   |j dkr6t|jtr6g }t| jD ]!\}}t|s#|||d  }n|| }| j||d}|| q|S | |}|gS )NrT   )rc   r   )	rU   rp   rh   r,   	enumerater   r%   r   append)rX   r   nbsrn   locvalsblockr   r\   r\   r]   r   x  s   
zBlock._split_op_resultc                 C  sb   | j dksJ g }t| jD ] \}}| jt||d  }t|}t| ||dd}|| q|S )zD
        Split a block into a list of single-column blocks.
        r   rT   r   )rU   r   r   rc   r   r   r   r   )rX   
new_blocksrn   ref_locr   bpr   r\   r\   r]   _split  s   zBlock._splitc                 O  sR   | j dkr| jd dksJ g }|  D ]}||g|R i |}|| q|S )z
        Split the block and apply func column-by-column.

        Parameters
        ----------
        func : Block method
        *args
        **kwargs

        Returns
        -------
        List[Block]
        r   r   rT   )rU   rV   r   extend)rX   r   rY   rZ   
res_blocksr   rbsr\   r\   r]   rW     s   zBlock.split_and_operatec                 C  s   t | j|}| j|ddS )z
        coerce the current block to a dtype compat for other
        we will return a block, possibly object, and not raise

        we can also safely try to coerce to the same dtype
        and will receive the same block
        Fcopy)r   rc   astype)rX   other	new_dtyper\   r\   r]   coerce_to_target_dtype  s   	zBlock.coerce_to_target_dtypeblocksc                   sJ    du r|S | j tkrtdd |D S  d u r|S t fdd|D S )NFc                 S     g | ]	}|j d ddqS )TF)datetimenumericconvertr   blkr\   r\   r]   r         z)Block._maybe_downcast.<locals>.<listcomp>c                   s   g | ]}|  qS r\   )_downcast_2dr   rm   downcastr\   r]   r     s    )rh   r   extend_blocks)rX   r   r   r\   r   r]   _maybe_downcast  s   
zBlock._maybe_downcastc                 C  s   t | j|d}| |gS )zs
        downcast specialized to 2D case post-validation.

        Refactored to allow use of maybe_split.
        rh   )r    rc   r   )rX   rh   r   r\   r\   r]   r     s   zBlock._downcast_2dr   r   r   	timedeltac                 C  s   |r|   gS | gS )z
        attempt to coerce any object types to better types return a copy
        of the block (if copy = True) by definition we are not an ObjectBlock
        here!
        r   )rX   r   r   r   r   r\   r\   r]   r     s   zBlock.convertr   c                 C     | j jS rf   rc   rh   rj   r\   r\   r]   rh        zBlock.dtyperaiserh   errorsr   c                 C  sl   | j }t||||d}t|}| |}|j| jkr4td| d| jj d| j d|jj d|j d|S )a  
        Coerce to the new dtype.

        Parameters
        ----------
        dtype : np.dtype or ExtensionDtype
        copy : bool, default False
            copy if indicated
        errors : str, {'raise', 'ignore'}, default 'raise'
            - ``raise`` : allow exceptions to be raised
            - ``ignore`` : suppress exceptions. On error return original object

        Returns
        -------
        Block
        )r   r   zcannot set astype for copy = [z] for dtype (z [z]) to different shape (z]))rc   r   maybe_coerce_valuesr   rV   r   rh   ri   )rX   rh   r   r   rc   r   newbr\   r\   r]   r     s"   
zBlock.astypenanc                 K  s"   t | jf||d|}| |S )"convert to our native types format)na_repquoting)to_native_typesrc   r   )rX   r   r   rZ   r   r\   r\   r]   r     s   
zBlock.to_native_typesdeepc                 C  s(   | j }|r	| }t| || j| jdS )zcopy constructorr   )rc   r   r   r   rU   )rX   r   rc   r\   r\   r]   r      s   z
Block.copyinplacemasknpt.NDArray[np.bool_] | Nonec           
      C  sn  | j }t|tr|r| n|  }|j j||dd |gS | |s+|r&| gS |  gS |du r5t||}| sC|r>| gS |  gS | |rl|rL| n|  }t	|j || | j
r^|du sg|jddd}|S |g}|S | jdksx| jd dkr|du r| tt}n| |}|j||d|dS g }t|  D ]\}}	|t| j|	||d|||d  d q|S )	z
        replace the to_replace value with value, possible to create new
        blocks here this is just a call to putmask.
        T)
to_replacer   r   NFr   r   rT   r   r   r   r   r   )rc   rp   rA   r   _replacer   missingmask_missinganyr8   	is_objectr   rU   rV   r   rq   rh   rP   r   replacer   r   r   r   )
rX   r   r   r   r   rc   r   r   rn   r   r\   r\   r]   r   +  sV   



		zBlock.replacer   c           	      C  sb   |  |s|r
| gS |  gS t|}|r| jn| j }t|||| | |}|jdddS )aP  
        Replace elements by the given value.

        Parameters
        ----------
        to_replace : object or pattern
            Scalar to replace or regular expression to match.
        value : object
            Replacement object.
        inplace : bool, default False
            Perform inplace modification.
        convert : bool, default True
            If true, try to coerce any object types to better types.
        mask : array-like of bool, optional
            True indicate corresponding element is ignored.

        Returns
        -------
        List[Block]
        Fr   )r   r   recompilerc   r>   r   r   )	rX   r   r   r   r   r   rxr   r   r\   r\   r]   _replace_regex|  s   


zBlock._replace_regexsrc_listIterable[Any]	dest_listSequence[Any]regexc              	     sh  j fddt||D }t|s|rgS  gS t|d }tjr9t   fdd|D }n	fdd|D }dd |D }|rMn g}t|D ][\}	\}
}|	|k}g }t|D ]H\}}t|dkru||	 }n||	 }t|t	rJ |||d  }|j
|
|||d}|r|jrtdd	 |D std
d |D }|| qf|}qV|S )z:
        See BlockManager.replace_list docstring.
        c                   s"   g | ]\}}  |r||fqS r\   )r   )r   xyrj   r\   r]   r     s
    z&Block.replace_list.<locals>.<listcomp>rT   c                   s    g | ]}t |d   dqS )r   )r  r   )r=   r   )r   r  rc   r\   r]   r     s    c                   s   g | ]
}t  |d  qS r   )r   r   r   rc   r\   r]   r         c                 S  r   r\   )r7   r   r	  r\   r\   r]   r     r   )r   r   r   r   r  c                 s  s    | ]}|d u V  qd S rf   r\   r  r\   r\   r]   	<genexpr>  s    z%Block.replace_list.<locals>.<genexpr>c                 S  r   )FTr   r   r   r\   r\   r]   r     r   )rc   zipr   r   r*   rh   r5   r   rp   rl   _replace_coercer   allr   r   )rX   r  r  r   r  pairssrc_lenmasksrbrn   srcdestr   new_rbblk_numr   r   mibr   r\   )r   r  rX   rc   r]   replace_list  sL   



zBlock.replace_listnpt.NDArray[np.bool_]c                 C  s   t ||r| j|||d|dS |du r?| r5| jttdd}|| u r+|s+| }t|j	|| |gS |r:| gS |  gS | j
||||dS )ai  
        Replace value corresponding to the given boolean array with another
        value.

        Parameters
        ----------
        to_replace : object or pattern
            Scalar to replace or regular expression to match.
        value : object
            Replacement object.
        mask : np.ndarray[bool]
            True indicate corresponding element is ignored.
        inplace : bool, default True
            Perform inplace modification.
        regex : bool, default False
            If true, perform regular expression substitution.

        Returns
        -------
        List[Block]
        F)r   r   r   Nr   r   )r?   r  r   r   rq   rh   rP   r   r8   rc   r   )rX   r   r   r   r   r  r   r\   r\   r]   r    s&   
zBlock._replace_coercearg
np.ndarrayc                 C     |S zA
        For compatibility with 1D-only ExtensionArrays.
        r\   rX   r  r\   r\   r]   _maybe_squeeze_arg)     zBlock._maybe_squeeze_argc                 C  r   r!  r\   )rX   r   r\   r\   r]   _unwrap_setitem_indexer/  r$  zBlock._unwrap_setitem_indexerr   c                 C  r   rf   )rc   rV   rj   r\   r\   r]   rV   7  r   zBlock.shapern   )int | tuple[int, int] | tuple[slice, int]c                 C  
   | j | S rf   r  )rX   rn   r\   r\   r]   iget;  s   
z
Block.iget4slice | npt.NDArray[np.bool_] | npt.NDArray[np.intp]c                 C  r'  )zreturn a slice of my valuesr  )rX   r   r\   r\   r]   r   D  s   
zBlock._slicec                 C  s   |r| j  | _ || j |< dS )a  
        Modify block values in-place with new item value.

        If copy=True, first copy the underlying values in place before modifying
        (for Copy-on-Write).

        Notes
        -----
        `set_inplace` never creates a new array or new Block, whereas `setitem`
        _may_ create a new array and always creates a new Block.

        Caller is responsible for checking values.dtype == self.dtype.
        Nrc   r   rX   locsrc   r   r\   r\   r]   set_inplaceK  s   zBlock.set_inplacer   npt.NDArray[np.intp]axisc                 C  s|   | j }|tju r| j}d}nd}tj|||||d}|dkr$|du r$J |du r+| j}t|j| js8| 	||S | 
||S )N
        Take values according to indexer and return them as a block.
        FT)r/  
allow_fillr   r   N)rc   r   
no_defaultr   algostake_ndr   r&   rh   r   r   )rX   r   r/  r   r   rc   r1  r   r\   r\   r]   r4  ]  s   


zBlock.take_ndnew_placementneeds_maskingc           	      C  sP   |j | jj|d\}}|d}|j| }|| }t|}t||dg}||fS )a  
        Return a list of unstacked blocks of self

        Parameters
        ----------
        unstacker : reshape._Unstacker
        fill_value : int
            Only used in ExtensionBlock._unstack
        new_placement : np.ndarray[np.intp]
        allow_fill : bool
        needs_masking : np.ndarray[bool]

        Returns
        -------
        blocks : list of Block
            New blocks of unstacked values.
        mask : array-like of bool
            The mask of columns of `blocks` we should keep.
        r   r   r   )get_new_valuesrc   Tr   r   new_block_2d)	rX   	unstackerr   r5  r6  r   r   r   r   r\   r\   r]   _unstack  s   


zBlock._unstackc                 C  s   |  |}ttj| j}| jdkr|j}t||| t|dd}zt	|j
|}W n ty<   | |}||| Y S w | j
tkrS|| }t|rSt|t||}|||< | S )a  
        Attempt self.values[indexer] = value, possibly creating a new array.

        Parameters
        ----------
        indexer : tuple, list-like, array-like, slice, int
            The subset of self.values to set
        value : object
            The value being set

        Returns
        -------
        Block

        Notes
        -----
        `indexer` is a direct slice/positional indexer. `value` must
        be a compatible shape.
        r   Tr   )r   r	   rq   ndarrayrc   rU   r:  rL   rK   r!   rh   r   r   setitemr   r   r(   r:   r   )rX   r   r   rc   castedr   vir\   r\   r]   r?    s$   




zBlock.setitemc              	   C  st  |}t tj| j}t|j|\}}t|ttt	frJ |t
ju r#| j}| |}t|dd}|r3| gS zt|j|}t|j|| | gW S  ty   | jdksW| jd dkryt|sf| ||| Y S | d }| ||| }|g Y S t|tj}	g }
|  }t|D ]+\}}|}|	r|dd||d f }|dd||d f }|||}|
| q|
 Y S w )aV  
        putmask the data to the block; it is possible that we may create a
        new dtype of block

        Return the resulting block(s).

        Parameters
        ----------
        mask : np.ndarray[bool], SparseArray[bool], or BooleanArray
        new : a ndarray/object

        Returns
        -------
        List[Block]
        Tr   rT   r   N)r	   rq   r>  rc   r;   r:  rp   r0   r2   r/   r   r2  r   r   rK   r!   rh   r9   r   rU   rV   r(   r   putmasknonzeror?  r   r   r   )rX   r   new	orig_maskrc   noopr@  r   r   is_arrayr   r   rn   nsubmaskr   r\   r\   r]   rB    sB   


zBlock.putmaskinferc              
   C  sB  |j | j ksJ t|tttfrJ | j dk}t|}ttj| j	}|}|r)|j
}t|| \}}|r8|  gS |tju r@| j}| |}zt|j|}	W nn tttfy   | j dksc| jd dkrw| |}
|
||}| j||d Y S t|tjtf}g }|  }t|D ]-\}}|}|r|dd||d f }|dd||d f }|j|||d}|| q| Y S w |	}t|| |}||urt |rt!|t!|k rt| || t"d| }t#||| n't |rt|tjst!|| jd krt$|%|j}t&| ||}|r|j
}| '|gS )	a  
        evaluate the block; return result block(s) from the result

        Parameters
        ----------
        other : a ndarray/object
        cond : np.ndarray[bool], SparseArray[bool], or BooleanArray
        _downcast : str or None, default "infer"
            Private because we only specify it when calling from fillna.

        Returns
        -------
        List[Block]
        r   rT   r   r   N	_downcastzThis should not be reached; call to np.where above is expected to raise ValueError. Please report a bug at github.com/pandas-dev/pandasr   )(rU   rp   r0   r2   r/   r7   r	   rq   r>  rc   r:  r;   r   r   r2  r   r   r!   rh   r   r   r   rV   r   wherer   rC   r   r   r   r:   sumr(   r   r   rB  r   r   expressionsr   )rX   r   condrL  	transposerc   
orig_othericondrF  r@  r   r   rG  r   r   rn   r   othrI  r   altr   r\   r\   r]   rM    sj   





zBlock.wherelimit
int | Nonec           	        s   t |d}| jsd}nt| j}t| j|\}}|r-|r| gS |  }|j|g d}|S |dur=d||| jd |k< |rG| 	|j
|}n
| j||j
 dd}t fdd	|D S )
zs
        fillna on the block with the value. If we fail, then convert to
        ObjectBlock and try again
        r   Tr   NFrT   rK  c                   s   g | ]
}|j |g d qS )r   )r   r   r   r\   r]   r     r  z Block.fillna.<locals>.<listcomp>)r   rs   r5   rc   r;   r   r   cumsumrU   rB  r:  rM  r   )	rX   r   rV  r   r   rF  r   r   r   r\   r   r]   fillna  s&   

zBlock.fillnapadr   forwardmethodindexIndex | Nonelimit_direction
limit_area
str | Noner   
Any | Noner   c
                 K  s  t |d}| js|r| gS |  gS zt|}W n ty$   d }Y nw |d u r9| jjdkr9|r4| gS |  gS | jra| j	dkra| j
d dkra|dkra| jt| j|||||||||	f
i |
S |rf| jn| j }ttj|}tj|f|||||||d|
 | |}||g|	S )Nr   fr   r   rT   )r\  r/  r]  rV  r_  r`  r   )r   rs   r   r   clean_fill_methodr   rh   rr   r   rU   rV   rW   r   interpolaterc   r	   rq   r>  interpolate_array_2dr   r   )rX   r\  r/  r]  r   rV  r_  r`  r   r   rZ   r   datar   r\   r\   r]   re    sT   
&	
zBlock.interpolaterT   rH  c                 C  s    t j| j||d}| j|dgS )z'return block for the diff of the valuesr/  r  )r3  diffrc   r   )rX   rH  r/  r   r\   r\   r]   ri    s   z
Block.diffperiodsc                 C  s   t |s| jtkrtd| |}zt| j|}W n ty1   | |}|j	|||d Y S w t
tj| j}t	||||}| |gS )z+shift the block by periods, possibly upcastzfill_value must be a scalar)r/  r   )r   	is_scalarrh   r   r   r   r!   r   r   r@   r	   rq   r>  rc   r   )rX   rj  r/  r   r@  r   rc   r   r\   r\   r]   r@     s   	

zBlock.shiftlinearqsrM   c                 C  sV   | j dksJ |dksJ t|sJ t| jt|j|}t|dd}t|| j	dS )a\  
        compute the quantiles of the

        Parameters
        ----------
        qs : Float64Index
            List of the quantiles to be computed.
        interpolation : str, default 'linear'
            Type of interpolation.
        axis : int, default 0
            Axis to compute.

        Returns
        -------
        Block
        r   rT   r   r8  )
rU   r(   r<   rc   rq   asarray_valuesr   r;  r   )rX   rm  interpolationr/  r   r\   r\   r]   quantile  s   zBlock.quantilec                 C     t | )zC
        Return a new Block with the given loc(s) deleted.
        r   )rX   r   r\   r\   r]   delete@  s   zBlock.deletec                 C  rr  )(return a boolean if I am possibly a viewr   rj   r\   r\   r]   is_viewF  s   zBlock.is_viewrC   c                 C  rr  )zP
        The array that Series.array returns. Always an ExtensionArray.
        r   rj   r\   r\   r]   array_valuesK     zBlock.array_valuesDtypeObj | Nonec                 C  rr  )z
        return an internal format, currently just the ndarray
        this is often overridden to handle to_dense like operations
        r   rt   r\   r\   r]   
get_valuesR  rw  zBlock.get_valuesc                 C  rr  rf   r   rj   r\   r\   r]   values_for_jsonY     zBlock.values_for_jsonrR   rl   )rR   r   )r   r   rR   r   rf   rR   ra   )r   r   rR   ra   )rR   r   )rR   rd   )r   r   rR   ra   )r   r   r   r   rR   ra   )r   r   rR   rl   )r   r   rR   rl   r_   Fr   rl   rR   rS   )r   r   rR   rS   )r   rS   rR   rS   TTTT
r   rl   r   rl   r   rl   r   rl   rR   rS   rR   r   )Fr   )rh   r   r   rl   r   r   rR   ra   )r   N)T)r   rl   rR   ra   )FN)r   rl   r   r   rR   rS   )FTN)r   rl   r   rl   rR   rS   )FF)
r  r  r  r  r   rl   r  rl   rR   rS   )TF)r   r  r   rl   r  rl   rR   rS   )r  r  rR   r  rR   r   )rn   r&  rR   r  )r   r)  rR   r   rc   r   r   rl   rR   r   r   r.  r/  rd   r   r   rR   ra   r5  r.  r6  r  rJ  NFNrV  rW  r   rl   rR   rS   )	rZ  r   NFNr[  NNN)r\  r   r/  rd   r]  r^  r   rl   rV  rW  r_  r   r`  ra  r   rb  r   ra  rR   rS   rT   rH  rd   r/  rd   rR   rS   r   Nrj  rd   r/  rd   r   r   rR   rS   )rl  r   )rm  rM   r/  rd   rR   ra   rR   rC   rh   rx  rR   r  rR   r  )Hr   
__module____qualname____doc____annotations__	__slots__
is_numericr   r   rg   _validate_ndimr
   r   rk   rs   rz   propertyr|   r}   r   r   r   setterr   r   r   r   r   r   r   r   r   r   r   r   rW   r   r   r`   r   r   rh   r   r   r   r   r  r  r  r#  r%  rV   r(  r   r-  r   r2  r4  r=  r?  rB  rM  rY  re  ri  r@   rq  rs  ru  rv  ry  rz  r\   r\   r\   r]   ra      s  
 	


	!
P)J
7

	
"
.
0?p0@ 
!ra   c                      s   e Zd ZU dZded< dd Zd%d&d	d
Zd&ddZ	d'd( fddZd)ddZ	e
d*ddZd+d,ddZd-dd Z	d.d#d$Z  ZS )/EABackedBlockz>
    Mixin for Block subclasses backed by ExtensionArray.
    rC   rc   c              
   C  s   |}|}|  |}| |}| j}|jdkr|j}t||| z|||< W | S  ttfye } z1t| t	| j
rJ| |}|||W  Y d}~S t| tr`| |}|||W  Y d}~S  d}~ww )a7  
        Attempt self.values[indexer] = value, possibly creating a new array.

        This differs from Block.setitem by not allowing setitem to change
        the dtype of the Block.

        Parameters
        ----------
        indexer : tuple, list-like, array-like, slice, int
            The subset of self.values to set
        value : object
            The value being set

        Returns
        -------
        Block

        Notes
        -----
        `indexer` is a direct slice/positional indexer. `value` must
        be a compatible shape.
        r   N)r%  r#  rc   rU   r:  rL   r   r   _catch_deprecated_value_errorr'   rh   r   r?  rp   NDArrayBackedExtensionBlock)rX   r   r   orig_indexer
orig_valuerc   errr   r\   r\   r]   r?  d  s,   







zEABackedBlock.setitemrJ  rR   rS   c              
   C  s  | j j}t|}|}|}| |}| |}|tju r| j}t|| \}}|r-|  gS z	|	||j}	W n t
tfy }
 zt|
 | jdksP| jd dkrt| jrm| |}|||}| j||dW  Y d }
~
S t| tr| |}|||}| j||dW  Y d }
~
S  t|tjtf}g }|  }t|D ]+\}}|}|r|d d ||d f }|d d ||d f }|||}|| q|W  Y d }
~
S d }
~
ww | |	}|gS )NrT   r   r   )rc   r:  r7   r#  r   r2  r   r;   r   _wherer   r   r  rU   rV   r'   rh   r   rM  r   rp   r  rq   r>  rC   r   r   r   r   )rX   r   rP  rL  arrrR  	orig_condrS  rF  r   r  r   r   rG  r   rn   r   rH  rI  r   r\   r\   r]   rM    sP   








&zEABackedBlock.wherec              
   C  s  t |}| j}|jdkr|j}|}|}| |}| |}| s$| gS z
||| W | gS  ttfy } zt	| | jdksH| j
d dkrut| jr^| |}|||W  Y d}~S t| trt| |}|||W  Y d}~S  t|tjtf}g }	|  }
t|
D ]+\}}|}|r|dd||d f }|dd||d f }|||}|	| q|	W  Y d}~S d}~ww )z+
        See Block.putmask.__doc__
        r   rT   r   N)r7   rc   rU   r:  r#  r   _putmaskr   r   r  rV   r'   rh   r   rB  rp   r  rq   r>  rC   r   r   r   )rX   r   rD  rc   orig_newrE  r  r   rG  r   r   rn   r   rH  rI  r   r\   r\   r]   rB    sH   


&



zEABackedBlock.putmaskNFrV  rW  r   rl   c              	     sx   | j jdkr2z
| jj||d}W n ttfy)   tjdt| dt	t
 d  w | |}|gS t j||||dS )Nr   )rV  zMThe behavior of fillna with timedelta64[ns] dtype and an incompatible value (z) is deprecated. In a future version, this will cast to a common dtype (usually object) instead of raising, matching the behavior of other dtypes.ru   )rV  r   r   )rh   rr   rc   rY  r   r   rw   rx   r   FutureWarningr   r   super)rX   r   rV  r   r   r   res_blk	__class__r\   r]   rY    s    	
zEABackedBlock.fillnara   c                 C  s,   | j |}| j|}t| ||| jdS )Nr   )rc   rs  r   r   rU   rX   r   rc   r   r\   r\   r]   rs  4  s   zEABackedBlock.deletec                 C  r   rf   r  rj   r\   r\   r]   rv  :  r   zEABackedBlock.array_valuesrh   rx  r  c                 C  s*   | j }|tkr|t}t|| jS )zS
        return object dtype as boxed values, such as Timestamps/Timedelta
        )rc   r   r   rP   rq   rn  r   rV   )rX   rh   rc   r\   r\   r]   ry  >  s   
zEABackedBlock.get_valuesc                 C  s   t | jS rf   )rq   rn  rc   rj   r\   r\   r]   rz  H  s   zEABackedBlock.values_for_jsonrZ  r   c           	      K  sH   | j }|jdkr|dkr|jj|||dj}n|j|||d}| |S )Nr   r   )r   r\  rV  )rc   rU   r:  rY  r   )	rX   r\  r/  r   rV  r   rZ   rc   r   r\   r\   r]   re  K  s
   
zEABackedBlock.interpolater  r_   r  r  r}  r  rf   r  r  )rZ  r   FNN)r   r  r  r  r  r?  rM  rB  rY  rs  r   rv  ry  rz  re  __classcell__r\   r\   r  r]   r  ]  s   
 8
?=


r  c                      s   e Zd ZU dZdZdZdZded< ed=dd	Z	d>ddZ
d?d@ddZdd Zdd ZedAddZedd ZddejfdBd%d&ZdCd)d*ZedDd,d-ZdEdF fd1d2ZdGdHd6d7ZdId;d<Z  ZS )JExtensionBlocka  
    Block for holding extension types.

    Notes
    -----
    This holds all 3rd-party extension array types. It's also the immediate
    parent class for our internal extension types' blocks, CategoricalBlock.

    ExtensionArrays are limited to 1-D.
    FTrC   rc   rR   r   c                 C  s*   | j dkrt| jfS t| jt| jfS )NrT   )rU   r   rc   r   rj   r\   r\   r]   rV   i  s   
zExtensionBlock.shapern   r&  c                 C  s   t |tr7|\}}t|s|dkrt|  dt |tr2|dk r)|t| j7 }| j||d  S | j| S |dkrBt|  d| jS )Nr   z only contains one itemrT   )rp   tuplecomis_null_slice
IndexErrorr   r   rc   )rX   rn   colr   r\   r\   r]   r(  p  s   
	

zExtensionBlock.igetr   r   rl   r   c                 C  s"   |r| j  | _ || j d d < d S rf   r*  r+  r\   r\   r]   r-    s   zExtensionBlock.set_inplacec                 C  sx   t |tjtfr$|j| jjd kr$|jd dksJ |dddf }|S t |tr:|jd dks2J |jdddj	}|S )z@
        If necessary, squeeze a (N, 1) ndarray to (N,)
        rT   Nr   rh  )
rp   rq   r>  rC   rU   rc   rV   r/   _ixsro  r"  r\   r\   r]   r#    s   
z!ExtensionBlock._maybe_squeeze_argc                 C  s   t |trpt|dkrptdd |D r8|\}}|jdkr*|dk r*|jd dks.td|dddf }|S t|d rK|d dkrK|d }|S t	
|d rX|d }|S t|d rl|d d dkrl|d }|S td|S )zw
        Adapt a 2D-indexer to our 1D values.

        This is intended for 'setitem', not 'iget' or '_slice'.
        r   c                 s  s&    | ]}t |tjo|jd kV  qdS )r   N)rp   rq   r>  rU   r  r\   r\   r]   r    s   $ z9ExtensionBlock._unwrap_setitem_indexer.<locals>.<genexpr>rT   r   zPThis should not be reached. Please report a bug at github.com/pandas-dev/pandas/N)rp   r  r   r  sizerV   r   r   
is_integerr  r  r(   )rX   r   firstsecondr\   r\   r]   r%    s.   
$
z&ExtensionBlock._unwrap_setitem_indexerc                 C  s   dS )z,Extension arrays are never treated as views.Fr\   rj   r\   r\   r]   ru    s   zExtensionBlock.is_viewc                 C  s
   | j jjS rf   )rc   rh   _is_numericrj   r\   r\   r]   r    r~   zExtensionBlock.is_numericr   Nr   r.  r/  rd   r   r   ra   c                 C  sP   |t ju rd}| jj||dd}| jdkr|du rJ |du r"| j}| ||S )r0  NT)r   r1  rT   )r   r2  rc   takerU   r   r   )rX   r   r/  r   r   r   r\   r\   r]   r4    s   

zExtensionBlock.take_ndr   r)  c                 C  sN   | j dkr"t|tstd|td| }t|std|td}| j| S )z
        Return a slice of my values.

        Parameters
        ----------
        slicer : slice, ndarray[int], or ndarray[bool]
            Valid (non-reducing) indexer for self.values.

        Returns
        -------
        ExtensionArray
        r   z+invalid slicing for a 1-ndim ExtensionArrayrT   N)rU   rp   r   AssertionErrorranger   rc   )rX   r   new_locsr\   r\   r]   r     s   


zExtensionBlock._slicer   c                 C  s    | j | }t| || j| jdS )zN
        Perform __getitem__-like specialized to slicing along index.
        r   )rc   r   r   rU   )rX   r   r   r\   r\   r]   getitem_block_index!  s   
z"ExtensionBlock.getitem_block_indexrT   rH  rS   c                   s@   |dkr|dkrt  jt| jddS |dkrd}t  ||S )Nr   rh  rT   )r  ri  r   rc   )rX   rH  r/  r  r\   r]   ri  +  s
   zExtensionBlock.diffrj  r   r   c                 C  s   | j j||d}| |gS )z
        Shift the block by `periods`.

        Dispatches to underlying ExtensionArray and re-boxes in an
        ExtensionBlock.
        )rj  r   rc   r@   r   )rX   rj  r/  r   r   r\   r\   r]   r@   8  s   zExtensionBlock.shiftr5  r6  r  c                   sD   |j \}}|j| }|| } fddtt||D }||fS )Nc                   s<   g | ]\}\}}t jj||  d t|ddqS ))r1  r   r   r   )r   rc   r  r   )r   rn   indicesplacer   r6  rX   r\   r]   r   ^  s    
	
z+ExtensionBlock._unstack.<locals>.<listcomp>)arange_resultr:  r   r  )rX   r<  r   r5  r6  r   r   r   r\   r  r]   r=  B  s   

	zExtensionBlock._unstackr  )rn   r&  r~  r  r|  r  )r   r)  rR   rC   )r   r   rR   r  r  r  r  r  r  )r   r  r  r  rg   r  r   r  r   rV   r(  r-  r#  r%  r  ru  r  r   r2  r4  r   r
   r  ri  r@   r=  r  r\   r\   r  r]   r  W  s4   
 
,

(	
r  c                   @  sR   e Zd ZU ded< edddZeddd	ZddddZdddZdddZ	d
S )
NumpyBlockr  rc   rR   rl   c                 C  s   | j jduS rt  N)rc   baserj   r\   r\   r]   ru  o  s   zNumpyBlock.is_viewrC   c                 C  r{   rf   )rE   rc   rj   r\   r\   r]   rv  t  r~   zNumpyBlock.array_valuesNrh   rx  c                 C  s   |t kr
| jt S | jS rf   )r   rc   r   rt   r\   r\   r]   ry  x  s   zNumpyBlock.get_valuesc                 C  r   rf   r  rj   r\   r\   r]   rz  }  s   zNumpyBlock.values_for_jsonra   c                 C  s0   t | j|d}| j|}t| ||| jdS )Nr   r   )rq   rs  rc   r   r   rU   r  r\   r\   r]   rs    s   zNumpyBlock.deleter|  r  rf   r  r  r}  )
r   r  r  r  r  ru  rv  ry  rz  rs  r\   r\   r\   r]   r  l  s   
 
r  c                   @  s   e Zd ZdZdZdS )NumericBlockr\   TN)r   r  r  r  r  r\   r\   r\   r]   r    s    r  c                   @  sN   e Zd ZU dZded< edddZeddd	ZddddZ	ddddZ
dS )r  z8
    Block backed by an NDArrayBackedExtensionArray
    rO   rc   rR   rl   c                 C  s   t | jtj S rf   )rp   rh   rq   rj   r\   r\   r]   r     s   z(NDArrayBackedExtensionBlock.is_extensionc                 C  s   | j jjduS r  )rc   _ndarrayr  rj   r\   r\   r]   ru    r   z#NDArrayBackedExtensionBlock.is_viewr   rH  rd   r/  rS   c                 C  s$   | j }||j||d }| |gS )a  
        1st discrete difference.

        Parameters
        ----------
        n : int
            Number of periods to diff.
        axis : int, default 0
            Axis to diff upon.

        Returns
        -------
        A list with a new Block.

        Notes
        -----
        The arguments here are mimicking shift so they are called correctly
        by apply.
        rh  )rc   r@   r   )rX   rH  r/  rc   r   r\   r\   r]   ri    s   z NDArrayBackedExtensionBlock.diffNrj  r   r   c                 C  s"   | j }|j|||d}| |gS )N)r   r/  r  )rX   rj  r/  r   rc   r   r\   r\   r]   r@     s   z!NDArrayBackedExtensionBlock.shiftr|  r  r  r  r  )r   r  r  r  r  r   r   r  ru  ri  r@   r\   r\   r\   r]   r    s   
 r  r  	Exceptionr   c                 C  s>   t | trt | trdS dt| v rdS dt| vr dS dS )z
    We catch ValueError for now, but only a specific one raised by DatetimeArray
    which will no longer be raised in version.2.0.
    z'value.closed' iszTimezones don't matchN)rp   r   r   r   )r  r\   r\   r]   r    s   

r  c                   @  s,   e Zd ZU dZdZdZded< ddd	Zd
S )DatetimeLikeBlockz*Block for datetime64[ns], timedelta64[ns].r\   FzDatetimeArray | TimedeltaArrayrc   rR   r  c                 C  r   rf   )rc   r  rj   r\   r\   r]   rz    r{  z!DatetimeLikeBlock.values_for_jsonNr  )r   r  r  r  r  r  r  rz  r\   r\   r\   r]   r    s   
 r  c                   @  s0   e Zd ZU dZded< dZdZdZdZe	j
Z
dS )DatetimeTZBlockz0implement a datetime64 block with a tz attributerB   rc   r\   TFN)r   r  r  r  r  r  r   r  rg   r  rz  r\   r\   r\   r]   r    s   
 
r  c                   @  s<   e Zd ZdZdZedddd	Ze				ddddZdS )ObjectBlockr\   TFr   rl   rR   rS   c                 C  sp   | j dksJ z|| j}W n ty   |s g  Y S w t|tjs%J |j dks,J |dd}| |gS )z;
        For object-dtype, we operate column-wise.
        r   rT   r   )rU   rc   r   rp   rq   r>  r   r   )rX   r   r   resr\   r\   r]   r     s   zObjectBlock.reducer   r   r   r   c                 C  sB   | j }|jdkr|d }t|||||d}t|| j}| |gS )z
        attempt to cast any object types to better types return a copy of
        the block (if copy = True) by definition we ARE an ObjectBlock!!!!!
        r   r   )r   r   r   r   )rc   rU   r"   r   r   )rX   r   r   r   r   rc   r   r\   r\   r]   r     s   
zObjectBlock.convertNr~  r  r  r  )r   r  r  r  r   r`   r   r   r\   r\   r\   r]   r    s    r  c                   @  s   e Zd ZdZedddZdS )CategoricalBlockr\   rR   r   c                 C  r   rf   r   rj   r\   r\   r]   rh   "  r   zCategoricalBlock.dtypeNr  )r   r  r  r  r  rh   r\   r\   r\   r]   r    s    r  rc   r   c                 C  sV   t | tjrt| } t| jjtrtj| t	d} t | t
tfr)| jdur)| d} | S )a:  
    Input validation for values passed to __init__. Ensure that
    any datetime64/timedelta64 dtypes are in nanoseconds.  Ensure
    that we do not have string dtypes.

    Parameters
    ----------
    values : np.ndarray or ExtensionArray

    Returns
    -------
    values : np.ndarray or ExtensionArray
    r   N)rp   rq   r>  rJ   
issubclassrh   r   r   r   rP   rB   rG   freq
_with_freqr  r\   r\   r]   r   +  s   
r   rh   r   c                 C  s   | j }| j}t| trt}|S t| trt}|S |tu r t}|S t| t	r)t
}|S t| tr2t}|S |dv r:t}|S |dv rBt}|S t}|S )z
    Find the appropriate Block subclass to use for the given values and dtype.

    Parameters
    ----------
    dtype : numpy or pandas dtype

    Returns
    -------
    cls : class, subclass of Block
    )r   r   )rc  crn   ro   rm   )r   rr   rp   rH   r  r+   r  r   r  r.   r  r,   r  r  r  )rh   vtyperr   clsr\   r\   r]   get_block_typeH  s2   



r  r   r   c                 C  s    t | j}t| } || d|dS )Nr   rU   r   )r  rh   r   )rc   r   klassr\   r\   r]   r;  q  s   
r;  rU   rd   c                C  s>   t |ts	t|}t| || t| j}t| } || ||dS )Nr  )rp   r   
check_ndimr  rh   r   )rc   r   rU   r  r\   r\   r]   r   |  s   

r   c                 C  s   | j |krtd| j  d| dt| js?| j |kr'td| j  d| dt|t| kr=tdt|  dt| dS |dkrMt|d	krOtd
dS dS )aV  
    ndim inference and validation.

    Validates that values.ndim and ndim are consistent.
    Validates that len(values) and len(placement) are consistent.

    Parameters
    ----------
    values : array-like
    placement : BlockPlacement
    ndim : int

    Raises
    ------
    ValueError : the number of dimensions do not match
    z0Wrong number of dimensions. values.ndim > ndim [z > ]z1Wrong number of dimensions. values.ndim != ndim [z != zWrong number of items passed z, placement implies r   rT   zneed to splitN)rU   r   r$   rh   r   )rc   r   rU   r\   r\   r]   r    s6   


r  rb   rx  3tuple[np.ndarray | ExtensionArray, DtypeObj | None]c                 C  s@   t | tr|  } |r|dkrt| } t |tr|j}| |fS )zL
    Ensure that we don't allow PandasArray / PandasDtype in internals.
    rT   )rp   r1   to_numpyrq   
atleast_2dr-   numpy_dtype)rc   rh   rU   r\   r\   r]   extract_pandas_array  s   


r  rS   c                 C  sh   |du rg }t | tr"| D ]}t |tr|| q|| q|S t | ts-J t| ||  |S )z.return a new extended blocks, given the resultN)rp   listr   r   ra   r   )r   r   rr\   r\   r]   r     s   


r   rT   c                 C  s.   | j |k rt| jstd| } | dd} | S )z:
    Reshape if possible to have values.ndim == ndim.
    z+np.ndarray | DatetimeArray | TimedeltaArrayrT   r   )rU   r$   rh   r	   r   )rc   rU   r\   r\   r]   r     s
   


r   r   .)r   r   float_formatdecimalr  c                K  s  t | tr| jjjdv rtj| jjt| j	|d} t
| } t | ttfrf| jdkr<| jdd|i|}|jtdd}|S g }tt| D ]}| |ddf jdd|i|}||jtdd qDt|S | jjdkrt| s|du r|d	krt| }	|s| t} ntj| d
d} || |	< | jtdd} | S ddlm}
 |
| ||||dd}| }|jtdd}|S t | trt| }	t| t}|||	< |S t| }	t |}| jt!kr|s|r| t} | jj"tdj" |k r| d| } ntj| d
d} || |	< | jtdd} | S )r   Mmr7  rT   r   Fr   Nrc  r  rP   r   r   )FloatArrayFormatter)r   r  r  r   fixed_widthU1z<Ur\   )#rp   rA   
categoriesrh   rr   r3  r4  ro  r#   _codesrJ   rB   rG   rU   _format_native_typesr   rP   r  r   r   rq   vstackr)   r5   r   r   pandas.io.formats.formatr  get_result_as_arrayrC   rn  r   word_lenr   itemsize)rc   r   r   r  r  rZ   r   results_convertedrn   r   r  	formatterr  r   r  r\   r\   r]   r     sl   

 



r   c                 C  s0   t | ttfr| tS t | ttfr| jS | S )a+  
    The array that Series.values returns (public attribute).

    This has some historical constraints, and is overridden in block
    subclasses to return the correct array (e.g. period returns
    object ndarray and datetimetz a datetime64[ns] ndarray instead of
    proper extension array).
    )rp   rF   rD   r   rP   rB   rG   _datar  r\   r\   r]   r}   B	  s
   	
r}   )rQ   r   rR   r   )r  r  rR   r   )rc   r   rR   r   )rh   r   )rc   r   r   r   )rU   rd   rR   ra   )r   r   rU   rd   rR   r   )rc   rb   rh   rx  rU   rd   rR   r  rf   r_   r  )rc   r   rU   rd   rR   r   )rc   r   rR   r  )
__future__r   	functoolsr   r   typingr   r   r   r   r   r	   r
   rw   numpyrq   pandas._libsr   r   libinternalsr   r   pandas._libs.internalsr   pandas._libs.tslibsr   pandas._typingr   r   r   r   r   r   pandas.errorsr   pandas.util._decoratorsr   pandas.util._exceptionsr   pandas.util._validatorsr   pandas.core.dtypes.astyper   pandas.core.dtypes.castr   r   r   r    r!   r"   pandas.core.dtypes.commonr#   r$   r%   r&   r'   r(   r)   r*   pandas.core.dtypes.dtypesr+   r,   r-   r.   pandas.core.dtypes.genericr/   r0   r1   r2   pandas.core.dtypes.inferencer3   pandas.core.dtypes.missingr4   r5   r6   pandas.core.algorithmscore
algorithmsr3  pandas.core.array_algos.putmaskr7   r8   r9   r:   r;    pandas.core.array_algos.quantiler<   pandas.core.array_algos.replacer=   r>   r?   "pandas.core.array_algos.transformsr@   pandas.core.arraysrA   rB   rC   rD   rE   rF   rG   pandas.core.arrays.sparserH   pandas.core.baserI   pandas.core.commoncommonr  #pandas.core.computation.expressionscomputationrO  pandas.core.constructionrJ   rK   pandas.core.indexersrL   pandas.core.missingr   pandasrM   rN   pandas.core.arrays._mixinsrO   rh   r   r`   ra   r  r  r  r  NDArrayBackedBlockr  r  r  r  r  r  r   r  r;  r   r  r  r   r   r   r}   r\   r\   r\   r]   <module>   s    $	  (
$	

         Y {  
24


)


*X