U
    ÃmœdÆ!  ã                   @   s”   d Z ddlZddlmZ dd„ Zefdd„Zdd	„ Zd"dd„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd#dd„Zdd„ Zd d!„ ZdS )$zôhelper functions conversion between moments

contains:

* conversion between central and non-central moments, skew, kurtosis and
  cummulants
* cov2corr : convert covariance matrix to correlation matrix


Author: Josef Perktold
License: BSD-3

é    N)Úcombc                 C   s:   t t| tƒt| tƒgƒr"t | ¡S t| tjƒr2| S | S d S )N)ÚanyÚ
isinstanceÚlistÚtupleÚnpÚarrayÚndarray)Úx© r   úY/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/statsmodels/stats/moment_helpers.pyÚ_convert_to_multidim   s
    
r   c                 C   s   t | jƒdk r|| ƒS | jS )Né   )ÚlenÚshapeÚT)r
   Ztotyper   r   r   Ú_convert_from_multidim   s    r   c                 C   s&   t | ƒ}dd„ }t |d|¡}t|ƒS )zvconvert central to non-central moments, uses recursive formula
    optionally adjusts first moment to return mean
    c              
   S   sž   | d }dgt | ƒ } d| d< d|g}t| dd … ƒD ]Z\}}|d }| d¡ t|d ƒD ]2}||  t||dd�| |  |||   7  < q\q6|dd … S )Nr   é   r   T©Úexact©r   Ú	enumerateÚappendÚranger   )ÚmcÚmeanÚmncÚnnÚmÚnÚkr   r   r   Ú_local_counts*   s    
2zmc2mnc.<locals>._local_countsr   ©r   r   Úapply_along_axisr   )r   r
   r!   Úresr   r   r   Úmc2mnc$   s    r%   Tc                    s*   t | ƒ}‡ fdd„}t |d|¡}t|ƒS )zvconvert non-central to central moments, uses recursive formula
    optionally adjusts first moment to return mean
    c              	      sž   | d }dgt | ƒ } g }t| ƒD ]b\}}| d¡ t|d ƒD ]B}d||  t||dd� }||  || |  |||   7  < q@q"ˆ r’||d< |dd … S )Nr   r   éÿÿÿÿTr   r   )r   r   Úmur   r   r    Zsgn_comb©Úwmeanr   r   r!   A   s    
(zmnc2mc.<locals>._local_countsr   r"   )r   r)   ÚXr!   r$   r   r(   r   Úmnc2mc;   s    r+   c                 C   s&   t | ƒ}dd„ }t |d|¡}t|ƒS )zÉconvert non-central moments to cumulants
    recursive formula produces as many cumulants as moments

    References
    ----------
    Kenneth Lange: Numerical Analysis for Statisticians, page 40
    c              
   S   s¢   ddg}| d }dgt | ƒ } t| dd … ƒD ]^\}}|d }| d¡ t|d ƒD ]6}||  t|d |dd�| ||   ||  7  < qTq.||d< |dd … S )Nr   g        r   r   Tr   r   )Úkappar   Zkappa0r   r   r   r    r   r   r   r!   ]   s    
6zcum2mc.<locals>._local_countsr   r"   )r,   r*   r!   r$   r   r   r   Úcum2mcS   s    r-   c                 C   s&   t | ƒ}dd„ }t |d|¡}t|ƒS )z«convert non-central moments to cumulants
    recursive formula produces as many cumulants as moments

    https://en.wikipedia.org/wiki/Cumulant#Cumulants_and_moments
    c              	   S   s–   dgt | ƒ } dg}t| dd … ƒD ]d\}}|d }| |¡ td|ƒD ]>}t|d |d dd�}||  |||  | ||   8  < qHq$|dd … S )Nr   Tr   r   )r   r,   r   r   r   r    Znum_waysr   r   r   r!   v   s    
(zmnc2cum.<locals>._local_countsr   r"   )r   r*   r!   r$   r   r   r   Úmnc2cumn   s    r.   c                 C   s"   t | ƒ}t|tjƒr|j}t|ƒS )z9
    just chained because I have still the test case
    )r%   r   r   r	   r   r.   )r   Z
first_stepr   r   r   Úmc2cum†   s    r/   c                 C   s(   t | ƒ}dd„ }t |d|¡}t|tƒS )z9convert mean, variance, skew, kurtosis to central momentsc                 S   sR   | \}}}}d gd }||d< ||d< ||d  |d< |d |d  |d< t |ƒS )	Né   r   r   ç      ø?r   ç      @ç       @é   )r   )Úargsr'   Zsig2ÚskZkurZcntr   r   r   r!   •   s    
zmvsk2mc.<locals>._local_countsr   ©r   r   r#   r   r   ©r5   r*   r!   r$   r   r   r   Úmvsk2mc‘   s    	r9   c                 C   s(   t | ƒ}dd„ }t |d|¡}t|tƒS )z=convert mean, variance, skew, kurtosis to non-central momentsc                 S   s„   | \}}}}|}|||  }||d  }|d| |  |d  }|d |d  }	|	d| |  d| | |  |d  }
||||
fS )Nr1   r4   r2   r3   r0   é   r   )r5   r   Úmc2ÚskewÚkurtr   Úmnc2Úmc3Úmnc3Úmc4Úmnc4r   r   r   r!   §   s    (zmvsk2mnc.<locals>._local_countsr   r7   r8   r   r   r   Úmvsk2mnc£   s    
rC   c                 C   s(   t | ƒ}dd„ }t |d|¡}t|tƒS )z9convert central moments to mean, variance, skew, kurtosisc                 S   s<   | \}}}}t  ||d ¡}t  ||d ¡d }||||fS )Nr1   r3   r2   )r   Údivide)r5   r   r;   r?   rA   r<   r=   r   r   r   r!   º   s    zmc2mvsk.<locals>._local_countsr   r7   r8   r   r   r   Úmc2mvsk¶   s    rE   c                 C   s(   t | ƒ}dd„ }t |d|¡}t|tƒS )z>convert central moments to mean, variance, skew, kurtosis
    c           	      S   sl   | \}}}}|}|||  }|d| | |d   }|d| | d| | |  |d   }t ||||fƒS )Nr4   r0   r:   )rE   )	r5   r   r>   r@   rB   r   r;   r?   rA   r   r   r   r!   Ê   s    (zmnc2mvsk.<locals>._local_countsr   r7   r8   r   r   r   Úmnc2mvskÅ   s    	rF   Fc                 C   s>   t  | ¡} t  t  | ¡¡}| t  ||¡ }|r6||fS |S dS )a/  
    convert covariance matrix to correlation matrix

    Parameters
    ----------
    cov : array_like, 2d
        covariance matrix, see Notes

    Returns
    -------
    corr : ndarray (subclass)
        correlation matrix
    return_std : bool
        If this is true then the standard deviation is also returned.
        By default only the correlation matrix is returned.

    Notes
    -----
    This function does not convert subclasses of ndarrays. This requires that
    division is defined elementwise. np.ma.array and np.matrix are allowed.
    N)r   Ú
asanyarrayÚsqrtÚdiagÚouter)ÚcovZ
return_stdÚstd_Úcorrr   r   r   Úcov2corrä   s    
rN   c                 C   s(   t  | ¡} t  |¡}| t  ||¡ }|S )aò  
    convert correlation matrix to covariance matrix given standard deviation

    Parameters
    ----------
    corr : array_like, 2d
        correlation matrix, see Notes
    std : array_like, 1d
        standard deviation

    Returns
    -------
    cov : ndarray (subclass)
        covariance matrix

    Notes
    -----
    This function does not convert subclasses of ndarrays. This requires
    that multiplication is defined elementwise. np.ma.array are allowed, but
    not matrices.
    )r   rG   rJ   )rM   ZstdrL   rK   r   r   r   Úcorr2cov  s    

rO   c                 C   s   t  t  | ¡¡S )a  
    get standard deviation from covariance matrix

    just a shorthand function np.sqrt(np.diag(cov))

    Parameters
    ----------
    cov : array_like, square
        covariance matrix

    Returns
    -------
    std : ndarray
        standard deviation from diagonal of cov
    )r   rH   rI   )rK   r   r   r   Úse_cov  s    rP   )T)F)Ú__doc__Únumpyr   Zscipy.specialr   r   r   r   r%   r+   r-   r.   r/   r9   rC   rE   rF   rN   rO   rP   r   r   r   r   Ú<module>   s    

