python 中的 ChiDist excel 函数
ChiDist excel function in python
我有一个 excel 函数,我正试图将其复制到 python 但很难复制它。这是函数 (VBA):
Function Z(Lambda, conf) As Integer
Application.Volatile
Lambda = Application.Round(Lambda, 3)
Select Case Lambda
Case Is < 400
For i = 0 To 500
' v = Application.Poisson(i, Lambda, True)
v = Application.ChiDist(2 * Lambda, 2 * i + 2)
If v >= conf Then
Z = i
Exit Function
End If
Next
Case Else
Z = Application.NormInv(conf, Lambda, Sqr(Lambda))
End Select
End Function
在Excel中如果我运行=z(2,95%)
,我得到z=5
我以为我可以使用:
from scipy import stats
stats.chi2.cdf
但还差得远。
非常感谢任何帮助!
按照scipy.stats.chi2
的ChiDist
docs, (see also CHIDIST), ChiDist
returns the right tail of the Χ² distribution. The corresponding function in SciPy is the sf
(survival function)方法。在您的 Python 代码中,将 stats.chi2.cdf
更改为 stats.chi2.sf
。
设法让函数在 python 中运行 - 感谢@Warren Weckesser 在 chi2.sf 上的指导。
from scipy.stats import norm, chi2
def z(lamda_calc, prob):
if lamda_calc < 400:
z_calc = [i for i in range (0,500) if chi2.sf(2 * lamda_calc, 2 * i + 2) >=
prob][0]
else:
z_calc = int(norm.ppf(prob,lamda_calc,sqrt(lamda_calc)))
return z_calc
print
print ("z:'", z(1.4, 0.98))
我有一个 excel 函数,我正试图将其复制到 python 但很难复制它。这是函数 (VBA):
Function Z(Lambda, conf) As Integer
Application.Volatile
Lambda = Application.Round(Lambda, 3)
Select Case Lambda
Case Is < 400
For i = 0 To 500
' v = Application.Poisson(i, Lambda, True)
v = Application.ChiDist(2 * Lambda, 2 * i + 2)
If v >= conf Then
Z = i
Exit Function
End If
Next
Case Else
Z = Application.NormInv(conf, Lambda, Sqr(Lambda))
End Select
End Function
在Excel中如果我运行=z(2,95%)
,我得到z=5
我以为我可以使用:
from scipy import stats
stats.chi2.cdf
但还差得远。
非常感谢任何帮助!
按照scipy.stats.chi2
的ChiDist
docs, (see also CHIDIST), ChiDist
returns the right tail of the Χ² distribution. The corresponding function in SciPy is the sf
(survival function)方法。在您的 Python 代码中,将 stats.chi2.cdf
更改为 stats.chi2.sf
。
设法让函数在 python 中运行 - 感谢@Warren Weckesser 在 chi2.sf 上的指导。
from scipy.stats import norm, chi2
def z(lamda_calc, prob):
if lamda_calc < 400:
z_calc = [i for i in range (0,500) if chi2.sf(2 * lamda_calc, 2 * i + 2) >=
prob][0]
else:
z_calc = int(norm.ppf(prob,lamda_calc,sqrt(lamda_calc)))
return z_calc
print
print ("z:'", z(1.4, 0.98))