计算Scipy LOGNORM.CDF()并获得与MS Excel LOGNORM.DIST相同的答案

时间:2015-12-10 17:28:23

标签: python excel-formula scipy distribution

我正在使用Microsoft Excel 2013中的LOGNORM.DIST在纸上复制图表,并希望在Python中获得相同的图表。我在excel中得到了正确的答案,但在python中没有。

在excel中,我有,

mean of ln(KE)      4.630495093
std dev of ln(KE)       0.560774853

然后我将x(KE)从10绘制到1000并使用Excel LOGNORM.DIST计算事件的概率。我从论文中得到了确切的答案,所以我对计算充满信心。情节如下:

MS Excel 2013 Plot of LOGNORM.DIST

在python中我使用Python 3.4和Scipy 0.16.0,我的代码如下:

%matplotlib inline
from scipy.stats import lognorm
import numpy as np
import matplotlib.pyplot as plt

shape = 0.560774853 #standard deviation
scale = 4.630495093 #mean
loc = 0

dist=lognorm(shape, loc, scale)
x=np.linspace(10,1000,200)

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.set_xscale('log')
ax.set_xlim([10., 1000.])
ax.set_ylim([0., 1.])
ax.plot(x,dist.cdf(x)), dist.cdf(103)

,情节是,

Python Plot of LOGNORM

我使用loc参数搞砸了很多,但没有任何效果。 python代码中的最后一行

dist.cdf(103)

应该给我50%的概率,但显然我做错了。

1 个答案:

答案 0 :(得分:0)

scipy scale分布的lognorm参数为exp(mean),其中mean是基础正态分布的平均值。所以你应该写:

scale = np.exp(mean)

这是一个生成类似Excel图的图表的脚本:

import numpy as np
from scipy.stats import lognorm
import matplotlib.pyplot as plt

shape = 0.560774853
scale = np.exp(4.630495093)
loc = 0

dist = lognorm(shape, loc, scale)

x = np.linspace(10, 1000, 500)
plt.semilogx(x, dist.cdf(x))
plt.grid(True)
plt.grid(True, which='minor')
plt.show()

plot of lognorm cdf