U
    ,dL"                     @   s6  d Z ddlZddlmZmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZmZmZmZ ddlmZ G dd deZG d	d
 d
ejZG dd deZG dd dejZe	edd Ze	edd Ze
ddd Z e
edd Z!eeG dd dej"Z#eeG dd dej"Z$eedd eedd eed d! d"d# Z%d$d% Z&ed&ed'd( Z'ed&ed)d* Z(edeej)d+d, Z*edeej)d-d. Z+eeej)ed/d0 Z,eed1d2 Z-eed3d4 Z.eed5d6 Z/eed7d8 Z0eed9d:d; Z1ee2d<d= Z3eed>d?d@ Z4dS )Az.
Implementation of a minimal Pandas-like API.
    N)typescgutils)models)typeof_impltype_callableregister_modellower_builtinboxunboxNativeValueoverloadoverload_attributeoverload_methodmake_attribute_wrapper)impl_ret_borrowedc                   @   s8   e Zd ZdZdd Zdd Zedd Zedd	 Zd
S )Indexz-
    A minimal pandas.Index-like object.
    c                 C   s(   t |tjst|jdkst|| _d S N   )
isinstancenpndarrayAssertionErrorndim_data)selfdata r   >/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/pdlike_usecase.py__init__   s    zIndex.__init__c                 C   s
   t | jS N)iterr   r   r   r   r   __iter__   s    zIndex.__iter__c                 C   s   | j jS r   )r   dtyper!   r   r   r   r#      s    zIndex.dtypec                 C   s   | j jS r   )r   flagsr!   r   r   r   r$   !   s    zIndex.flagsN	__name__
__module____qualname____doc__r   r"   propertyr#   r$   r   r   r   r   r      s   
r   c                       sF   e Zd ZdZdZ fddZedd Zedd ZdddZ	  Z
S )	IndexTypez+
    The type class for Index objects.
      c                    s   || _ tt| |d| d S r   )pyclasssuperr+   r   )r   r#   layoutr-   	__class__r   r   r   ,   s    zIndexType.__init__c                 C   s   | j | j| jfS r   )r-   r#   r/   r!   r   r   r   key0   s    zIndexType.keyc                 C   s   t | jd| jS r   )r   Arrayr#   r/   r!   r   r   r   as_array4   s    zIndexType.as_arrayNr   c                 C   s6   |dkst |d kr| j}|p"| j}t| ||| jS r   )r   r#   r/   typer-   r   r#   r   r/   r   r   r   copy8   s
    
zIndexType.copy)Nr   Nr&   r'   r(   r)   Zarray_priorityr   r*   r2   r4   r7   __classcell__r   r   r0   r   r+   &   s   

r+   c                   @   s8   e Zd ZdZdd Zdd Zedd Zedd	 Zd
S )Seriesz.
    A minimal pandas.Series-like object.
    c                 C   s<   t |tjstt |tst|jdks,t|| _|| _d S r   )r   r   r   r   r   r   _values_index)r   r   indexr   r   r   r   E   s
    zSeries.__init__c                 C   s
   t | jS r   )r    r;   r!   r   r   r   r"   L   s    zSeries.__iter__c                 C   s   | j jS r   )r;   r#   r!   r   r   r   r#   O   s    zSeries.dtypec                 C   s   | j jS r   )r;   r$   r!   r   r   r   r$   S   s    zSeries.flagsNr%   r   r   r   r   r:   @   s   
r:   c                       sF   e Zd ZdZdZ fddZedd Zedd ZdddZ	  Z
S )
SeriesTypez,
    The type class for Series objects.
    r,   c                    sL   t |tst|| _|| _t| jdd| _d||f }tt	| 
| d S )Nr   Czseries(%s, %s))r   r+   r   r#   r=   r   r3   valuesr.   r>   r   )r   r#   r=   namer0   r   r   r   ^   s    zSeriesType.__init__c                 C   s   | j | jfS r   )r#   r=   r!   r   r   r   r2   f   s    zSeriesType.keyc                 C   s   | j S r   )r@   r!   r   r   r   r4   j   s    zSeriesType.as_arrayNr   r?   c                 C   s6   |dkst |dkst |d kr&| j}t| || jS Nr   r?   )r   r#   r5   r=   r6   r   r   r   r7   n   s
    zSeriesType.copy)Nr   r?   r8   r   r   r0   r   r>   X   s   

r>   c                 C   s.   t | j|}|jdkstt|j|jt| S r   )r   r   r   r   r+   r#   r/   r5   )valcarrtyr   r   r   typeof_indexv   s    rF   c                 C   s@   t | j|}t | j|}|jdks&t|jdks4tt|j|S rB   )r   r<   r;   r   r   r/   r>   r#   )rC   rD   r=   rE   r   r   r   typeof_series|   s
    rG   Z__array_wrap__c                 C   s   dd }|S )Nc                 S   s(   t | ttfr$| j|j|j|jdS d S )N)r#   r   r/   )r   r+   r>   r7   r#   r   r/   )Z
input_typeresultr   r   r   typer   s
    ztype_array_wrap.<locals>.typerr   contextrI   r   r   r   type_array_wrap   s    rL   c                 C   s   dd }|S )Nc                 S   sB   t |tr>t | tjr>| jdks$t| jdks2tt| j|S d S )Nr?   r   )	r   r+   r   r3   r/   r   r   r>   r#   )r   r=   r   r   r   rI      s    z&type_series_constructor.<locals>.typerr   rJ   r   r   r   type_series_constructor   s    rM   c                   @   s   e Zd Zdd ZdS )
IndexModelc                 C   s"   d|j fg}tj| ||| d S )Nr   )r4   r   StructModelr   r   ZdmmZfe_typemembersr   r   r   r      s    zIndexModel.__init__Nr&   r'   r(   r   r   r   r   r   rN      s   rN   c                   @   s   e Zd Zdd ZdS )SeriesModelc                 C   s*   d|j fd|jfg}tj| ||| d S )Nr=   r@   )r=   r4   r   rO   r   rP   r   r   r   r      s    zSeriesModel.__init__NrR   r   r   r   r   rS      s   rS   r   r   r=   r<   r@   r;   c                 K   s   t || |f|S r   r   Zcreate_struct_proxyrK   buildertypkwargsr   r   r   
make_index   s    rY   c                 K   s   t || |f|S r   rT   rU   r   r   r   make_series   s    rZ   Z	__array__c                 C   s$   t | ||jd |d d}|dS )Nr   refr   )rY   args_get_ptr_by_namerK   rV   sigr]   rC   r   r   r   index_as_array   s    ra   c                 C   s$   t | ||jd |d d}|dS )Nr   r[   r@   )rZ   r]   r^   r_   r   r   r   series_as_array   s    rb   c                 C   s,   t | ||j}|d |_t| ||j| S r   )rY   return_typer   r   	_getvalue)rK   rV   r`   r]   destr   r   r   index_wrap_array   s    
rf   c                 C   sN   t | ||jd |d d}t | ||j}|d |_|j|_t| ||j| S )Nr   valuer   )rZ   r]   rc   r@   r=   r   rd   )rK   rV   r`   r]   srcre   r   r   r   series_wrap_array   s
    
rj   c                 C   s6   |\}}t | ||j}||_||_t| ||j| S r   )rZ   rc   r=   r@   r   rd   )rK   rV   r`   r]   r   r=   seriesr   r   r   pdseries_constructor   s
    rl   c                 C   s<   |j |d}t|j|j| }|| j|j|_t	|
 S )z7
    Convert a Index object to a native structure.
    r   )pyapiobject_getattr_stringrY   rK   rV   r
   r4   rh   r   r   rd   )rW   objrD   r   r=   r   r   r   unbox_index   s    rp   c                 C   s\   |j |d}|j |d}t|j|j| }|| j|j|_|| j|j|_t	|
 S )z8
    Convert a Series object to a native structure.
    r<   r;   )rm   rn   rZ   rK   rV   r
   r=   rh   r@   r   rd   )rW   ro   rD   r=   r@   rk   r   r   r   unbox_series   s    rq   c                 C   sN   t |j|j| |d}|j|j| j}|| j|j	}|j
||f}|S )z=
    Convert a native index structure to a Index object.
    rg   )rY   rK   rV   rm   unserializeserialize_objectr-   r	   r4   r   call_function_objargs)rW   rC   rD   r=   classobjarrayobjindexobjr   r   r   	box_index   s
    rx   c                 C   s^   t |j|j| |d}|j|jt}|| j|j}|| j	|j
}|j|||f}|S )z?
    Convert a native series structure to a Series object.
    rg   )rZ   rK   rV   rm   rr   rs   r:   r	   r=   r4   r@   rt   )rW   rC   rD   rk   ru   rw   rv   Z	seriesobjr   r   r   
box_series   s    ry   Zis_monotonic_increasingc                 C   s   dd }|S )z'
    Index.is_monotonic_increasing
    c                 S   s>   | j }t|dkrdS |d }|D ]}||k r4 dS |}q"dS )Nr   TF)r   len)r=   r   uvr   r   r   getter  s    z-index_is_monotonic_increasing.<locals>.getterr   )r=   r}   r   r   r   index_is_monotonic_increasing  s    r~   c                 C   s   t | trdd }|S dS )z
    len(Series)
    c                 S   s
   t | jS r   )rz   r;   )rk   r   r   r   len_impl  s    zseries_len.<locals>.len_implN)r   r>   )rk   r   r   r   r   
series_len  s    
r   Zclipc                 C   s   dd }|S )z
    Series.clip(...)
    c                 S   sR   | j  }tt|D ].}|| }||k r4|||< q||kr|||< qt|| jS r   )r;   r7   rangerz   r:   r<   )rk   lowerupperr   ir|   r   r   r   	clip_impl(  s    


zseries_clip.<locals>.clip_implr   )rk   r   r   r   r   r   r   series_clip#  s    
r   )5r)   Znumpyr   Z
numba.corer   r   Znumba.core.datamodelr   Znumba.core.extendingr   r   r   r   r	   r
   r   r   r   r   r   Znumba.core.imputilsr   objectr   ZBufferr+   r:   ZArrayCompatibler>   registerrF   rG   rL   rM   rO   rN   rS   rY   rZ   ra   rb   r3   rf   rj   rl   rp   rq   rx   ry   r~   rz   r   r   r   r   r   r   <module>   sd   4


	












	