B
     \>"                 @   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   9lib/python3.7/site-packages/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 )N)r   dtype)r   r   r   r   r       s    zIndex.dtypec             C   s   | j jS )N)r   flags)r   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.
    i  c                s   || _ tt| |d| d S )Nr   )pyclasssuperr'   r   )r   r    layoutr(   )	__class__r   r   r   ,   s    zIndexType.__init__c             C   s   | j | j| jfS )N)r(   r    r*   )r   r   r   r   key0   s    zIndexType.keyc             C   s   t | jd| jS )Nr   )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 )Nr   )r   r    r*   typer(   )r   r    r   r*   r   r   r   copy8   s
    
zIndexType.copy)Nr   N)r"   r#   r$   r%   array_priorityr   r&   r,   r.   r0   __classcell__r   r   )r+   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 )Nr   )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 )N)r   r4   )r   r   r   r   r   L   s    zSeries.__iter__c             C   s   | j jS )N)r4   r    )r   r   r   r   r    O   s    zSeries.dtypec             C   s   | j jS )N)r4   r!   )r   r   r   r   r!   S   s    zSeries.flagsN)	r"   r#   r$   r%   r   r   r&   r    r!   r   r   r   r   r3   @   s
   r3   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.
    i  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    r6   r   r-   valuesr)   r7   r   )r   r    r6   name)r+   r   r   r   ^   s    zSeriesType.__init__c             C   s   | j | jfS )N)r    r6   )r   r   r   r   r,   f   s    zSeriesType.keyc             C   s   | j S )N)r9   )r   r   r   r   r.   j   s    zSeriesType.as_arrayNr   r8   c             C   s6   |dkst |dkst |d kr&| j}t| || jS )Nr   r8   )r   r    r/   r6   )r   r    r   r*   r   r   r   r0   n   s
    zSeriesType.copy)Nr   r8   )r"   r#   r$   r%   r1   r   r&   r,   r.   r0   r2   r   r   )r+   r   r7   X   s   r7   c             C   s.   t | j|}|jdkstt|j|jt| S )Nr   )r   r   r   r   r'   r    r*   r/   )valcarrtyr   r   r   typeof_indexv   s    r>   c             C   s@   t | j|}t | j|}|jdks&t|jdks4tt|j|S )Nr   r8   )r   r5   r4   r   r   r*   r7   r    )r;   r<   r6   r=   r   r   r   typeof_series|   s
    r?   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'   r7   r0   r    r   r*   )Z
input_typeresultr   r   r   typer   s    ztype_array_wrap.<locals>.typerr   )contextrA   r   r   r   type_array_wrap   s    rC   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 )Nr8   r   )	r   r'   r   r-   r*   r   r   r7   r    )r   r6   r   r   r   rA      s    z&type_series_constructor.<locals>.typerr   )rB   rA   r   r   r   type_series_constructor   s    rD   c               @   s   e Zd Zdd ZdS )
IndexModelc             C   s"   d|j fg}tj| ||| d S )Nr   )r.   r   StructModelr   )r   dmmfe_typemembersr   r   r   r      s    zIndexModel.__init__N)r"   r#   r$   r   r   r   r   r   rE      s   rE   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 )Nr6   r9   )r6   r.   r   rF   r   )r   rG   rH   rI   r   r   r   r      s    zSeriesModel.__init__N)r"   r#   r$   r   r   r   r   r   rJ      s   rJ   r   r   r6   r5   r9   r4   c             K   s   t || |f|S )N)r   create_struct_proxy)rB   buildertypkwargsr   r   r   
make_index   s    rO   c             K   s   t || |f|S )N)r   rK   )rB   rL   rM   rN   r   r   r   make_series   s    rP   Z	__array__c             C   s$   t | ||jd |d d}|dS )Nr   )refr   )rO   args_get_ptr_by_name)rB   rL   sigrR   r;   r   r   r   index_as_array   s    rU   c             C   s$   t | ||jd |d d}|dS )Nr   )rQ   r9   )rP   rR   rS   )rB   rL   rT   rR   r;   r   r   r   series_as_array   s    rV   c             C   s,   t | ||j}|d |_t| ||j| S )Nr   )rO   return_typer   r   	_getvalue)rB   rL   rT   rR   destr   r   r   index_wrap_array   s    
rZ   c             C   sN   t | ||jd |d d}t | ||j}|d |_|j|_t| ||j| S )Nr   )valuer   )rP   rR   rW   r9   r6   r   rX   )rB   rL   rT   rR   srcrY   r   r   r   series_wrap_array   s
    
r]   c             C   s6   |\}}t | ||j}||_||_t| ||j| S )N)rP   rW   r6   r9   r   rX   )rB   rL   rT   rR   r   r6   seriesr   r   r   pdseries_constructor   s
    r_   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_stringrO   rB   rL   r
   r.   r[   r   r   rX   )rM   objr<   r   r6   r   r   r   unbox_index   s    rc   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.
    r5   r4   )r`   ra   rP   rB   rL   r
   r6   r[   r9   r   rX   )rM   rb   r<   r6   r9   r^   r   r   r   unbox_series   s    rd   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.
    )r[   )rO   rB   rL   r`   unserializeserialize_objectr(   r	   r.   r   call_function_objargs)rM   r;   r<   r6   classobjarrayobjindexobjr   r   r   	box_index   s
    rk   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.
    )r[   )rP   rB   rL   r`   re   rf   r3   r	   r6   r.   r9   rg   )rM   r;   r<   r^   rh   rj   ri   Z	seriesobjr   r   r   
box_series   s    rl   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 }x|D ]}||k r4dS |}q$W dS )Nr   TF)r   len)r6   r   uvr   r   r   getter  s    
z-index_is_monotonic_increasing.<locals>.getterr   )rM   rp   r   r   r   index_is_monotonic_increasing  s    rq   c             C   s   t | trdd }|S dS )z
    len(Series)
    c             S   s
   t | jS )N)rm   r4   )r^   r   r   r   len_impl  s    zseries_len.<locals>.len_implN)r   r7   )r^   rr   r   r   r   
series_len  s    
rs   Zclipc             C   s   dd }|S )z
    Series.clip(...)
    c             S   sV   | j  }x>tt|D ].}|| }||k r6|||< q||kr|||< qW t|| jS )N)r4   r0   rangerm   r3   r5   )r^   lowerupperr   iro   r   r   r   	clip_impl(  s    

zseries_clip.<locals>.clip_implr   )r^   ru   rv   rx   r   r   r   series_clip#  s    
ry   )5r%   Znumpyr   Znumbar   r   Znumba.datamodelr   Znumba.extendingr   r   r   r   r	   r
   r   r   r   r   r   Znumba.targets.imputilsr   objectr   ZBufferr'   r3   ZArrayCompatibler7   registerr>   r?   rC   rD   rF   rE   rJ   rO   rP   rU   rV   r-   rZ   r]   r_   rc   rd   rk   rl   rq   rm   rs   ry   r   r   r   r   <module>   sD   4


	
