
    M/Ph!                     z    d Z ddlZddlmZ d ZefdZd ZddZ	d	 Z
d
 Zd Zd Zd Zd Zd ZddZd Zd ZdS )zhelper 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                     t          t          | t                    t          | t                    g          rt	          j        |           S t          | t          j                  r| S | S )N)any
isinstancelisttuplenparrayndarray)xs    `/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/statsmodels/stats/moment_helpers.py_convert_to_multidimr      sY    
Jq$Au!5!5677 x{{	Arz	"	"      c                 V    t          | j                  dk     r ||           S | j        S )N   )lenshapeT)r   totypes     r   _convert_from_multidimr      s*    
17||avayy3Jr   c                 p    t          |           }d }t          j        |d|          }t          |          S )zvconvert central to non-central moments, uses recursive formula
    optionally adjusts first moment to return mean
    c           
      Z   | d         }dgt          |           z   } d| d<   d|g}t          | dd                    D ]f\  }}|dz   }|                    d           t          |dz             D ]4}||xx         t	          ||d          | |         z  |||z
  z  z  z  cc<   5g|dd          S )Nr      r   Texactr   	enumerateappendranger   )mcmeanmncnnmnks          r   _local_countszmc2mnc.<locals>._local_counts*   s    !uS488^1$ir!""v&& 	K 	KEBQAJJqMMM1q5\\ K KA$q!40002a584AE?JJK122wr   r   r   r	   apply_along_axisr   )r    r   r'   ress       r   mc2mncr+   $   sD     	R  A
 
 
 
mQ
2
2C!#&&&r   Tc                 v    t          |           }fd}t          j        |d|          }t          |          S )zvconvert non-central to central moments, uses recursive formula
    optionally adjusts first moment to return mean
    c           	      X   | d         }dgt          |           z   } g }t          |           D ]l\  }}|                    d           t          |dz             D ]?}d||z
  z  t	          ||d          z  }||xx         || |         z  |||z
  z  z  z  cc<   @mr||d<   |dd          S )Nr   r   Tr   r   )r"   r!   mur%   r$   r&   sgn_combwmeans          r   r'   zmnc2mc.<locals>._local_countsA   s    1vcDIIocNN 	= 	=DAqIIaLLL1q5\\ = =AE?T!Qd-C-C-CC1CF*Ta!e_<<=  	BqE!""vr   r   r(   )r"   r1   Xr'   r*   s    `   r   mnc2mcr3   ;   sO     	S!!A     
mQ
2
2C!#&&&r   c                 p    t          |           }d }t          j        |d|          }t          |          S )zconvert non-central moments to cumulants
    recursive formula produces as many cumulants as moments

    References
    ----------
    Kenneth Lange: Numerical Analysis for Statisticians, page 40
    c           
      f   ddg}| d         }dgt          |           z   } t          | dd                    D ]l\  }}|dz   }|                    d           t          |dz
            D ]:}||xx         t	          |dz
  |d          | ||z
           z  ||         z  z  cc<   ;m||d<   |dd          S )Nr   g        r   r   Tr   r   )kappar    kappa0r#   r$   r%   r&   s          r   r'   zcum2mc.<locals>._local_counts]   s    Xqd5kk!uQRRy)) 	K 	KEBQAIIaLLL1q5\\ K K1a!eQd333eAElBRUJJK1!""vr   r   r(   )r6   r2   r'   r*   s       r   cum2mcr8   S   sD     	U##A
 
 
 
mQ
2
2C!#&&&r   c                 p    t          |           }d }t          j        |d|          }t          |          S )zconvert non-central moments to cumulants
    recursive formula produces as many cumulants as moments

    https://en.wikipedia.org/wiki/Cumulant#Cumulants_and_moments
    c           	      P   dgt          |           z   } dg}t          | dd                    D ]o\  }}|dz   }|                    |           t          d|          D ]?}t	          |dz
  |dz
  d          }||xx         |||         z  | ||z
           z  z  cc<   @p|dd          S )Nr   Tr   r   )r"   r6   r#   r$   r%   r&   num_wayss          r   r'   zmnc2cum.<locals>._local_countsv   s    cDIIos122w'' 	= 	=EBQALLOOO1a[[ = =Aq1uD999aHuQx/#a!e*<<= QRRyr   r   r(   )r"   r2   r'   r*   s       r   mnc2cumr<   n   sD     	S!!A	 	 	 
mQ
2
2C!#&&&r   c                     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    
first_steps     r   mc2cumr?      s8     J*bj)) "\
:r   c                 |    t          |           }d }t          j        |d|          }t          |t                    S )z9convert mean, variance, skew, kurtosis to central momentsc                     | \  }}}}d gdz  }||d<   ||d<   ||dz  z  |d<   |dz   |dz  z  |d<   t          |          S )	N   r   r         ?r         @       @   )r   )argsr/   sig2skkurcnts         r   r'   zmvsk2mc.<locals>._local_counts   sa     D"cfqjAAdck!A)ts{*ASzzr   r   r   r	   r)   r   r   rG   r2   r'   r*   s       r   mvsk2mcrN      sD    T""A   
mQ
2
2C!#u---r   c                 |    t          |           }d }t          j        |d|          }t          |t                    S )z=convert mean, variance, skew, kurtosis to non-central momentsc                     | \  }}}}|}|||z  z   }||dz  z  }|d|z  |z  z   |dz  z   }|dz   |dz  z  }	|	d|z  |z  z   d|z  |z  |z  z   |dz  z   }
||||
fS )NrC   rF   rD   rE   rB       )rG   r    mc2skewkurtr"   mnc2mc3mnc3mc4mnc4s              r   r'   zmvsk2mnc.<locals>._local_counts   s    "CtR"W}cSj!QVc\!B!G+czcSj)QVc\!AFRK#$55a?T4&&r   r   rL   rM   s       r   mvsk2mncr[      sD    T""A' ' ' 
mQ
2
2C!#u---r   c                 |    t          |           }d }t          j        |d|          }t          |t                    S )z9convert central moments to mean, variance, skew, kurtosisc                     | \  }}}}t          j        ||dz            }t          j        ||dz            dz
  }||||fS )NrC   rE   rD   )r	   divide)rG   r    rS   rW   rY   rT   rU   s          r   r'   zmc2mvsk.<locals>._local_counts   sN     CcycSj))ycSj))C/Ct$$r   r   rL   rM   s       r   mc2mvskr_      sD    T""A% % % 
mQ
2
2C!#u---r   c                 |    t          |           }d }t          j        |d|          }t          |t                    S )z>convert central moments to mean, variance, skew, kurtosis
    c                     | \  }}}}|}|||z  z
  }|d|z  |z  |dz  z   z
  }|d|z  |z  d|z  |z  |z  z   |dz  z   z
  }t          ||||f          S )NrF   rB   rQ   )r_   )	rG   r"   rV   rX   rZ   r    rS   rW   rY   s	            r   r'   zmnc2mvsk.<locals>._local_counts   s     $T4S3Ya"fslR1W,-a"fslQVb[3%66q@ACc*+++r   r   rL   rM   s       r   mnc2mvskrb      sF     	T""A, , , 
mQ
2
2C!#u---r   Fc                     t          j        |           } t          j        t          j        |                     }| t          j        ||          z  }|r||fS |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.
    )r	   
asanyarraysqrtdiagouter)cov
return_stdstd_corrs       r   cov2corrrl      sW    , -

C7273<<  D$%%%D Tzr   c                     t          j        |           } t          j        |          }| t          j        ||          z  }|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	   rd   rg   )rk   stdrj   rh   s       r   corr2covro     s=    , =D=D
$%%
%CJr   c                 N    t          j        t          j        |                     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	   re   rf   )rh   s    r   se_covrq     s      7273<<   r   )T)F)__doc__numpyr	   scipy.specialr   r   r   r   r+   r3   r8   r<   r?   rN   r[   r_   rb   rl   ro   rq   rR   r   r   <module>ru      s                &*    ' ' '.' ' ' '0' ' '6' ' '0  . . .$. . .&. . .. . .>   >  8! ! ! ! !r   