U
    f/e%                     @   s  d dl Z d dlZd dlZd dlmZmZmZ d dlm	Z
 d dlmZ d dlmZ dd Zdd Zejd	ed
d Zejdejgdgfejejgddgfeejgdgfeejejgddgfgdd Zejdg eg gdd Zejdeegdd Zdd Zejdi dg ig dddg dg dgddgg dgdd Zejddd gd!d" Zejd#d$d%d&dd'gd(d) Zd*d+d,d-d.d%gZd/d0 eD Z ejd	e d1d2 fd3d4 Z!ejd	e d5d6 Z"d7d8 Z#ejddd gd9d: Z$d;d< Z%dS )=    N)	DataFrame
MultiIndexSeries)frame_transform_kernels)
zip_framesc                 C   s,   |t k	r(| d } |dkr(td|  | S )zm
    Helper to ensure we have the right type of object for a test parametrized
    over frame_or_series.
    Ar   z%Test is only for DataFrame with axis=)r   pytestskip)objklassaxis r   K/tmp/pip-unpacked-wheel-tiezk1ph/pandas/tests/apply/test_frame_transform.py
unpack_obj   s
    r   c              	   C   sR   t ||| }tjdd t|}W 5 Q R X |jtj| d}|}t|| d S )Nignoreallr   )r   nperrstatesqrt	transformtmassert_equal)r   float_frameframe_or_seriesr
   Zf_sqrtresultexpectedr   r   r   test_transform_ufunc   s    r   opc                 C   sF  |r*|dkr*| dkr*|j tjjdd |dkr8dgng }| dksL| dkr^t|jd }nt|jd	 }|j|| d
j	|f| }|j	|| f| }t
|| d|jkst|d  |d< t|jjd	kst| dks| dkrt|jd }nt|jd	 }|j|| d
j	|f| }	|j	|| f| }
t
|
|	 d S )N
pct_change)   columnsz1shift axis=1 not yet implemented for ArrayManager)reasonfillnag        r   indexr!   r   Er   )node
add_markerr   markxfailr   onesshapegroupbyr   r   assert_frame_equalr"   AssertionErrorcopylenZ_mgrZarrays)r   r   r   Zusing_array_managerrequestargsr+   r   r   Z	expected2Zresult2r   r   r   test_transform_groupby_kernel)   s,    r4   z
ops, namesr   absolutec              	      s   | dkrdnd}t jdd  t fdd|D |d}W 5 Q R X | dkr^t j|g|_nt j|g|_ j|| d}t	|| d S )	N>   r   r%   r!   r   r   r   c                    s   g | ]}| qS r   r   ).0r   r   r   r   
<listcomp>X   s     z+test_transform_listlike.<locals>.<listcomp>r   )
r   r   r   r   Zfrom_productr"   r%   r   r   r.   )r   r   opsnamesZ
other_axisr   r   r   r7   r   test_transform_listlikeK   s    $r;   r9   c              	   C   s4   t | |d}tjtdd || W 5 Q R X d S Nr   z$No transform functions were providedmatchr   r   raises
ValueErrorr   r   r9   r   r
   r   r   r   test_transform_empty_listlikea   s    rC   boxc                 C   st   | dks| dkr.|j d }||g tj}n|jd }|jdg tj}|j||tji| d}t|| d S )Nr   r%   r   )r"   r   r   absr%   Zilocr   r.   )r   r   rD   er   r   r   r   r   test_transform_dictlikei   s    

rG   c                  C   sj   t ddgddgddgd} | ddgdd}t dddgd	dd	ggtdd
gddgd}t|| d S )Nr!         )abcr   rE   )rK   rL   g      ?g       @)r   rE   )r   r   r!   )r   r!   r   r"   )r   r   r   r   r.   )dfr   r   r   r   r   test_transform_dictlike_mixedv   s    rO   r   Zcumsumr   Bc              	   C   s4   t | |d}tjtdd || W 5 Q R X d S r<   r?   rB   r   r   r   test_transform_empty_dictlike   s    rR   	use_applyTFc                    s@   t | | } fdd}|j|| d}|d }t|| d S )Nc                    s   t |  krt| d S Nr!   )
isinstancerA   xr   rS   r   r   func   s    z test_transform_udf.<locals>.funcr   r!   )r   r   r   r   )r   r   rS   r   r
   rY   r   r   r   rX   r   test_transform_udf   s
    rZ   methodrE   shiftr    rankc                 C   s8   t dddgi}|| }t| |}t|| d S )Nr   rH   )r   r   operatormethodcallerr   r.   )r[   rN   r   r   r   r   r   test_transform_method_name   s    
ra   ZffillZbfillr$   padZbackfillc                 C   s   g | ]}|t kr|qS r   )	wont_fail)r6   rW   r   r   r   r8      s      r8   c                 C   s   | d S rT   r   rV   r   r   r   <lambda>       rd   c              
   C   s  | dkr |j tjjtdd tddtg i}|tk	rB|d }| dkrNd nt}t	
| tjtdd ||  W 5 Q R X tjtd	d || g W 5 Q R X tjtd	d |d| i W 5 Q R X tjtd	d |d| gi W 5 Q R X W 5 Q R X d S )
Nr]   )GH 40418: rank does not raise a TypeError)r@   r#   r      Ztshiftz!unsupported operand|not supportedr=   zTransform function failed)r'   r(   r   r)   r*   rA   r   objectFutureWarningr   assert_produces_warningr@   	TypeErrorr   )r   r   r2   r
   warnr   r   r   test_transform_bad_dtype   s(     rm   c                 C   s   | dkrt d tdtg dddgd}|dg | g}|| g}t|| |dg d| i}|| | d}t|| |dg d| gi}|| g| gd}t|| |dg| gd}|| dg| gd}t|| d S )	Nr]   rf   rg   r!   rH   rP   rQ   r\   )r   r	   r   rh   r   r   r   )r   rN   r   r   r   r   r   (test_transform_partial_failure_typeerror   s    
rn   c               	   C   sZ  d} dd }t dddgddd	gd
}|dg |g}tjt| d ||g}W 5 Q R X t|| |dg d|i}tjt| d |||d
}W 5 Q R X t|| |dg d|gi}tjt| d ||g|gd
}W 5 Q R X t|| |dg|gd
}tjt| dd ||dg|gd
}W 5 Q R X t|| d S )Nz>.*did not transform successfully and did not raise a TypeErrorc                 S   s   t t | dk rt| S N
   )r   sumrA   rV   r   r   r   r      s    z5test_transform_partial_failure_valueerror.<locals>.opr!   rH   rg   i  i  iX  rP   rQ   r=   r\   F)r>   Zcheck_stacklevel)r   r   r   rj   ri   r   )r>   r   rN   r   r   r   r   r   )test_transform_partial_failure_valueerror   s&     rr   c                    s@   ddg ddi fdd}dgj |df  d S )Nr!   rH   rL   rg   c                    s6   t | krt||g ks"t|d ks2t| S )NrL   )rU   rA   r/   )rW   rJ   rK   rL   Zexpected_argsZexpected_kwargsr   rS   r   r   f  s
    z%test_transform_passes_args.<locals>.fr   )r   )rS   r   rt   r   rs   r   test_transform_passes_args  s    	ru   c                  C   sP   t g ddgd} | dd }t||  | d dd }t|| d  d S )NZcol1Zcol2rM   c                 S   s   | d S ro   r   rV   r   r   r   rd     re   z0test_transform_empty_dataframe.<locals>.<lambda>c                 S   s   | d S ro   r   rV   r   r   r   rd   !  re   )r   r   r   r.   Zassert_series_equal)rN   r   r   r   r   test_transform_empty_dataframe  s
    rv   )&r_   Znumpyr   r   Zpandasr   r   r   Zpandas._testingZ_testingr   Zpandas.tests.apply.commonr   Zpandas.tests.frame.commonr   r   r   r)   Zparametrizer4   r   rE   arrayr;   rC   dictrG   rO   rR   rZ   ra   rc   Zframe_kernels_raiserm   rn   rr   ru   rv   r   r   r   r   <module>   sb   
!	









 
