3
���h>t � @ sf d dl m Z mZ d dlZd dlZd dlmZmZmZmZ d dl Z d dl
Zd dlm
Z
mZmZmZ d dljjZd dlmZ d dlmZ d dlmZ d dlmZ d d lmZ d d
lm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* d dl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ d dlAmBZB d d
lCmDZDmEZEmFZFmGZG d dlHmIZImJZJmKZK d dlLjMjNZd dlOmPZP d dlQmRZRmSZSmTZTmUZUmVZVmWZW d dlXmYZY d dlZjMj[Z\d dl]m^Z^ d dl_m`Z`maZambZb d dlcjMjdZdd dlemfZf e�r
d dlgmhZh G dd� deY�ZiG dd� dei�ZjG dd� dej�ZkG dd� dei�ZlG dd� del�ZmG d d!� d!em�ZnG d"d#� d#em�ZoG d$d%� d%el�ZpG d&d'� d'�ZqG d(d)� d)eqei�ZrG d*d+� d+ejer�ZsG d,d-� d-eqep�ZtG d.d/� d/el�ZuG d0d1� d1ei�ZvG d2d3� d3ej�ZwdFd4d5�ZxdGd6d7�ZydHd8d9�ZzdIee{ed;�d<d=�Z|d>d?� Z}ej~ej~ej~d@�dAdB�Zeej~dC�dDdE�Z�dS )J� )�datetime� timedeltaN)�
TYPE_CHECKING�Any�List�Optional)�NaT�algos�lib�writers)�BlockPlacement)�
conversion)�
tz_compare)� ArrayLike)�validate_bool_kwarg)�astype_nansafe�convert_scalar_for_putitemlike�find_common_type�infer_dtype_from�infer_dtype_from_scalar�maybe_downcast_numeric�maybe_downcast_to_dtype�maybe_infer_dtype_type�
maybe_promote�maybe_upcast�soft_convert_objects)�DT64NS_DTYPE�TD64NS_DTYPE�
is_bool_dtype�is_categorical_dtype�is_datetime64_dtype�is_datetime64tz_dtype�is_dtype_equal�is_extension_array_dtype�is_float�is_float_dtype�
is_integer�is_integer_dtype�is_interval_dtype�is_list_like�is_object_dtype�is_period_dtype�is_re�is_re_compilable� is_sparse�is_timedelta64_dtype�pandas_dtype)�ExtensionDtype)�ABCDataFrame�
ABCIndexClass�ABCPandasArray� ABCSeries)�_isna_compat�is_valid_nat_for_dtype�isna)�shift)�Categorical�
DatetimeArray�ExtensionArray�PandasArray�PandasDtype�TimedeltaArray)�PandasObject)�
extract_array)�check_setitem_lengths�is_empty_indexer�is_scalar_indexer)�
nanpercentile)�Indexc @ s� e Zd ZdZdddgZdZdZdZdZdZ dZ
dZdZdZ
dZdZdZdZdZeeeed d�dd ��Zd�dd�Zd
d� Zedd� �Zedd� �Zeed�dd��Zeed�dd��Zdd� Z dd� Z!e"d�dd�Z#d�dd�Z$e%j&d�d d!�Z'ed"d#� �Z(ed$d%� �Z)e)j*d&d%� �Z)d�d d�d'd(�Z+d�d)d*�Z,e-d�d+d,�Z.ed�d-d.�Z/d/d0� Z0d1d2� Z1d3d4� Z2d�d5d6�Z3ed7d8� �Z4ed9d:� �Z5d;d<� Z6d=d>� Z7d
d�d?d@�Z8e9d d�dAdB�Z:e9d d�dCdD�Z;d�ee9d dE�dFdG�Z<ee9d dE�dHdI�Z=d�e9d e9d dJ�dKdL�Z>d�dMdN�Z?d�ee-dP�dQdR�Z@d�eeeeedS�dTdU�ZAeBedV�dWdX�ZCeedY�dZd[�ZDd�d]d^�ZEd�ed_�d`da�ZFd�eeedb�dcdd�ZGdedf� ZHdgdh� ZId�eeee9d dj�dkdl�ZJdmdn� ZKd�e-eeLdq eeLe e-eLe- eLeB eeLe- dr�
dsdt�ZMd�e-eeeLe eLeB eeLe- e9d du�dvdw�ZNd�e-dqeLeB eeLe e-eLe- eeLe- e9d dx�
dydz�ZOd
ePjQfed{�d|d}�ZRd�eee9d d�d�d��ZSd�eed��d�d��ZTd�eee9d d��d�d��ZUd�d�� ZVd�ed{�d�d��ZWd�eeedb�d�d��ZXd
S )��Blockz�
Canonical n-dimensional unit of homogeneous dtype contained in a pandas
data structure
Index-ignorant; let the container take care of that
� _mgr_locs�values�ndimFT)rI � placementrJ �returnc C s t j| �}||_||_||_|S )z<
Fastpath constructor, does *no* validation
)�object�__new__rJ rI rH )�clsrI rK rJ �obj� rQ �>/tmp/pip-build-5_djhm0z/pandas/pandas/core/internals/blocks.py�_simple_newo s
zBlock._simple_newNc C s^ | j ||�| _|| _|| _| jrZ| jrZt| j�t| j�krZtdt| j�� dt| j�� ���d S )NzWrong number of items passed z, placement implies )�_check_ndimrJ �mgr_locsrI �_validate_ndim�len�
ValueError)�selfrI rK rJ rQ rQ rR �__init__| s zBlock.__init__c C s: |dkr|j }| jr6|j |kr6td|j � d|� d���|S )a�
ndim inference and validation.
Infers ndim from 'values' if not provided to __init__.
Validates that values.ndim and ndim are consistent if and only if
the class variable '_validate_ndim' is True.
Parameters
----------
values : array-like
ndim : int or None
Returns
-------
ndim : int
Raises
------
ValueError : the number of dimensions do not match
Nz1Wrong number of dimensions. values.ndim != ndim [z != �])rJ rV rX )rY rI rJ rQ rQ rR rT � s zBlock._check_ndimc C s dS )z�
The array-like that can hold the underlying values.
None for 'Block', overridden by subclasses that don't
use an ndarray.
NrQ )rY rQ rQ rR �_holder� s z
Block._holderc C s | j | jjfS )N)�_can_consolidate�dtype�name)rY rQ rQ rR �_consolidate_key� s zBlock._consolidate_key)rL c C s | j jdk S )z* return a boolean if I am possibly a view N)rI �base)rY rQ rQ rR �is_view� s z
Block.is_viewc C s | j p
| jS )z$ return True if I am a non-datelike )�is_datetime�is_timedelta)rY rQ rQ rR �is_datelike� s zBlock.is_datelikec C s | j S )aC
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).
)rI )rY rQ rQ rR �external_values� s zBlock.external_valuesc C s | j S )zJ
The array that Series._values returns (internal values).
)rI )rY rQ rQ rR �internal_values� s zBlock.internal_valuesc C s
t | j�S )zP
The array that Series.array returns. Always an ExtensionArray.
)r= rI )rY rQ rQ rR �array_values� s zBlock.array_valuesc C s t |�r| jjt�S | jS )z�
return an internal format, currently just the ndarray
this is often overridden to handle to_dense like operations
)r* rI �astyperM )rY r^ rQ rQ rR �
get_values� s zBlock.get_valuesc C s t j| j�j| j�S )z2
This is used in the JSON C code.
)�np�asarrayrI �reshape�shape)rY rQ rQ rR �get_block_values_for_json� s zBlock.get_block_values_for_jsonc C s t jS )N)rk �nan)rY rQ rQ rR �
fill_value� s zBlock.fill_valuec C s | j S )N)rH )rY rQ rQ rR rU � s zBlock.mgr_locsc C s t |tj�stj|�}|| _d S )N)�
isinstance�libinternalsr rH )rY �new_mgr_locsrQ rQ rR rU � s
c C s2 |dkr| j }| jr"t|| jd�}t||| jd�S )zm
Create a new block, with type inference propagate any values that are
not specified
N)rJ )rK rJ )rU �is_extension�_block_shaperJ �
make_block)rY rI rK rQ rQ rR rw � s
zBlock.make_blockc C s. |dkr| j }|dkr| j}t| �|||d�S )z4 Wrap given values in a block of same type as self. N)rK rJ )rU rJ �type)rY rI rK rJ rQ rQ rR �make_block_same_class s
zBlock.make_block_same_classc C sj t | �j}| jdkr0|� dt| �� d| j� �}n6djdd� | jD ��}|� d| jj� d|� d| j� �}|S ) N� z: z dtype: z x c s s | ]}t |�V qd S )N)�str)�.0�srQ rQ rR � <genexpr> s z!Block.__repr__.<locals>.<genexpr>z, z , dtype: ) rx �__name__rJ rW r^ �joinrn rU �indexer)rY r_ �resultrn rQ rQ rR �__repr__ s
zBlock.__repr__c C s
t | j�S )N)rW rI )rY rQ rQ rR �__len__ s z
Block.__len__c C s | j j| jfS )N)rU r� rI )rY rQ rQ rR �__getstate__ s zBlock.__getstate__c C s( t j|d �| _|d | _| jj| _d S )Nr rz )rs r rU rI rJ )rY �staterQ rQ rR �__setstate__ s
zBlock.__setstate__c C s
| j | S )z return a slice of my values )rI )rY �slicerrQ rQ rR �_slice s zBlock._slicec C st |dkr*t |t�r|d n|}| j| }nt |t�s<t|�}| j|�}| jr`|j| jkr`td��t| �j ||| j�S )z�
Perform __getitem__-like, return result as block.
As of now, only supports slices that preserve dimensionality.
Nr z Only same dim slicing is allowed)
rr �tuplerU r r� rV rJ rX rx rS )rY r� rt Zaxis0_slicer�
new_valuesrQ rQ rR �
getitem_block$ s
zBlock.getitem_blockc C s | j jS )N)rI rn )rY rQ rQ rR rn 7 s zBlock.shapec C s | j jS )N)rI r^ )rY rQ rQ rR r^ ; s zBlock.dtypec C s
| j | S )N)rI )rY �irQ rQ rR �iget? s z
Block.igetc C s || j |< |