U
    Kvf@                     @   s   d dl mZ d dlZ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mZ d dlmZmZmZ d dlmZ dZG dd	 d	Zd
d Zdd Zdd ZdS )    )PLATFORM_WIN32N)assert_allcloseassert_equalassert_raises)PCApca)data	princomp1	princomp2)EstimationWarningh㈵>c                   @   s   e Zd Zedd Zejjejjdd Z	dd Z
dd Zd	d
 Zdd Zejjdd Zdd Zejjdd Zdd Zejjedddd Zdd Zejjdd Zdd Zdd  Zd!S )"TestPCAc           
      C   s   t j }|d d}d}d}d}|j}|||f}|||f}|j|||fd| }	||	| | _| jd | _|| _	d}d}d}d}|j}|||f}|||f}|j|||fd| }	||	| | _
d S )	Ni     d         )size        ,  )nprandomZRandomStateseedstandard_normalZstandard_gammadotxx_copyrsx_wide)
clsr   kntZlamZnorm_rngefb r%   K/tmp/pip-unpacked-wheel-2v6byqio/statsmodels/multivariate/tests/test_pca.pysetup_class   s,    

zTestPCA.setup_classc                 C   s   t | j}| }|jdd}|jdd}|jdd}| }|jdd}|  t | jdd}|  t | jddd	}|  t | jd
dd}d| kstt| j|j d S )N
   ncompFZ	log_scaleT)Z
cumulative   standardizer.   demeanr   r*   glsZGLS)r   r   
plot_screeplot_rsquare__repr__AssertionErrorr   r   )selfclose_figurespcfigr%   r%   r&   test_smoke_plot_and_repr/   s    
z TestPCA.test_smoke_plot_and_reprc                 C   s  t | j}t | jdd}t|j|j tt|jd d d df t|jd d d df  tt|jd dd d f t|jd dd d f  t|j|j tt|j	d d d df t|j	d d d df  t | jddd}t | jddd}tt|jt|jt
d tt|jt|jt
d t|j|jt
d tt|j	t|j	t
d t| j|j t| j|j t| j|j d S )NZsvdmethodr   )r=   r*   ZnipalsZatol)r   r   r   
projectionr   absfactorscoeff	eigenvals	eigenvecs	DECIMAL_5r   r   )r7   Zpc_eigZpc_svdZ	pc_nipalsr%   r%   r&   test_eig_svd_equivD   sH    



zTestPCA.test_eig_svd_equivc                 C   s  t | j}t | jdd}t|j|j|j|j |j}t|j|tddd |j}t|j|tddd t | jdd}t|jd d d df |j t|jd dd d f |j t|j	d d |j	 t|j
d d |j
 t|jd d d df |j t | jddd	}| jd
}| j| }|j|}tj|\}	}
t|	}|d d d }|	| }	|
d d |f }
t||j t|	|j
 tt|
t|j tt|jt||
 t|j||  t | jdddd}| j}|j|}tj|\}	}
t|	}|d d d }|	| }	|
d d |f }
t||j t|	|j
 tt|
t|j tt|jt||
 d S )NF)	normalizer   r   r>   r(   r)      )r.   rG   r   )r.   r0   rG   )r   r   r   rA   r   rB   Tr   ZeyersquarerC   rD   meanlinalgZeighZargsortZtransformed_datar@   r?   )r7   r9   Z
pc_no_normZprincompweightsZpc_10muZxdmZxpxvalZvecindr   r%   r%   r&   test_optionsh   sR    



zTestPCA.test_optionsc                 C   s6  t jd }t|ddd}t}tt|jt|j t|j|j	|
d | tt|j	t|jj t|j|j	|j|jj t|d d ddd}|d d 
d}t}tt|jt|j t|j|j	| |d d  tt|j	t|jj t|j|j	|j|jj d S )Ng     @@F)rG   r.   r      )r   Zxor   r	   r   r   r@   rA   r   rB   rL   coefrJ   r
   )r7   r   r9   refrO   r%   r%   r&   test_against_reference   s$    
 zTestPCA.test_against_referencec              	   C   s   t jdd"}t| jdd}tt|d W 5 Q R X t jdd:}| j}|dt	d }t|dd	}tt|d W 5 Q R X t
tt| jd
d	 t
tt| jd
d t
tt| jdd t
tttjt	d dd d S )NT)recordr   r)      )r   rX   r   Zeigr<   unknownmissing       @)Ztol)r   r   )warningscatch_warningsr   r   r   lenr   r   r   Zonesr   
ValueErrornan)r7   wr9   r   r   r%   r%   r&   test_warnings_and_errors   s    z TestPCA.test_warnings_and_errorsc                 C   s   t t| j}t | j}t|jj|j | }|jdd}|jdd}| }|jdd}|	d}t t| jddd	 t t| jddd
 d S )Nr(   r)   Fr+   r,   r      Tr1   )r*   r.   )
r   pd	DataFramer   r   rA   valuesr3   r4   project)r7   r8   r9   Zpc1r:   Zprojr%   r%   r&   test_pandas   s    

zTestPCA.test_pandasc                 C   s
  t tt| jdd t tt| jtddgd | j| jd }||d d }t|ddddd	}t|dddd
}||j }|d d}d| }|t|d   }t	||j
 t||j t||j t|ddd|d}t	||j
 t	t|jt|j d S )NT)r2         ?)rN   r   r\   rX   F)r*   r.   r0   r2   r*   r.   r0   )r*   r.   r0   rN   )r   r`   r   r   r   arrayrL   r?   sqrtr   rN   r   r   r@   rA   )r7   r   Zpc_glsr9   errorsvarrN   Z
pc_weightsr%   r%   r&   test_gls_and_weights   s     
zTestPCA.test_gls_and_weightsc                 C   s   t | j}t|jjd | jjd  t|jjd tt| jj t t	
| j}t|jjd | jjd  t|jjd tt| jj d S )NrX   r   )r   r   r   rA   shaperD   minr   rl   re   rf   )r7   r9   r%   r%   r&   	test_wide   s    
 zTestPCA.test_widec                 C   s  t | jdd}| jd}| j| }tj|j|}|j|}t|j	||  t | jddd}tj|j|}|j|}t|j	||  t | jdddd}tj|j| j}|j|}t|j	| t | jddd}| jd}| j| }tj|j|}|j|}t|j	||  t | jddd}tj|j|}|j|}t|j	||  t | jddddd	}tj|j| j}|j|}t|j	| |j
}tt|d
 d S )Nr,   r)   r   F)r.   r*   )r.   r0   r*   Tr1   )r.   r0   r*   r2      )r   r   rL   r   rM   ZpinvrA   r   r   r?   rh   r   r`   )r7   r9   rO   Zdemean_xrT   directrh   r%   r%   r&   test_projection   s<    

zTestPCA.test_projectionzWindows 32-bit)reasonc              	   C   s  | j  }tj|d d dd d df< t|dd}|ttt|d }t|}t|j	|j	 t
||j t|dd}|d d ttt|df }t|}t|j	|j	 t
||j t|dd}|j|jkr|}n|}t|}t|j	|j	 t
||j t|d	d
d}t|}tj|dd}|| }	ttj|	d dd}
|	|
 }d||< || }d}d}|dkrt|d	ddd}|j	| ||< || }|| }tt|d tt|d  }|}|d7 }qj| j d }|j	|
 | }|| ||< t|j| t
| j | j | j }t|}t|dd}t|j	|j	td t|dd}t|j	|j	td t|dd}t|j	|j	td t|d	d}t|d	d
d}t|j	|j	td | j  }tj|d d d d f< ttt|dd ttt|dd ttt|dd ttt|d
d d S )Nr,      drop-rowrZ   rX   drop-colr   drop-minr   fill-emr*   r[   )Zaxisr   r   rj   gHj>Frk   r>   r)   )r   copyr   ra   r   Zlogical_notanyisnanr   r?   r   r   r   Znanmeanrm   sumZ_adjusted_datar   rE   r   r`   )r7   r   r9   Zx_dropped_rowZ
pc_droppedZx_dropped_colZx_dropped_minr[   rO   rn   sigmax_stdlastdeltacountZpc_tempcurrentZdiffr?   r%   r%   r&   test_replace_missing  sv    
$

(

zTestPCA.test_replace_missingc                 C   s  | j d }|d}|| }t|d}|| }t| j }|jd }t|d }t|d }	t|d D ]2}
||j	|
ddd }dt|d |	  ||
< qlt
||j t| j dd}t|d }	t|d D ]2}
||j	|
ddd }dt|d |	  ||
< qt
||j t| j ddd	}t|d }	t|d D ]4}
||j	|
ddd }dt|d |	  ||
< q>t
||j d S )
Nr   r   rX   r   F)Z	transformZunweightrj   r-   r/   )r   rL   r   stdr   rq   zerosr   rangerh   r   rK   )r7   r   rO   Zx_demeanr   r   r9   ZnvarrK   tssirn   r%   r%   r&   test_rsquareZ  s2    



zTestPCA.test_rsquarec                 C   s  | j  }tj|d d dd d df< t|ddd}t|}t|ddd}t|j|j t|j	|j	 tt| j  dd}t
|jt|jstt
|jt|jstt
|jt|jstt
|jt|jst| j  }tj|d d dd d df< t|}t|dd}t|dd}t|j|j t|j	|j	 t|d	d}t|d	d}t|j|j t|j	|j	 t|d
d}t|d
d}t|j|j t|j	|j	 d S )Nr,   rx   r   r|   r}   r)   ry   rZ   rz   r{   )r   r~   r   ra   r   re   rf   r   rB   rA   
isinstancetyper6   r   rC   rD   )r7   r   r9   Zpc_dfZpc_df_nomissingZx_dfr%   r%   r&   test_missing_dataframex  s6    



zTestPCA.test_missing_dataframec                 C   s&   | j  }tt|jt|d  d S )Nr   )r   r~   r   r   rA   r   )r7   r   r%   r%   r&   test_equivalence  s    
zTestPCA.test_equivalencec                 C   s0   | j  }t|ddj}t|j}t|| d S )NT)Zsvd_full_matrices)r   r~   r   rA   r   )r7   r   Zsvd_full_matrices_trueZsvd_full_matrices_falser%   r%   r&   test_equivalence_full_matrices  s    

z&TestPCA.test_equivalence_full_matricesN)__name__
__module____qualname__classmethodr'   pytestmarkZsmokeZ
matplotlibr;   rF   rR   rV   rc   ri   rp   Zslowrs   rv   Zskipifr   r   r   r   r   r   r%   r%   r%   r&   r      s,   
$-

	'
I
"r   c               	   C   s:   t d} t j| d< tjtdd t|  W 5 Q R X d S )Nr   2   )r   r   zdata contains non-finite valuesmatch)r   emptyra   r   raisesr`   r   )r   r%   r%   r&   test_missing  s    

r   c              	   C   sp   t jd}t j|dd df< tt t|ddd W 5 Q R X t|dd}t|j	j
t|j
d	 ksltd S )
Nr   r   r,   rz   r}   r{   rZ   rX   )r   r   r   ra   r   r   r`   r   maxrA   rq   r6   )reset_randomstater   pr%   r%   r&   test_too_many_missing  s    r   c              	   C   s   t jd}|d d d df d|d d dd f   |d d dd f< tjtdd t|dddj}W 5 Q R X |j|jd	 dfkst	d S )
N)i  r   rX   g{Gz?z#Many series are being down weightedr   r   Tr1   r   )
r   r   r   r   Zwarnsr   r   rA   rq   r6   )r   r   rA   r%   r%   r&   test_gls_warning  s
    <r   )Zstatsmodels.compat.platformr   r]   Znumpyr   Zpandasre   r   Znumpy.testingr   r   r   Zstatsmodels.multivariate.pcar   r   Z.statsmodels.multivariate.tests.results.datamlwr   r	   r
   Zstatsmodels.tools.sm_exceptionsr   rE   r   r   r   r   r%   r%   r%   r&   <module>   s       	