K iZddlZddlmZddlmZddlmZddlmZ ddl m Z ddl m Z ddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddl mZddlmZddlmZm Z ddl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+gdZ,e(jZedZ.e(jZe"dZ.GddeZ/GddeZ0GddeZ1GddeZ2GddeZ3Gd d!eZ4y)"N)Sum)Add)Expr)expand)Mul)Eq)S)Symbol)Integral)Not)global_parameters)default_sort_key)_sympify) Relational)Boolean)variance covariance) RandomSymbolpspace dependentgiven sampling_ERandomIndexedSymbol is_randomPSpace sampling_Prandom_symbols) Probability ExpectationVariance Covariancec|j}t|dk(rtt||k(ryt d|DS)NFc32K|]}t|ywN)r).0is f/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sympy/stats/symbolic_probability.py z_..s+y|+s) free_symbolslennextiterany)xatomss r(_r1s: NNE 5zQ4U ,1 +U+ ++cy)NT)r/s r(r1r1 s r2c4eZdZdZdZddZdZddZeZdZ y) ra Symbolic expression for the probability. Examples ======== >>> from sympy.stats import Probability, Normal >>> from sympy import Integral >>> X = Normal("X", 0, 1) >>> prob = Probability(X > 1) >>> prob Probability(X > 1) Integral representation: >>> prob.rewrite(Integral) Integral(sqrt(2)*exp(-_z**2/2)/(2*sqrt(pi)), (_z, 1, oo)) Evaluation of the integral: >>> prob.evaluate_integral() sqrt(2)*(-sqrt(2)*sqrt(pi)*erf(sqrt(2)/2) + sqrt(2)*sqrt(pi))/(4*sqrt(pi)) TNc t|}|tj||}n"t|}tj|||}||_|Sr%)rr__new__ _condition)clsprob conditionkwargsobjs r(r7zProbability.__new__@sI~  ,,sD)C +I,,sD)4C" r2c |jd}|j|jdd}|jdd}t|trBt j |j|jd|jd i|z S|jtrt|j||Sttrt|}t|dk(r7|dk(r/ddlm}||j|jd i|ddSt%fd |Dr t'|St'|jS$tt(t*fst-d zdk(s|t j.urt j0St|t(t*fst-d |z|t j2urt j S|rt5|| S#t't7|jSt|t9k(r t'|St|j|}t;|d r|r|jS|S)Nr numsamplesFevaluateTr@r#)BernoulliDistributionc36K|]}t|ywr%)r)r&rvgiven_conditions r(r)z#Probability.doit..]sCb9R1Csz4%s is not a relational or combination of relationals)r?doitr4)argsr8get isinstancer r OnefuncrFhasrr probabilityrrr+sympy.stats.frv_typesrBr.rrr ValueErrorfalseZerotruerrrhasattr) selfhintsr;r?r@condrvrBresultrEs @r(rFzProbability.doitJsXIIaL //YY|U3 99Z. i %55<499Y^^A%6-5%77;tE>CEE E ==, -)$00O6>1@ @ o| 4#I.F6{aF1I$@G,-FTYYy-A-F-F-O-OQRTUVVCFCC"9o>>"9-2244  &W0EFS&() ) e #yAGG';66M)j'%:;S "# #  55L iZP P  &uY@AFFH H )  (y/: : "..y9 66 "x;;= Mr2c H|j||jdS)Nr;FrArKrFrTargr;r<s r(_eval_rewrite_as_Integralz%Probability._eval_rewrite_as_Integrals#yy y2777GGr2cH|jtjSr%rewriter rFrTs r(evaluate_integralzProbability.evaluate_integral||H%**,,r2r%) __name__ __module__ __qualname____doc__is_commutativer7rFr]_eval_rewrite_as_Sumrbr4r2r(rr%s,0N3jH5-r2rcHeZdZdZd dZdZdZdZd dZd dZ e Z d Z e Z y) ra( Symbolic expression for the expectation. Examples ======== >>> from sympy.stats import Expectation, Normal, Probability, Poisson >>> from sympy import symbols, Integral, Sum >>> mu = symbols("mu") >>> sigma = symbols("sigma", positive=True) >>> X = Normal("X", mu, sigma) >>> Expectation(X) Expectation(X) >>> Expectation(X).evaluate_integral().simplify() mu To get the integral expression of the expectation: >>> Expectation(X).rewrite(Integral) Integral(sqrt(2)*X*exp(-(X - mu)**2/(2*sigma**2))/(2*sqrt(pi)*sigma), (X, -oo, oo)) The same integral expression, in more abstract terms: >>> Expectation(X).rewrite(Probability) Integral(x*Probability(Eq(X, x)), (x, -oo, oo)) To get the Summation expression of the expectation for discrete random variables: >>> lamda = symbols('lamda', positive=True) >>> Z = Poisson('Z', lamda) >>> Expectation(Z).rewrite(Sum) Sum(Z*lamda**Z*exp(-lamda)/factorial(Z), (Z, 0, oo)) This class is aware of some properties of the expectation: >>> from sympy.abc import a >>> Expectation(a*X) Expectation(a*X) >>> Y = Normal("Y", 1, 2) >>> Expectation(X + Y) Expectation(X + Y) To expand the ``Expectation`` into its expression, use ``expand()``: >>> Expectation(X + Y).expand() Expectation(X) + Expectation(Y) >>> Expectation(a*X + Y).expand() a*Expectation(X) + Expectation(Y) >>> Expectation(a*X + Y) Expectation(a*X + Y) >>> Expectation((X + Y)*(X - Y)).expand() Expectation(X**2) - Expectation(Y**2) To evaluate the ``Expectation``, use ``doit()``: >>> Expectation(X + Y).doit() mu + 1 >>> Expectation(X + Expectation(Y + Expectation(2*X))).doit() 3*mu + 1 To prevent evaluating nested ``Expectation``, use ``doit(deep=False)`` >>> Expectation(X + Expectation(Y)).doit(deep=False) mu + Expectation(Expectation(Y)) >>> Expectation(X + Expectation(Y + Expectation(2*X))).doit(deep=False) mu + Expectation(Expectation(Expectation(2*X) + Y)) Nc t|}|jrddlm}|||S|$t |s|St j ||}n"t|}t j |||}||_|S)Nr)ExpectationMatrix)r is_Matrix-sympy.stats.symbolic_multivariate_probabilityrlrrr7r8)r9exprr;r<rlr=s r(r7zExpectation.__new__sl~ >> W$T95 5  T? ,,sD)C +I,,sD)4C" r2c4|jdjSNrrGrhras r(_eval_is_commutativez Expectation._eval_is_commutativesyy|**+r2c `|jd}|jt|s|St|tr(t j fd|jDSt |}t|tr(t j fd|jDSt|tryg}g}|jD]0}t|r|j| |j|2tj |ttj |zS|S)Nrc3TK|]}t|j!ywrYNrrr&ar;s r(r)z%Expectation.expand..s) (!,A C J J L (%(c3TK|]}t|j!ywrvrwrxs r(r)z%Expectation.expand..s) /!,A C J J L /rzrY) rGr8rrIrfromiter_expandrappendr)rTrUro expand_exprrDnonrvryr;s @r(rzExpectation.expandsyy|OO K dC << (!YY (( (dm k3 '<< /(-- // /c "BEYY $Q<IIaLLLO  $ <<&{3<<3Cy'YY Y r2c |jdd}|j}|jd}|jdd}|jdd}|r|jd i|}t |rt |t r|S|r!|jdd}t||||S|jtrt|j||S|+|jt||jd i|S|jrbt|jDcgc]F}t |t s"|j||jd i|n|j||Hc}S|j r|j#t r|St|t%k(r|j|St|j|| } t'| d r|r| jd i|S| Scc}w) NdeepTrr?Fr@evalf)r?rrArFr4)rHr8rGrFrrIrrrLrrcompute_expectationrKris_Addris_Mulr0rrS) rTrUrr;ror?r@rr\rWs r(rFzExpectation.doitsyy&OO yy|YY|U3 99Z. 499%u%D*T;"?K IIgt,EdI*ER R 88' ($<33D)D D  9499U43499BEB B ;;$(II/ &c;783 277@%@=AYYsI=VW/0 0 ;;zz+& $<68 #99T? "11$1J 66 "x6;;'' 'M/s"A G9c |jt}t|dkDr tt|dk(r|S|j }|j t d|j}|jdjr$t|jj}nt|jdz}|j jrt|j||tt!|||z||j j"j$j&|j j"j$j(fS|j j*rtt-|j||tt!|||z||j j"j$j&|j j$j(fS)Nr#rzProbability space not known_1)r0rr+NotImplementedErrorpoprrOsymbolnameisupperr lower is_Continuousr replacerrdomainsetinfsup is_Finiter)rTr\r;r<rvsrDrs r(_eval_rewrite_as_Probabilityz(Expectation._eval_rewrite_as_Probability'sii % s8a<%' ' s8q=J WWY 99 :; ; ;;q> ! ! #FKK--/0FFKK$./F 99 " "CKKF3K2vPY4ZZ]cegeneneueueyeye}e}@B@I@I@P@P@T@T@X@X]YZ Zyy""))3;;r62;r"f~y3YY\bdfdmdmdtdtdxdxd|d|AHHLLPP\QRRr2c J|j||jd|S)NrYF)rr@rZ)rTr\r;r@r<s r(r]z%Expectation._eval_rewrite_as_Integral@s%yy y277UX7VVr2cH|jtjSr%r_ras r(rbzExpectation.evaluate_integralErcr2r%)NF) rdrerfrgr7rsrrFrr]rirb evaluate_sumr4r2r(rrs>CJ ,8(VR2W5-%Lr2rcFeZdZdZd dZdZdZd dZd dZd dZ e Z d Z y) r a Symbolic expression for the variance. Examples ======== >>> from sympy import symbols, Integral >>> from sympy.stats import Normal, Expectation, Variance, Probability >>> mu = symbols("mu", positive=True) >>> sigma = symbols("sigma", positive=True) >>> X = Normal("X", mu, sigma) >>> Variance(X) Variance(X) >>> Variance(X).evaluate_integral() sigma**2 Integral representation of the underlying calculations: >>> Variance(X).rewrite(Integral) Integral(sqrt(2)*(X - Integral(sqrt(2)*X*exp(-(X - mu)**2/(2*sigma**2))/(2*sqrt(pi)*sigma), (X, -oo, oo)))**2*exp(-(X - mu)**2/(2*sigma**2))/(2*sqrt(pi)*sigma), (X, -oo, oo)) Integral representation, without expanding the PDF: >>> Variance(X).rewrite(Probability) -Integral(x*Probability(Eq(X, x)), (x, -oo, oo))**2 + Integral(x**2*Probability(Eq(X, x)), (x, -oo, oo)) Rewrite the variance in terms of the expectation >>> Variance(X).rewrite(Expectation) -Expectation(X)**2 + Expectation(X**2) Some transformations based on the properties of the variance may happen: >>> from sympy.abc import a >>> Y = Normal("Y", 0, 1) >>> Variance(a*X) Variance(a*X) To expand the variance in its expression, use ``expand()``: >>> Variance(a*X).expand() a**2*Variance(X) >>> Variance(X + Y) Variance(X + Y) >>> Variance(X + Y).expand() 2*Covariance(X, Y) + Variance(X) + Variance(Y) Nc t|}|jrddlm}|||S|t j ||}n"t|}t j |||}||_|S)Nr)VarianceMatrix)rrmrnrrr7r8)r9r\r;r<rr=s r(r7zVariance.__new__{s`sm == T!#y1 1  ,,sC(C +I,,sC3C" r2c4|jdjSrqrrras r(rszVariance._eval_is_commutativeyy|***r2c  |jd}|j t|stjSt |t r|St |trqg}|jD]}t|s|j|!t fd|D} fd}tt|tj|d}||zSt |trg}g}|jD]3}t|r|j| |j|dz5t|dk(rtjStj|ttj| zS|S)Nrc3RK|]}t|j ywr%)r r)r&xvr;s r(r)z"Variance.expand..s!L2hr95<<>Ls$'c<dt|dijzS)Nr;)r!r)r/r;s r(z!Variance.expand..sQz1'J 'J'Q'Q'S%Sr2r)rGr8rr rQrIrrr~map itertools combinationsrr+r|r ) rTrUr\rDry variances map_to_covar covariancesrr;s @r(rzVariance.expands6iilOO ~66M c< (K S !BXX !Q<IIaL !LLMISLs<1G1GA1NOPK{* * S !EBXX 'Q<IIaLLLA&  ' 2w!|vv <<&x R0@)'LL L r2c Ht|dz|}t||dz}||z S)Nrr)rTr\r;r<e1e2s r(_eval_rewrite_as_Expectationz%Variance._eval_rewrite_as_Expectations,S!VY/BS),a/B7Nr2c R|jtjtSr%r`rrr[s r(rz%Variance._eval_rewrite_as_Probability||K(00==r2c Lt|jd|jdS)NrFrA)rrGr8r[s r(r]z"Variance._eval_rewrite_as_Integrals ! dooFFr2cH|jtjSr%r_ras r(rbzVariance.evaluate_integralrcr2r%) rdrerfrgr7rsrrrr]rirbr4r2r(r r Js5/` +B >G5-r2r cfeZdZdZd dZdZdZedZedZ d dZ d d Z d d Z e Z d Zy) r!a Symbolic expression for the covariance. Examples ======== >>> from sympy.stats import Covariance >>> from sympy.stats import Normal >>> X = Normal("X", 3, 2) >>> Y = Normal("Y", 0, 1) >>> Z = Normal("Z", 0, 1) >>> W = Normal("W", 0, 1) >>> cexpr = Covariance(X, Y) >>> cexpr Covariance(X, Y) Evaluate the covariance, `X` and `Y` are independent, therefore zero is the result: >>> cexpr.evaluate_integral() 0 Rewrite the covariance expression in terms of expectations: >>> from sympy.stats import Expectation >>> cexpr.rewrite(Expectation) Expectation(X*Y) - Expectation(X)*Expectation(Y) In order to expand the argument, use ``expand()``: >>> from sympy.abc import a, b, c, d >>> Covariance(a*X + b*Y, c*Z + d*W) Covariance(a*X + b*Y, c*Z + d*W) >>> Covariance(a*X + b*Y, c*Z + d*W).expand() a*c*Covariance(X, Z) + a*d*Covariance(W, X) + b*c*Covariance(Y, Z) + b*d*Covariance(W, Y) This class is aware of some properties of the covariance: >>> Covariance(X, X).expand() Variance(X) >>> Covariance(a*X, b*Y).expand() a*b*Covariance(X, Y) Nc vt|}t|}|js |jrddlm}||||S|j dt j rt||gt\}}|tj|||}n#t|}tj||||}||_ |S)Nr)CrossCovarianceMatrixr@key) rrmrnrrr r@sortedrrr7r8)r9arg1arg2r;r<rr=s r(r7zCovariance.__new__s~~ >>T^^ [(tY? ? ::j"3"<"< =t 2BCJD$  ,,sD$/C +I,,sD$ :C" r2c4|jdjSrqrrras r(rszCovariance._eval_is_commutativerr2c |jd}|jd}|j}||k(rt||jSt |st j St |st j St||gt\}}t|trt|tr t|||S|j|j}|j|j}|D cgc]1\}}|D]'\} } || ztt|| gtd|iz)3} } }}} tj| Scc} } }}w)Nrr#rr;)rGr8r rrr rQrrrIrr!_expand_single_argumentrr|) rTrUrrr;coeff_rv_list1coeff_rv_list2ryr1br2addendss r(rzCovariance.expands>yy|yy|OO 4<D),335 566M66MT4L.>? d dL )j|.LdD)4 455dkkmD55dkkmD#1PP2P5W5-r2r!cBeZdZdZdfd ZdZddZddZddZxZ S)Momenta Symbolic class for Moment Examples ======== >>> from sympy import Symbol, Integral >>> from sympy.stats import Normal, Expectation, Probability, Moment >>> mu = Symbol('mu', real=True) >>> sigma = Symbol('sigma', positive=True) >>> X = Normal('X', mu, sigma) >>> M = Moment(X, 3, 1) To evaluate the result of Moment use `doit`: >>> M.doit() mu**3 - 3*mu**2 + 3*mu*sigma**2 + 3*mu - 3*sigma**2 - 1 Rewrite the Moment expression in terms of Expectation: >>> M.rewrite(Expectation) Expectation((X - 1)**3) Rewrite the Moment expression in terms of Probability: >>> M.rewrite(Probability) Integral((x - 1)**3*Probability(Eq(X, x)), (x, -oo, oo)) Rewrite the Moment expression in terms of Integral: >>> M.rewrite(Integral) Integral(sqrt(2)*(X - 1)**3*exp(-(X - mu)**2/(2*sigma**2))/(2*sqrt(pi)*sigma), (X, -oo, oo)) c t|}t|}t|}|t|}t| |||||St| ||||Sr%rsuperr7)r9Xncr;r< __class__s r(r7zMoment.__new__lsZ QK QK QK   +I7?31a; ;7?31a0 0r2c L|jtjdi|SNr4r`rrFrTrUs r(rFz Moment.doitv!-t||K(--666r2c &t||z |z|Sr%rrTrrrr;r<s r(rz#Moment._eval_rewrite_as_ExpectationysAEA:y11r2c R|jtjtSr%rrs r(rz#Moment._eval_rewrite_as_Probability|rr2c R|jtjtSr%r`rr rs r(r]z Moment._eval_rewrite_as_Integral||K(00::r2)rN rdrerfrgr7rFrrr] __classcell__rs@r(rrIs"!D172>;r2rcBeZdZdZdfd ZdZddZddZddZxZ S) CentralMomenta' Symbolic class Central Moment Examples ======== >>> from sympy import Symbol, Integral >>> from sympy.stats import Normal, Expectation, Probability, CentralMoment >>> mu = Symbol('mu', real=True) >>> sigma = Symbol('sigma', positive=True) >>> X = Normal('X', mu, sigma) >>> CM = CentralMoment(X, 4) To evaluate the result of CentralMoment use `doit`: >>> CM.doit().simplify() 3*sigma**4 Rewrite the CentralMoment expression in terms of Expectation: >>> CM.rewrite(Expectation) Expectation((-Expectation(X) + X)**4) Rewrite the CentralMoment expression in terms of Probability: >>> CM.rewrite(Probability) Integral((x - Integral(x*Probability(True), (x, -oo, oo)))**4*Probability(Eq(X, x)), (x, -oo, oo)) Rewrite the CentralMoment expression in terms of Integral: >>> CM.rewrite(Integral) Integral(sqrt(2)*(X - Integral(sqrt(2)*X*exp(-(X - mu)**2/(2*sigma**2))/(2*sqrt(pi)*sigma), (X, -oo, oo)))**4*exp(-(X - mu)**2/(2*sigma**2))/(2*sqrt(pi)*sigma), (X, -oo, oo)) c t|}t|}|t|}t| ||||St| |||Sr%r)r9rrr;r<rs r(r7zCentralMoment.__new__sM QK QK   +I7?31i8 87?31- -r2c L|jtjdi|Srrrs r(rFzCentralMoment.doitrr2c `t||fi|}t||||fi|jtSr%)rrr`)rTrrr;r<mus r(rz*CentralMoment._eval_rewrite_as_Expectations4 I 0 0aB 4V4<<[IIr2c R|jtjtSr%rrTrrr;r<s r(rz*CentralMoment._eval_rewrite_as_Probabilityrr2c R|jtjtSr%rrs r(r]z'CentralMoment._eval_rewrite_as_Integralrr2r%rrs@r(rrs#!D.7J>;r2r)5rsympy.concrete.summationsrsympy.core.addrsympy.core.exprrsympy.core.functionrr}sympy.core.mulrsympy.core.relationalrsympy.core.singletonr sympy.core.symbolr sympy.integrals.integralsr sympy.logic.boolalgr sympy.core.parametersr sympy.core.sortingrsympy.core.sympifyrrr sympy.statsrrsympy.stats.rvrrrrrrrrrr__all__registerr1rrr r!rrr4r2r(rs) 1$"$.#3/',',@@@ CD,, L!"`-$`-F@%$@%Dq-tq-hH-H-V7;T7;t7;D7;r2