U
    c6                    @  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rd dlvmwZwmxZx d dlymzZz e{dZ|d d d!d"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.d/ d/ejeZd0d1d2d3d4ZG d5d6 d6eZG d7d8 d8eZG d9d: d:eZG d;d< d<eZd=d=d>d?d@ZdAdBdCdDZd=dEdFdGdHZdId%dJdKdLZdEdId1dMdNdOZdPdQdIdRdSdTdUZdfdVdWdXdYZdgd=dId=d[d\d]Zd^ddd_d`d=dad>dbdcZd=d=d>dddeZdS )h    )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objectr   )methreturnc                   s$   t  d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.
    list[Block]rR   c                   s>   | j dks| jd dkr( | f||S | j f||S d S )N   r   )ndimshapesplit_and_operate)selfargskwargsrQ    @/tmp/pip-unpacked-wheel-g7fro6k3/pandas/core/internals/blocks.pynewfunc   s    zmaybe_split.<locals>.newfunc)r   r	   r   )rQ   r_   r]   r\   r^   maybe_split{   s    r`   c                   @  sr  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ddddZeeddddZeeddddZedd Zeedd Zedd ZeddddZejdddd dZedd dd"d#Zedd$d d%d&d'Zed(dd)d*Zeddd+d,Zed-d d.d/d0Zed1dd d2d3d4Zed5dd6d7d8Zed9dd:d;d<Zed=dd>d?Zddd=d@dAdBZ ed9d=dCdDdEZ!ed=ddFdGZ"ed=ddHdIZ#ed ddJdKZ$edd=d=dLdMdNZ%ee&d=ddOdPZ'dddddd=dQdRdSZ(edTddUdVZ)eddTddXd dYdZd[Z*edd dd]d^Z+eddd d_d`daZ,edddbd=dcdddeZ-edddd=dfdgdhZ.eddidjddd=dkdldmZ/eddnddd=dodpdqZ0drdrdsdtduZ1dvdw Z2edxddydzZ3d{drd|d}d~Z4dd9d.ddZ5dd9dddddZ6d!e7j8fddd$d dddZ9ddndddZ:d dddZ;d=dddZ<dd=dddZ=dddd=dddZ>dd(ddddd(dddd=d
ddZ?dddd=dddZ@dddd5d=dddZAedddd dddZBd dddZCeddddZDeddddZEdddrdddZFdrddd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intrV   r   __init__r]   FTc                 C  s   | j | jjfS N)_can_consolidatedtypenamerY   r]   r]   r^   _consolidate_key   s    zBlock._consolidate_keyboolrT   c                 C  s"   | j }t|tj r|jdkS |jS )z7
        Can we store NA values in this Block?
        )biu)rh   
isinstancenpkind_can_hold_narY   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  s
   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  s
   t | jS rf   )external_valuesrc   rj   r]   r]   r^   r|      s    zBlock.external_valuesc                 C  s   t | jddS )NF)compat)r6   rh   rj   r]   r]   r^   
fill_value   s    zBlock.fill_valuec                 C  s    | j tkrt|| j r| j}|S rf   )rh   
_dtype_objr4   r~   rY   valuer]   r]   r^   _standardize_fill_value   s    zBlock._standardize_fill_valuer   c                 C  s   | j S rf   	_mgr_locsrj   r]   r]   r^   mgr_locs   s    zBlock.mgr_locsNone)new_mgr_locsrR   c                 C  s
   || _ d S rf   r   )rY   r   r]   r]   r^   r      s    Nc                 C  s2   |dk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rV   	placementrV   )r   is_extensionensure_block_shaperV   	new_block)rY   rc   r   r]   r]   r^   
make_block   s
    zBlock.make_blockBlockPlacement | None)r   rR   c                 C  sT   |dkr| j }|jjdkr@t|}||k	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   typerV   )rY   rc   r   
new_valuesr]   r]   r^   make_block_same_class   s    zBlock.make_block_same_classstrc                 C  sj   t | j}| jdkr0| dt|  d| j }n6ddd | jD }| d| jj d| d| j }|S )	NrU   z: z dtype: z x c                 S  s   g | ]}t |qS r]   )r   .0sr]   r]   r^   
<listcomp>  s     z"Block.__repr__.<locals>.<listcomp>z, z	, dtype: )	r   __name__rV   lenrh   joinrW   r   indexer)rY   ri   resultrW   r]   r]   r^   __repr__  s    

 zBlock.__repr__c                 C  s
   t | jS rf   )r   rc   rj   r]   r]   r^   __len__  s    zBlock.__len__zslice | npt.NDArray[np.intp]slicerrR   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   _slicerV   rc   
ValueErrorr   rY   r   r   r   r]   r]   r^   getitem_block  s
    

zBlock.getitem_blockslice)r   r   rR   c                 C  s2   |  |}|j| jjkr tdt| ||| jS r   )r   rV   rc   r   r   r   r]   r]   r^   getitem_block_columns-  s    	
zBlock.getitem_block_columnsr   )elementrR   c                 C  s   t |dd}t| j|S )z#require the same dtype as ourselvesTZextract_numpy)rK   r   rc   )rY   r   r]   r]   r^   _can_hold_element=  s    zBlock._can_hold_elementr   )r   rR   c                 C  s*   z|j | j kW S  tk
r$   Y dS X dS )z
        Should we set self.values[indexer] = value inplace or do we need to cast?

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

        Returns
        -------
        bool
        FN)rh   	TypeErrorr   r]   r]   r^   should_storeC  s    zBlock.should_storerS   c                 K  s   || j f|}| |S )z[
        apply the function to my values; return a block if we are not
        one
        )rc   _split_op_result)rY   funcr[   r   r]   r]   r^   applyY  s    zBlock.applyignore_failuresrR   c              	   C  s|   | j dkstz|| j}W n& ttfk
rB   |r<g  Y S  Y nX | jj dkr`t|gg}n|dd}| |}|gS )N   rU   )	rV   AssertionErrorrc   r   NotImplementedErrorrq   arrayreshaper   )rY   r   r   r   
res_valuesnbr]   r]   r^   reducec  s    
zBlock.reduce)r   rR   c                 C  s|   |j dkrlt|jtrlg }t| jD ]B\}}t|sF|||d  }n|| }| j||d}|| q$|S | |}|gS )NrU   rc   r   )	rV   rp   rh   r,   	enumerater   r%   r   append)rY   r   nbsrn   locvalsblockr   r]   r]   r^   r   x  s    
zBlock._split_op_resultc                 C  sb   | j dkst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   rU   r   )	rV   r   r   r   rc   r   r   r   r   )rY   Z
new_blocksrn   Zref_locr   bpr   r]   r]   r^   _split  s    zBlock._splitc                 O  sL   | j dkr| jd dkstg }|  D ]}||f||}|| q(|S )z
        Split the block and apply func column-by-column.

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

        Returns
        -------
        List[Block]
        r   r   rU   )rV   rW   r   r   extend)rY   r   rZ   r[   
res_blocksr   rbsr]   r]   r^   rX     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)rY   otherZ	new_dtyper]   r]   r^   coerce_to_target_dtype  s    	zBlock.coerce_to_target_dtype)blocksrR   c                   sJ    dkr|S | j tkr(tdd |D S  d kr4|S t fdd|D S )NFc                 S  s   g | ]}|j d ddqS )TF)datetimenumericconvertr   blkr]   r]   r^   r     s     z)Block._maybe_downcast.<locals>.<listcomp>c                   s   g | ]}|  qS r]   )_downcast_2dr   rm   downcastr]   r^   r     s     )rh   r   extend_blocks)rY   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   )rY   rh   r   r]   r]   r^   r     s    zBlock._downcast_2dr   r   r   	timedeltarR   c                 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   )rY   r   r   r   r   r]   r]   r^   r     s    zBlock.convertr   c                 C  s   | j jS rf   rc   rh   rj   r]   r]   r^   rh     s    zBlock.dtyperaiser   )rh   r   errorsrR   c                 C  sl   | j }t||||d}t|}| |}|j| jkrht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   rW   r   rh   ri   )rY   rh   r   r   rc   r   Z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   )rY   r   r   r[   r   r]   r]   r^   r     s    zBlock.to_native_types)deeprR   c                 C  s(   | j }|r| }t| || j| jdS )zcopy constructorr   )rc   r   r   r   rV   )rY   r   rc   r]   r]   r^   r      s    z
Block.copyznpt.NDArray[np.bool_] | None)inplacemaskrR   c           
      C  sv  | j }t|tr8|r| n|  }|j j||dd |gS | |sV|rL| gS |  gS |dkrjt||}| s|r|| gS |  gS | |r|r| n|  }t	|j || | j
r|dks|jddd}n|g}|S | jdks| jd dkr(|dkr| tt}n
| |}|j||d|dS g }t|  D ]4\}}	|t| j|	||d|||d  d q8|S d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   rU   r   r   r   r   r   )rc   rp   rA   r   _replacer   missingmask_missinganyr8   	is_objectr   rV   rW   r   rq   rh   rP   r   replacer   r   r   r   )
rY   r   r   r   r   rc   r   r   rn   r   r]   r]   r^   r   +  sX    
  



		zBlock.replace)r   r   rR   c           	      C  sb   |  |s|r| gS |  gS t|}|r2| 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   )	rY   r   r   r   r   r   rxr   r   r]   r]   r^   _replace_regex|  s    


zBlock._replace_regexzIterable[Any]zSequence[Any])src_list	dest_listr   regexrR   c              	     sp  j fddt||D }t|s:|r0gS  gS t|d }tjrrt   fdd|D }nfdd|D }dd |D }|rn g}t|D ]\}	\}
}|	|k}g }t|D ]\}}t|dkr||	 }n(||	 }t|t	rt
|||d  }|j|
|||d}|rZ|jrZtdd	 |D sZtd
d |D }|| q|}q|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>rU   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     s     c                 S  s   g | ]}t |qS r]   )r7   r   r   r]   r]   r^   r     s     )r   r   r   r   r   c                 s  s   | ]}|d kV  qd S rf   r]   r   r]   r]   r^   	<genexpr>  s     z%Block.replace_list.<locals>.<genexpr>c                 S  s   g | ]}|j d ddqS )FTr   r   r   r]   r]   r^   r     s     )rc   zipr   r   r*   rh   r5   r   rp   rl   r   _replace_coercer   allr   r   )rY   r   r   r   r   pairsZsrc_lenmasksrbrn   srcdestr   Znew_rbZblk_numr   r   Zmibr   r]   )r   r   rY   rc   r^   replace_list  sL    



"zBlock.replace_listnpt.NDArray[np.bool_])r   r   r   rR   c                 C  s   t ||r| j|||d|dS |dkr~| rj| jttdd}|| krV|sV| }t|j	|| |gS |rt| gS |  gS | j
||||dS 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   )rY   r   r   r   r   r   r   r]   r]   r^   r     s,    
   zBlock._replace_coerce
np.ndarray)argrR   c                 C  s   |S zA
        For compatibility with 1D-only ExtensionArrays.
        r]   rY   r
  r]   r]   r^   _maybe_squeeze_arg)  s    zBlock._maybe_squeeze_argc                 C  s   |S r  r]   )rY   r   r]   r]   r^   _unwrap_setitem_indexer/  s    zBlock._unwrap_setitem_indexerr   c                 C  s   | j jS rf   )rc   rW   rj   r]   r]   r^   rW   7  s    zBlock.shape)int | tuple[int, int] | tuple[slice, int])rn   rR   c                 C  s
   | j | S rf   r   )rY   rn   r]   r]   r^   iget;  s    z
Block.iget4slice | npt.NDArray[np.bool_] | npt.NDArray[np.intp]c                 C  s
   | j | S )zreturn a slice of my valuesr   )rY   r   r]   r]   r^   r   D  s    zBlock._slicerc   r   rR   c                 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   rY   Zlocsrc   r   r]   r]   r^   set_inplaceK  s    zBlock.set_inplacenpt.NDArray[np.intp]r   axisr   rR   c                 C  s   | j }|tjkr| j}d}nd}tj|||||d}|dkrH|dkrHt|dkrV| j}t|j	| j	sp| 
||S | ||S d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   r&   rh   r   r   )rY   r   r  r   r~   rc   r  r   r]   r]   r^   r  ]  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   )Zget_new_valuesrc   Tr   r   new_block_2d)	rY   	unstackerr~   r  r   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k
rz   | |}||| Y S X | j
tkr|| }t|rt|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   rV   r#  rL   rK   r!   rh   r   r   setitemr   r   r(   r:   r   )rY   r   r   rc   castedr   vir]   r]   r^   r(    s"    




zBlock.setitemc              	   C  s  |}t tj| j}t|j|\}}t|ttt	fr6t
|tjkrF| j}| |}t|dd}|rf| gS z"t|j|}t|j|| | gW S  tk
r   | jdks| jd dkrt|s| ||| Y S | d }| ||| }|g Y S nt|tj}	g }
|  }t|D ]Z\}}|}|	rB|dd||d f }|dd||d f }|||}|
| q|
 Y S Y nX dS )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   rU   r   N)r	   rq   r'  rc   r;   r#  rp   r0   r2   r/   r   r   r  r~   r   rK   r!   rh   r9   r   rV   rW   r(   r   putmaskZnonzeror(  r   r   r   )rY   r   new	orig_maskrc   noopr)  r   r   is_arrayr   r   rn   nsubmaskr   r]   r]   r^   r+    s@    

zBlock.putmaskinferc              
   C  sT  |j | j kstt|tttfr$t| j dk}t|}ttj	| j
}|}|rR|j}t|| \}}|rp|  gS |tjkr| j}| |}zt|j|}	W n tttfk
r   | j dks| jd dkr| |}
|
||}| 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 Y nX |	}t||  |}||k	rt!|rt"|t"|k rt| || t#d| }t$||| nNt!|r,t|tj	s,t"|| jd kr,t%|&|j}t'| ||}|rH|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   rU   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   ))rV   r   rp   r0   r2   r/   r7   r	   rq   r'  rc   r#  r;   r   r   r  r~   r   r!   rh   r   r   r   rW   r   wherer   rC   r   r   r   r:   sumr(   r   r   r+  r   r   expressionsr   )rY   r   condr4  Z	transposerc   
orig_othericondr.  r)  r   r   r/  r   r   rn   r   Zothr1  r   Zaltr   r]   r]   r^   r5    sj    






zBlock.where
int | Nonelimitr   rR   c           	        s   t |d}| jsd}nt| j}t| j|\}}|rZ|r>| gS |  }|j|g d}|S |dk	rzd||| jd |k< |r| 	|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   NFrU   r3  c                   s   g | ]}|j |g d qS )r   )r   r   r   r]   r^   r     s     z Block.fillna.<locals>.<listcomp>)r   rs   r5   rc   r;   r   r   ZcumsumrV   r+  r#  r5  r   )	rY   r   r=  r   r   r.  r   r   r   r]   r   r^   fillna  s&    

zBlock.fillnapadr   forwardzIndex | Nonez
str | Nonez
Any | None)
methodr  indexr   r=  limit_direction
limit_arear~   r   rR   c
                 K  s  t |d}| js$|r| gS |  gS zt|}W n tk
rJ   d }Y nX |d krt| jjdkrt|rj| gS |  gS | jr| j	dkr| j
d dkr|dkr| jt| j|||||||||	f
|
S |r| jn| j }ttj|}tj|f|||||||d|
 | |}||g|	S )Nr   fr   r   rU   )rA  r  rB  r=  rC  rD  r~   )r   rs   r   r   Zclean_fill_methodr   rh   rr   r   rV   rW   rX   r   interpolaterc   r	   rq   r'  Zinterpolate_array_2dr   r   )rY   rA  r  rB  r   r=  rC  rD  r~   r   r[   r   datar   r]   r]   r^   rF    sR    

&	
zBlock.interpolaterU   r0  r  rR   c                 C  s    t j| j||d}| j|dgS )z'return block for the diff of the valuesr  r   )r  diffrc   r   )rY   r0  r  r   r]   r]   r^   rJ    s    z
Block.diffperiodsr  r~   rR   c                 C  s   t |s| jtkrtd| |}zt| j|}W n. tk
rd   | |}|j	|||d Y S X t
tj| j}t	||||}| |gS dS )z+shift the block by periods, possibly upcastzfill_value must be a scalar)r  r~   N)r   Z	is_scalarrh   r   r   r   r!   r   r   r@   r	   rq   r'  rc   r   )rY   rL  r  r~   r)  r   rc   r   r]   r]   r^   r@     s    	
 
zBlock.shiftlinearrM   )qsr  rR   c                 C  sV   | j dkst|dkstt|s&t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   rU   r   r"  )rV   r   r(   r<   rc   rq   asarray_valuesr   r$  r   )rY   rN  interpolationr  r   r]   r]   r^   quantile  s    zBlock.quantilec                 C  s   t | dS )zC
        Return a new Block with the given loc(s) deleted.
        Nr   )rY   r   r]   r]   r^   delete@  s    zBlock.deletec                 C  s   t | dS z(return a boolean if I am possibly a viewNr   rj   r]   r]   r^   is_viewF  s    zBlock.is_viewrC   c                 C  s   t | dS )zP
        The array that Series.array returns. Always an ExtensionArray.
        Nr   rj   r]   r]   r^   array_valuesK  s    zBlock.array_valuesDtypeObj | Nonerh   rR   c                 C  s   t | dS )z
        return an internal format, currently just the ndarray
        this is often overridden to handle to_dense like operations
        Nr   rt   r]   r]   r^   
get_valuesR  s    zBlock.get_valuesc                 C  s   t | d S rf   r   rj   r]   r]   r^   values_for_jsonY  s    zBlock.values_for_json)N)N)F)N)TTTT)Fr   )r   N)T)FN)FTN)FF)TF)F)r2  )NFN)	r?  r   NFNr@  NNN)rU   )r   N)rM  r   )N)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   rX   r   r   r`   r   r   rh   r   r   r   r   r   r  r   r  r  rW   r  r   r  r   r  r  r&  r(  r+  r5  r>  rF  rJ  r@   rR  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	d
ZddddZd%dddd fddZddddZ	e
ddddZd&dddddZd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r2|j}t||| z|||< W n ttfk
r } z^t| t	| j
r| |}||| W Y 0S t| tr| |}||| W Y S  W 5 d}~X Y nX | S dS )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   rV   r#  rL   r   r   _catch_deprecated_value_errorr'   rh   r   r(  rp   NDArrayBackedExtensionBlock)rY   r   r   Zorig_indexerZ
orig_valuerc   errr   r]   r]   r^   r(  d  s(    






zEABackedBlock.setitemr2  rS   rT   c              
   C  s  | j j}t|}|}|}| |}| |}|tjkr<| j}t|| \}}|rZ|  gS z|	||j}	W nJ t
tfk
r }
 z$t|
 | jdks| jd dkrt| jr| |}|||}| j||d W Y S t| tr| |}|||}| j||d W Y S  nt|tjtf}g }|  }t|D ]Z\}}|}|rj|d d ||d f }|d d ||d f }|||}|| q@| W Y S W 5 d }
~
X Y nX | |	}|gS )NrU   r   r   )rc   r#  r7   r  r   r  r~   r;   r   Z_wherer   r   re  rV   rW   r'   rh   r   r5  r   rp   rf  rq   r'  rC   r   r   r   r   )rY   r   r8  r4  Zarrr9  Z	orig_condr:  r.  r   rg  r   r   r/  r   rn   r   r0  r1  r   r]   r]   r^   r5    sL    







zEABackedBlock.wherec              
   C  s  t |}| j}|jdkr|j}|}|}| |}| |}| sH| gS z||| W n* ttfk
r } zt	| | jdks| j
d dkrt| jr| |}||| W Y S t| tr| |}||| W Y S  nt|tjtf}g }	|  }
t|
D ]Z\}}|}|r6|dd||d f }|dd||d f }|||}|	| q|	 W Y S W 5 d}~X Y nX | gS )z+
        See Block.putmask.__doc__
        r   rU   r   N)r7   rc   rV   r#  r  r   Z_putmaskr   r   re  rW   r'   rh   r   r+  rp   rf  rq   r'  rC   r   r   r   )rY   r   r,  rc   Zorig_newr-  rg  r   r/  r   r   rn   r   r0  r1  r   r]   r]   r^   r+    sD    






zEABackedBlock.putmaskNFr;  rl   r<  c              	     s~   | j jdkrjz| jj||d}W n8 ttfk
rX   tjdt| dt	t
 d  Y nX | |}|gS t j||||dS )Nr   )r=  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   )r=  r   r   )rh   rr   rc   r>  r   r   rw   rx   r   FutureWarningr   r   super)rY   r   r=  r   r   r   Zres_blk	__class__r]   r^   r>    s    	
zEABackedBlock.fillnara   c                 C  s,   | j |}| j|}t| ||| jdS )Nr   )rc   rS  r   r   rV   rY   r   rc   r   r]   r]   r^   rS  4  s    zEABackedBlock.deletec                 C  s   | j S rf   r   rj   r]   r]   r^   rV  :  s    zEABackedBlock.array_valuesrW  r	  rX  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   rO  r   rW   )rY   rh   rc   r]   r]   r^   rY  >  s    
zEABackedBlock.get_valuesc                 C  s   t | jS rf   )rq   rO  rc   rj   r]   r]   r^   rZ  H  s    zEABackedBlock.values_for_jsonr?  r   c           	      K  sH   | j }|jdkr.|dkr.|jj|||dj}n|j|||d}| |S )Nr   r   )r   rA  r=  )rc   rV   r#  r>  r   )	rY   rA  r  r   r=  r~   r[   rc   r   r]   r]   r^   rF  K  s
    zEABackedBlock.interpolate)r2  )NFN)N)r?  r   FNN)r   r[  r\  r]  r^  r(  r5  r+  r>  rS  r   rV  rY  rZ  rF  __classcell__r]   r]   rj  r^   rd  ]  s(   
8?=     
         rd  c                      s  e Zd ZU dZdZdZdZded< edddd	Z	d
dddZ
d9ddddddZdd Zdd ZeddddZedd Zddejfddd d!d"d#d$Zd%dd&d'd(Zed)d d&d*d+Zd:ddd-d. fd/d0Zd;ddd1d-d2d3d4Zdd5d6d7d8Z  ZS )<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   r   rT   c                 C  s*   | j dkrt| jfS t| jt| jfS )NrU   )rV   r   rc   r   rj   r]   r]   r^   rW   i  s    
zExtensionBlock.shaper  )rn   c                 C  s   t |trp|\}}t|s4|dkr4t|  dn2t |trf|dk rT|t| j7 }| j||d  S | j| S |dkrt|  d| jS d S )Nr   z only contains one itemrU   )rp   tuplecomis_null_slice
IndexErrorr   r   rc   )rY   rn   colr   r]   r]   r^   r  p  s    	


zExtensionBlock.igetr   rl   r   r  c                 C  s"   |r| j  | _ || j d d < d S rf   r  r  r]   r]   r^   r    s    zExtensionBlock.set_inplacec                 C  sv   t |tjtfrF|j| jjd krF|jd dks4t|dddf }n,t |trr|jd dksbt|j	dddj
}|S )z@
        If necessary, squeeze a (N, 1) ndarray to (N,)
        rU   Nr   rI  )rp   rq   r'  rC   rV   rc   rW   r   r/   Z_ixsrP  r  r]   r]   r^   r    s    
z!ExtensionBlock._maybe_squeeze_argc                 C  s   t |trt|dkrtdd |D rn|\}}|jdkrT|dk rT|jd dks\td|dddf }njt|d r|d dkr|d }nFt	
|d r|d }n.t|d r|d d dkr|d }n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'  rV   r   r]   r]   r^   r     s     z9ExtensionBlock._unwrap_setitem_indexer.<locals>.<genexpr>rU   r   zPThis should not be reached. Please report a bug at github.com/pandas-dev/pandas/N)rp   ro  r   r  sizerW   r   r   
is_integerrp  rq  r(   )rY   r   firstsecondr]   r]   r^   r    s0    




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   Z_is_numericrj   r]   r]   r^   r`    s    zExtensionBlock.is_numericr   Nr  rd   r   ra   r  c                 C  sP   |t jkrd}| jj||dd}| jdkr6|dkr6t|dkrD| j}| ||S )r  NT)r~   r  rU   )r   r  rc   takerV   r   r   r   )rY   r   r  r   r~   r   r]   r]   r^   r    s    

zExtensionBlock.take_ndr  r   c                 C  sN   | j dkrDt|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 ExtensionArrayrU   N)rV   rp   r   r   ranger   rc   )rY   r   Z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   rV   )rY   r   r   r]   r]   r^   getitem_block_index!  s    
z"ExtensionBlock.getitem_block_indexrU   rS   rH  c                   s@   |dkr&|dkr&t  jt| jddS |dkr2d}t  ||S )Nr   rI  rU   )ri  rJ  r   rc   )rY   r0  r  rj  r]   r^   rJ  +  s
    zExtensionBlock.diffr   rK  c                 C  s   | j j||d}| |gS )z
        Shift the block by `periods`.

        Dispatches to underlying ExtensionArray and re-boxes in an
        ExtensionBlock.
        )rL  r~   rc   r@   r   )rY   rL  r  r~   r   r]   r]   r^   r@   8  s    zExtensionBlock.shiftr  r  c                   sD   |j \}}|j| }|| } fddtt||D }||fS )Nc                   s<   g | ]4\}\}}t jj||  d t|ddqS ))r  r~   r   r   )r   rc   rx  r   )r   rn   indicesZplacer~   r   rY   r]   r^   r   ^  s   	
  z+ExtensionBlock._unstack.<locals>.<listcomp>)Zarange_resultr#  r   r   )rY   r%  r~   r  r   r   r   r   r]   r}  r^   r&  B  s    

	zExtensionBlock._unstack)F)rU   )r   N)r   r[  r\  r]  rg   ra  r   r^  r   rW   r  r  r  r  rb  rU  r`  r   r  r  r   r
   rz  rJ  r@   r&  rm  r]   r]   rj  r^   rn  W  s2   
,
(	
rn  c                   @  sh   e Zd ZU ded< eddddZedddd	ZddddddZddddZddddZ	d
S )
NumpyBlockr	  rc   rl   rT   c                 C  s   | j jdk	S rT  )rc   baserj   r]   r]   r^   rU  o  s    zNumpyBlock.is_viewrC   c                 C  s
   t | jS rf   )rE   rc   rj   r]   r]   r^   rV  t  s    zNumpyBlock.array_valuesNrW  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  s   | j S 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   rV   rl  r]   r]   r^   rS    s    zNumpyBlock.delete)N)
r   r[  r\  r^  rb  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                   @  sh   e Zd ZU dZded< eddddZedddd	ZdddddddZ	ddddddddZ
dS )rf  z8
    Block backed by an NDArrayBackedExtensionArray
    rO   rc   rl   rT   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k	S rT  )rc   _ndarrayr  rj   r]   r]   r^   rU    s    z#NDArrayBackedExtensionBlock.is_viewr   rd   rS   rH  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.
        rI  )rc   r@   r   )rY   r0  r  rc   r   r]   r]   r^   rJ    s    z NDArrayBackedExtensionBlock.diffNr   rK  c                 C  s"   | j }|j|||d}| |gS )N)r~   r  r{  )rY   rL  r  r~   rc   r   r]   r]   r^   r@     s    z!NDArrayBackedExtensionBlock.shift)r   )r   N)r   r[  r\  r]  r^  r   r   rb  rU  rJ  r@   r]   r]   r]   r^   rf    s   
rf  	Exceptionr   )rg  rR   c                 C  s6   t | tr2t | trndt| kr$ndt| kr2 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   )rg  r]   r]   r^   re    s    

re  c                   @  s0   e Zd ZU dZdZdZded< dddd	Zd
S )DatetimeLikeBlockz*Block for datetime64[ns], timedelta64[ns].r]   FzDatetimeArray | TimedeltaArrayrc   r	  rT   c                 C  s   | j jS rf   )rc   r  rj   r]   r]   r^   rZ    s    z!DatetimeLikeBlock.values_for_jsonN)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   ra  rg   rf  rZ  r]   r]   r]   r^   r    s   
r  c                   @  sF   e Zd ZdZdZeddddddZeddddddd	d
dZdS )ObjectBlockr]   TFrl   rS   r   c                 C  sr   | j dkstz|| j}W n tk
r:   |s2 g  Y S X t|tjsLt|j dksZt|dd}| |gS )z;
        For object-dtype, we operate column-wise.
        r   rU   r   )	rV   r   rc   r   rp   rq   r'  r   r   )rY   r   r   resr]   r]   r^   r     s    
zObjectBlock.reducer   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   rV   r"   r   r   )rY   r   r   r   r   rc   r   r]   r]   r^   r     s    
zObjectBlock.convertN)F)TTTT)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dZdS )CategoricalBlockr]   r   rT   c                 C  s   | j jS rf   r   rj   r]   r]   r^   rh   "  s    zCategoricalBlock.dtypeN)r   r[  r\  r_  rb  rh   r]   r]   r]   r^   r    s   r  r   )rc   rR   c                 C  sV   t | tjr0t| } t| jjtr0tj| t	d} t | t
tfrR| jdk	rR| 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   freqZ
_with_freqr   r]   r]   r^   r   +  s    
r   r   r   c                 C  s~   | j }| j}t| trt}n^t| tr,t}nN|tkr:t}n@t| t	rJt
}n0t| trZt}n |dkrht}n|dkrvt}n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   )rE  crn   ro   rm   )r   rr   rp   rH   rn  r+   r  r   r  r.   rf  r,   r  r  r  )rh   vtyperr   clsr]   r]   r^   get_block_typeH  s$    



r  r   r   c                 C  s    t | j}t| } || d|dS )Nr   rV   r   )r  rh   r   )rc   r   klassr]   r]   r^   r$  q  s    
r$  rd   )rV   rR   c                C  s>   t |tst|}t| || t| j}t| } || ||dS )Nr  )rp   r   
check_ndimr  rh   r   )rc   r   rV   r  r]   r]   r^   r   |  s    

r   )r   rV   rR   c                 C  s   | j |kr$td| j  d| dnvt| js~| j |krPtd| j  d| dt|t| krtdt|  dt| n|dkrt|d	krtd
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   rU   zneed to splitN)rV   r   r$   rh   r   )rc   r   rV   r]   r]   r^   r    s    


r  rb   rW  z3tuple[np.ndarray | ExtensionArray, DtypeObj | None])rc   rh   rV   rR   c                 C  s@   t | tr(|  } |r(|dkr(t| } t |tr8|j}| |fS )zL
    Ensure that we don't allow PandasArray / PandasDtype in internals.
    rU   )rp   r1   Zto_numpyrq   Z
atleast_2dr-   Znumpy_dtype)rc   rh   rV   r]   r]   r^   extract_pandas_array  s    


r  rS   rT   c                 C  sf   |dkrg }t | trB| D ]$}t |tr4|| q|| qn t | tsXtt| ||  |S )z.return a new extended blocks, given the resultN)rp   listr   r   ra   r   r   )r   r   rr]   r]   r^   r     s    


r   rU   )rc   rV   rR   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 | TimedeltaArrayrU   r   )rV   r$   rh   r	   r   )rc   rV   r]   r]   r^   r     s
    


r   r   .)r   r   float_formatdecimalr	  c                K  s0  t | tr2| jjjdkr2tj| jjt| j	|d} t
| } t | ttfr| jdkrx| jf d|i|}|jtdd}|S g }tt| D ]8}| |ddf jf d|i|}||jtdd qt|S | jjdkrtt| st|dkr:|d	kr:t| }	|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 dS )r   ZMmr!  rU   r   Fr   NrE  r  rP   r   r   )FloatArrayFormatter)r   r  r  r   Zfixed_widthZU1z<U)#rp   rA   
categoriesrh   rr   r  r  rP  r#   _codesrJ   rB   rG   rV   Z_format_native_typesr   rP   ry  r   r   rq   Zvstackr)   r5   r   r   Zpandas.io.formats.formatr  Zget_result_as_arrayrC   rO  r   Zword_lenr   itemsize)rc   r   r   r  r  r[   r   Zresults_convertedrn   r   r  	formatterr  r   r  r]   r]   r^   r     sj    

 


r   c                 C  s4   t | ttfr| tS t | ttfr,| jS | S d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).
    N)rp   rF   rD   r   rP   rB   rG   _datar   r]   r]   r^   r|   B	  s
    	
r|   )N)rU   )
__future__r   	functoolsr   r   typingr   r   r   r   r   r	   r
   rw   Znumpyrq   Zpandas._libsr   r   Zlibinternalsr   r   Zpandas._libs.internalsr   Zpandas._libs.tslibsr   Zpandas._typingr   r   r   r   r   r   Zpandas.errorsr   Zpandas.util._decoratorsr   Zpandas.util._exceptionsr   Zpandas.util._validatorsr   Zpandas.core.dtypes.astyper   Zpandas.core.dtypes.castr   r   r   r    r!   r"   Zpandas.core.dtypes.commonr#   r$   r%   r&   r'   r(   r)   r*   Zpandas.core.dtypes.dtypesr+   r,   r-   r.   Zpandas.core.dtypes.genericr/   r0   r1   r2   Zpandas.core.dtypes.inferencer3   Zpandas.core.dtypes.missingr4   r5   r6   Zpandas.core.algorithmscoreZ
algorithmsr  Zpandas.core.array_algos.putmaskr7   r8   r9   r:   r;   Z pandas.core.array_algos.quantiler<   Zpandas.core.array_algos.replacer=   r>   r?   Z"pandas.core.array_algos.transformsr@   Zpandas.core.arraysrA   rB   rC   rD   rE   rF   rG   Zpandas.core.arrays.sparserH   Zpandas.core.baserI   Zpandas.core.commoncommonrp  Z#pandas.core.computation.expressionsZcomputationr7  Zpandas.core.constructionrJ   rK   Zpandas.core.indexersrL   Zpandas.core.missingr   ZpandasrM   rN   Zpandas.core.arrays._mixinsrO   rh   r   r`   ra   rd  rn  r~  r  ZNDArrayBackedBlockrf  re  r  r  r  r  r   r  r$  r   r  r  r   r   r   r|   r]   r]   r]   r^   <module>   s   $	  (
$	
         Y {  24)*X