
    "g8                         d 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 Zd	 Zd
 Zd Z G d de      Z G d de      Z G d de      Z G d de      Zy)zM
Created on Fri Jan 29 19:19:45 2021

Author: Josef Perktold
License: BSD-3

    N)stats	integrateoptimize   )
transforms)Copula)check_random_statec                     t        j                  t         j                        j                  dz  }d }t        j                  |       }t        j                  |||      d   |z  }|S )Nd   c                 ^    t        j                  | t        j                  |       dz
  z        S Nr   )npsqueezeexp)ts    i/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/statsmodels/distributions/copula/archimedean.py	integrandz_debye.<locals>.integrand   s"    zz!rvvay1}-..    r   )r   finfofloat64epsr   r   quad)alphaEPSILONr   _alphadebye_values        r   _debyer      sT    hhrzz"&&,G/ZZF..GV<Q?&HKr   c                     t        j                  |       } |  dz  | dz  dz  z   | dz  dz  z
  | dz  dz  z   | dz  dz  z
  | d	z  d
z  z   | dz  dz  dz  z
  }|S )z^Debye function minus 1, Taylor series approximation around zero

    function is not used
          $   i     i:    i  
   i g     l    x"=r   asarray)xdm1s     r   _debyem1_expansionr+      sy    
 	

1A2a4!Q$r'>AqDI%1V3ad8mCb5?US[78CJr   c                 \    | dk  rt        |       }|S t        |       }dd|dz
  z  | z  z   }|S )a  Kendall's tau for Frank Copula

    This uses Taylor series expansion for theta <= 1.

    Parameters
    ----------
    theta : float
        Parameter of the Frank copula. (not vectorized)

    Returns
    -------
    tau : float, tau for given theta
    r   r   )_tau_frank_expansionr   )thetataur   s      r   	tau_frankr0   )   sD     z"5)
 J Um!{Q'%//Jr   c                     t        j                  |       } | dz  | dz  dz  z
  | dz  dz  z   | dz  dz  z
  | dz  dz  z   | d	z  d
z  dz  z
  }|S )N	      i     i     i@) i   r&   l    ^vr'   )r)   r/   s     r   r-   r-   A   sg    


1A Q3Ac>AqDJ&Ag51YFb53;}$%CJr   c                   N     e Zd ZdZd	 fd	Zd Zd Zd
dZd
dZd
dZ	d Z
 xZS )ArchimedeanCopulaaN  Base class for Archimedean copulas

    Parameters
    ----------
    transform : instance of transformation class
        Archimedean generator with required methods including first and second
        derivatives
    args : tuple
        Optional copula parameters. Copula parameters can be either provided
        when creating the instance or as arguments when calling methods.
    k_dim : int
        Dimension, number of components in the multivariate random variable.
        Currently only bivariate copulas are verified. Support for more than
        2 dimension is incomplete.
    c                 P    t         |   |       || _        || _        d| _        y )N)k_dimr   )super__init__args	transformk_args)selfr>   r=   r:   	__class__s       r   r<   zArchimedeanCopula.__init__[   s(    u%	"r   c                     t        |t        j                        rt        |      }t        |t              s|f}t	        |      dk(  s|dk(  r| j
                  }|S )Nr   N)
isinstancer   ndarraytuplelenr=   )r@   r=   s     r   _handle_argszArchimedeanCopula._handle_argsa   sK     dBJJ';D$&7Dt9>TW_99Dr   c                     t        j                  |      }|j                  d   | j                  k7  rdd l}|j                  dt               |S )Nr   zRu has different dimension than k_dim. This will raise exception in future versions)r   r(   shaper:   warningswarnFutureWarning)r@   urL   s      r   	_handle_uzArchimedeanCopula._handle_uo   sB    JJqM772;$**$MM I') r   c                 R   | j                  |      }| j                  |      }d}| j                  j                  }| j                  j                  } | ||g| j                  |      g| }t        |t        j                        r|nd}t        j                  |dd|      }|S )z#Evaluate cdf of Archimedean copula.rJ   Ng              ?)out)
rH   rP   r>   evaluateinversesumrD   r   rE   clip)r@   rO   r=   axisphiphi_invcdfvrS   s           r   cdfzArchimedeanCopula.cdfy   s      &NN1nn%%..((s1}t}((.66 rzz2dwwtR-r   c                 n     j                  |      } j                  |      }d} j                  j                  }|j                  d   dk(  r j                  j
                  }ng|j                  d   dk(  r j                  j                  }n>|j                  d   dk(  r j                  j                  }n|j                  d    fd}  j                  j                  |g| j                  |      }t        j                   ||g| |      }| ||g| z  }t        j                  |      S )z#Evaluate pdf of Archimedean copula.rJ   r    r3   r   c                  >     j                   j                  g|  S rC   r>   derivk_inverser=   kr@   s    r   psi_dz$ArchimedeanCopula.pdf.<locals>.psi_d       4t~~44Q>>>r   )rP   rH   r>   derivrK   deriv2_inversederiv3_inversederiv4_inverserT   rV   r   prodabs)	r@   rO   r=   rX   phi_d1rc   psipdfvrb   s	   `       @r   pdfzArchimedeanCopula.pdf   s   NN1  &%%772;!NN11EWWR[ANN11EWWR[ANN11E A? &dnn%%a/$/33D9wwva'$'.s"T"# vvd|r   c           
           j                  |      } j                  |      }d} j                  j                  }|j                  d   dk(  r j                  j
                  }ng|j                  d   dk(  r j                  j                  }n>|j                  d   dk(  r j                  j                  }n|j                  d    fd}  j                  j                  |g| j                  |      }t        j                  t        j                  t        j                   ||g|             |      }|t        j                  t        j                   ||g|             z  }|S )z4Evaluate log pdf of multivariate Archimedean copula.rJ   r    r3   r   c                  >     j                   j                  g|  S rC   r_   ra   s    r   rc   z'ArchimedeanCopula.logpdf.<locals>.psi_d   rd   r   )rP   rH   r>   re   rK   rf   rg   rh   rT   rV   r   logrj   )	r@   rO   r=   rX   rk   rc   rl   logpdfvrb   s	   `       @r   logpdfzArchimedeanCopula.logpdf   s)    NN1  &%%772;!NN11EWWR[ANN11EWWR[ANN11E A? &dnn%%a/$/33D9 &&va'7$'7 894@266"&&s!2T!2344r   c                 $    | j                  |      S rC   )theta_from_taur@   r/   s     r   _arg_from_tauzArchimedeanCopula._arg_from_tau   s    ""3''r   ) r    rx   )__name__
__module____qualname____doc__r<   rH   rP   r\   rn   rs   rw   __classcell__rA   s   @r   r8   r8   J   s+     8<(r   r8   c                   Z     e Zd ZdZd	 fd	Zd
dZd fd	Zd fd	ZddZddZ	d Z
 xZS )ClaytonCopulaa  Clayton copula.

    Dependence is greater in the negative tail than in the positive.

    .. math::

        C_\theta(u,v) = \left[ \max\left\{ u^{-\theta} + v^{-\theta} -1 ;
        0 \right\} \right]^{-1/\theta}

    with :math:`\theta\in[-1,\infty)\backslash\{0\}`.

    c                     ||f}nd}t         |   t        j                         ||       ||dk  s|dk(  rt	        d      || _        y )Nrx   r=   r:   rJ   r   zTheta must be > -1 and !=0)r;   r<   r   TransfClayton
ValueErrorr.   r@   r.   r:   r=   rA   s       r   r<   zClaytonCopula.__init__   sX    8DD113$eL{eqj !=>>
r   c                    t        |      }| j                  |      \  }|j                  || j                  f      }t	        j
                  d|z        j                  |df|      }| j                  dk7  r#dt        j                  |      |z  z
  d|z  z  }|S | j                  j                  t        j                  |       |z  |      }|S )NrR   r   sizerandom_stater          )r	   rH   randomr:   r   gammarvsr   rq   r>   rU   	r@   nobsr=   r   rngthr)   vrvs	            r   r   zClaytonCopula.rvs   s     .%JJdjj)*KKR $$4)#$F::?bffQi!m#r2B 	 ''"&&)a<B	r   c                 <   | j                  |      }| j                  |      \  }|j                  d   dk(  rV|dz   t        j                  |d      |dz    z  z  }t        j
                  || z  d      dz
  }d|z  dz    |z  }|||z  z  S t        |   ||      S )NrJ   r    r   rX   )rP   rH   rK   r   ri   rV   r;   rn   )r@   rO   r=   r   abcrA   s          r   rn   zClaytonCopula.pdf   s    NN1%772;!a27712.BF);;AqRCxb)A-Ab&1*"AqAv:7;q$''r   c                 &    t         |   ||      S N)r=   r;   rs   r@   rO   r=   rA   s      r   rs   zClaytonCopula.logpdf       w~ad~++r   c                     | j                  |      }| j                  |      \  }|j                  d   }t        j                  || z  d      |z
  dz   d|z  z  S )NrJ   r   r   r   )rP   rH   rK   r   rV   )r@   rO   r=   r   ds        r   r\   zClaytonCopula.cdf   sY    NN1%GGBKqbSz+a/!3CCr   c                 .    || j                   }||dz   z  S Nr    r.   r@   r.   s     r   r/   zClaytonCopula.tau   s    =JJE	""r   c                     d|z  d|z
  z  S )Nr    r   rx   rv   s     r   ru   zClaytonCopula.theta_from_tau  s    3w!c'""r   r   r   rx   Nry   rC   )rz   r{   r|   r}   r<   r   rn   rs   r\   r/   ru   r~   r   s   @r   r   r      s,    
		(,D##r   r   c                   j     e Zd ZdZd fd	ZddZd fd	ZddZd fd	ZddZ	ddZ
dd	Zd
 Z xZS )FrankCopulaa2  Frank copula.

    Dependence is symmetric.

    .. math::

        C_\theta(\mathbf{u}) = -\frac{1}{\theta} \log \left[ 1-
        \frac{ \prod_j (1-\exp(- \theta u_j)) }{ (1 - \exp(-\theta)-1)^{d -
        1} } \right]

    with :math:`\theta\in \mathbb{R}\backslash\{0\}, \mathbf{u} \in [0, 1]^d`.

    c                     ||f}nd}t         |   t        j                         ||       ||dk(  rt	        d      || _        y )Nrx   r   r   zTheta must be !=0)r;   r<   r   TransfFrankr   r.   r   s       r   r<   zFrankCopula.__init__  sR    8DD//1EJz !455
r   c           	         t        |      }| j                  |      \  }|j                  || j                  f      }t        j
                  j                  dt        j                  |       z
  |df|      }d|z  t        j                  dt        j                  t        j                  |       |z         t        j                  |       dz
  z  z         z  S )NrR   r   r   r   )
r	   rH   r   r:   r   logserr   r   r   rq   )r@   r   r=   r   r   r   r)   r   s           r   r   zFrankCopula.rvs%  s     .%JJdjj)*LLR"&&"+-#')#  ? Rx"&&bffq	zA~->&?$&FFB3K"$4'6 "6 7 7 	7r   c                    | j                  |      }| j                  |      \  }|j                  d   dk7  rt        	|   ||      S t        j                  | t        j                  |d      z        dz
  }t        j                  |       dz
  }| |z  d|z   z  }t        j                  t        j                  | |z        dz
  d      |z   }|dz  }||z  S )NrJ   r    r   r   )	rP   rH   rK   r;   rn   r   r   rV   ri   )
r@   rO   r=   r   g_g1numauxdenrA   s
            r   rn   zFrankCopula.pdf2  s    NN1%772;!7;q"%%VVRC"&&,,-1VVRC[1_cBh!b&!ggbffbS1Wo)3b8QhSyr   c                 J   | j                  |      }| j                  |      \  }|j                  d   }t        j                  dt        j
                  | |z        z
  d      }dt        j
                  |       z
  |dz
  z  }d|z  t        j                  d||z  z
        z  S )NrJ   r   r   r   )rP   rH   rK   r   ri   r   rq   )r@   rO   r=   r   dimr   r   s          r   r\   zFrankCopula.cdf@  s    NN1%ggbkgga"&&2**42662#;C!G,by266!cCi-000r   c                    | j                  |      }| j                  |      \  }|j                  d   dk(  r|d   |d   }}dt        j                  |       z
  }t        j
                  ||z        |||z   z  z
  }|dt        j
                  |dt        j                  | |z        z
  dt        j                  | |z        z
  z  z
        z  z  }|S t        |   ||      S )NrJ   r    .r   .r   r   )rP   rH   rK   r   r   rq   r;   rs   )	r@   rO   r=   r   u1u2r   rn   rA   s	           r   rs   zFrankCopula.logpdfJ  s    NN1%772;!vY&	BBFFB3KA&&a.2b>1C1rvva1rvvdRi'8#8 266B$)#44#6 6 7 7 7CJ 7>!T**r   c                 h   | j                  |      }| j                  |      \  }|j                  d   dk(  rr|d   |d   }}t        j                  | |z        }|t        j
                  |       t        j
                  | |z        z  t        j
                  | |z        z   z  }|S t        d      )zFConditional cdf of second component given the value of first.
        rJ   r    r   r   #u needs to be bivariate (2 columns))rP   rH   rK   r   r   expm1NotImplementedError)r@   rO   r=   r   r   r   cdfcs          r   cdfcond_2g1zFrankCopula.cdfcond_2g1Z  s     NN1%772;!vY&	B66B$)$DBHHbSMBHHrTBY$77"((R4"9:MMMDK%&KLLr   c           	      <   t        j                  |      }| j                  |      \  }|j                  d   dk(  rXt        j                  dt        j
                  |       d|z  dz
  t        j                  | |z        z  dz   z  z          |z  }|S t        d      )zFConditional pdf of second component given the value of first.
        rJ   r   r   )r   r(   rH   rK   rq   r   r   r   )r@   qr   r=   r   ppfcs         r   ppfcond_2g1zFrankCopula.ppfcond_2g1h  s     ZZ^%88B<1VVA2!eai2662#(+;;a?!A A B BDFGD K%&KLLr   c                 4    || j                   }t        |      S rC   )r.   r0   r   s     r   r/   zFrankCopula.tauv  s    =JJEr   c                 .    t        j                  t        j                  j                        }t        j                  t        j                  j
                        } fd}dk  rdnd}t        j                  ||||f      }|j                  d   }|S )Nc                 .    j                  |       z
  S )Nr   )r/   )r   r@   r/   s    r   _theta_from_tauz3FrankCopula.theta_from_tau.<locals>._theta_from_tau  s    88%8(3..r   g)\(?g      ?r    )boundsr   )	r   rq   sys
float_infominmaxr   least_squaresr)   )r@   r/   MIN_FLOAT_LOGMAX_FLOAT_LOGr   startresultr.   s   ``      r   ru   zFrankCopula.theta_from_tau}  sx    s~~112s~~112	/ Tzq''=H* +r   r   r   ry   rC   )rz   r{   r|   r}   r<   r   rn   r\   rs   r   r   r/   ru   r~   r   s   @r   r   r   
  s7    
71+ MM r   r   c                   Z     e Zd ZdZd	 fd	Zd
dZd fd	ZddZd fd	ZddZ	d Z
 xZS )GumbelCopulaa  Gumbel copula.

    Dependence is greater in the positive tail than in the negative.

    .. math::

        C_\theta(u,v) = \exp\!\left[ -\left( (-\log(u))^\theta +
        (-\log(v))^\theta \right)^{1/\theta} \right]

    with :math:`\theta\in[1,\infty)`.

    c                     ||f}nd}t         |   t        j                         ||       ||dk  rt	        d      || _        y )Nrx   r   r   zTheta must be > 1)r;   r<   r   TransfGumbelr   r.   r   s       r   r<   zGumbelCopula.__init__  sR    8DD002UKz !455
r   c           
         t        |      }| j                  |      \  }|j                  || j                  f      }t        j
                  j                  d|z  ddt        j                  t        j                  d|z  z        |z  |df|      }| j                  dk7  r5t        j                  t        j                  |       |z  d|z  z         }|S | j                  j                  t        j                  |       |z  |      }|S )NrR   r   r    r   r   )r	   rH   r   r:   r   levy_stabler   r   cospir   rq   r>   rU   r   s	            r   r   zGumbelCopula.rvs  s     .%JJdjj)*!!GRFF255AF#$* " 
 ::?266!9*q.b2g667B 	 ''"&&)a<B	r   c                    | j                  |      }| j                  |      \  }|j                  d   dk(  rt        j                  |       }||z  }t        j
                  |d      }|d|z  z  }t        j                  |       }||z   dz
  }	|d|z  dz
  z  }
t        j                  |d      |dz
  z  }t        j                  |d      dz  }||	z  |
z  |z  |z  S t        | %  ||      S )NrJ   r    r   rR   r   )
rP   rH   rK   r   rq   rV   r   ri   r;   rn   )r@   rO   r=   r   xyxy_thetasum_xy_thetasum_xy_theta_thetar   r   r   r   erA   s                r   rn   zGumbelCopula.pdf  s    NN1%772;!&&)BRxH66(4L!-#(!;**+A"R'#-ArA.A$c2A#.Aq519q=1$$7;q$''r   c                     | j                  |      }| j                  |      \  }t        j                  t        j                  |       |z  d      }t        j
                  |d|z  z         }|S )NrJ   r   rR   )rP   rH   r   rV   rq   r   )r@   rO   r=   r   hr\   s         r   r\   zGumbelCopula.cdf  s_    NN1%FFRVVAYJ2%B/ffaC"Ho%&
r   c                 &    t         |   ||      S r   r   r   s      r   rs   zGumbelCopula.logpdf  r   r   c                 .    || j                   }|dz
  |z  S r   r   r   s     r   r/   zGumbelCopula.tau  s    =JJE	U""r   c                     dd|z
  z  S r   rx   rv   s     r   ru   zGumbelCopula.theta_from_tau  s    AG}r   r   r   ry   rC   )rz   r{   r|   r}   r<   r   rn   r\   rs   r/   ru   r~   r   s   @r   r   r     s+    
 ((,#r   r   )r}   r   numpyr   scipyr   r   r    r   copulasr   statsmodels.tools.rng_qrngr	   r   r+   r0   r-   r8   r   r   r   rx   r   r   <module>r      ss      , ,   9	0x( x(vB#% B#J@# @FQ$ Qr   