
    !g!                     x    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y)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/dash_apps/app1/venv/lib/python3.12/site-packages/statsmodels/stats/moment_helpers.py_convert_to_multidimr      sE    
Jq$Au!567xx{	Arzz	"     c                 Z    t        | j                        dk  r ||       S | j                  S )N   )lenshapeT)r   totypes     r   _convert_from_multidimr      s%    
177|aay33Jr   c                 b    t        |       }d }t        j                  |d|      }t        |      S )zvconvert central to non-central moments, uses recursive formula
    optionally adjusts first moment to return mean
    c           
         | d   }dgt        |       z   } d| d<   d|g}t        | dd        D ]V  \  }}|dz   }|j                  d       t        |dz         D ]*  }||xx   t	        ||d      | |   z  |||z
  z  z  z  cc<   , X |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8^1$ir!"v& 	KEBQAJJqM1q5\ KA$q!402a584AE?JJK	K
 12wr   r   r   r	   apply_along_axisr   )r    r   r'   ress       r   mc2mncr+   $   s4     	R A
 

mQ
2C!#&&r   c                 h    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           	         | d   }dgt        |       z   } g }t        |       D ]\  \  }}|j                  d       t        |dz         D ]5  }d||z
  z  t	        ||d      z  }||xx   || |   z  |||z
  z  z  z  cc<   7 ^ 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IocN 	=DAqIIaL1q5\ =AE?T!Qd-CC1CF*Ta!e_<<=	=
 BqE!"vr   r   r(   )r"   r1   Xr'   r*   s    `   r   mnc2mcr3   ;   s5     	S!A 

mQ
2C!#&&r   c                 b    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           
         ddg}| d   }dgt        |       z   } t        | dd        D ]Y  \  }}|dz   }|j                  d       t        |dz
        D ]-  }||xx   t	        |dz
  |d      | ||z
     z  ||   z  z  cc<   / [ ||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d5k!uQRy) 	KEBQAIIaL1q5\ K1a!eQd3eAElBRUJJK	K
 1!"vr   r   r(   )r6   r2   r'   r*   s       r   cum2mcr8   S   s4     	U#A
 

mQ
2C!#&&r   c                 b    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           	      
   dgt        |       z   } dg}t        | dd        D ]\  \  }}|dz   }|j                  |       t        d|      D ]2  }t	        |dz
  |dz
  d      }||xx   |||   z  | ||z
     z  z  cc<   4 ^ |dd  S )Nr   Tr   r   )r"   r6   r#   r$   r%   r&   num_wayss          r   r'   zmnc2cum.<locals>._local_countsv   s    cDIos12w' 	=EBQALLO1a[ =Aq1uD9aHuQx/#a!e*<<=	= QRyr   r   r(   )r"   r2   r'   r*   s       r   mnc2cumr<   n   s4     	S!A	 

mQ
2C!#&&r   c                 z    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?      s/     J*bjj)\\
:r   c                 l    t        |       }d }t        j                  |d|      }t        |t              S )z9convert mean, variance, skew, kurtosis to central momentsc                 x    | \  }}}}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   s_     D"cfqjAAdck!A)ts{*ASzr   r   r   r	   r)   r   r   rG   r2   r'   r*   s       r   mvsk2mcrN      s4    T"A 

mQ
2C!#u--r   c                 l    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[      s4    T"A' 

mQ
2C!#u--r   c                 l    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   sL     CcyycSj)yycSj)C/Ct$$r   r   rL   rM   s       r   mc2mvskr_      s4    T"A% 

mQ
2C!#u--r   c                 l    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      s6     	T"A, 

mQ
2C!#u--r   c                     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      sO    , --
C772773< 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                 R    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      772773<  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   