Просто избавься от псевдонима.
Псевдонимы заменяют только то, что они псевдонимы (сохраняя все остальные аргументы), тогда как функции будут использовать все аргументы, независимо от того, действительно ли вы что-то с ними делаете.
Адаптировано отсюда http://mail.python.org/pipermail/python-list/2000-June/039873.html
from math import *
def erfcc(x):
"""Complementary error function."""
z = abs(x)
t = 1. / (1. + 0.5*z)
r = t * exp(-z*z-1.26551223+t*(1.00002368+t*(.37409196+
t*(.09678418+t*(-.18628806+t*(.27886807+
t*(-1.13520398+t*(1.48851587+t*(-.82215223+
t*.17087277)))))))))
if (x >= 0.):
return r
else:
return 2. - r
def ncdf(x):
return 1. - 0.5*erfcc(x/(2**0.5))
Вот пример:
>>> from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435
Другими словами, приблизительно 95% стандартного нормального интервала лежит в пределах двух стандартных отклонений, центрированных на стандартном среднем значении нуля.
Если вам нужен обратный CDF:
>>> norm.ppf(norm.cdf(1.96))
array(1.9599999999999991)
Чтобы построить на примере Unknown, Python-эквивалент функции normdist (), реализованной во многих библиотеках, будет выглядеть так:
def normcdf(x, mu, sigma):
t = x-mu;
y = 0.5*erfcc(-t/(sigma*sqrt(2.0)));
if y>1.0:
y = 1.0;
return y
def normpdf(x, mu, sigma):
u = (x-mu)/abs(sigma)
y = (1/(sqrt(2*pi)*abs(sigma)))*exp(-u*u/2)
return y
def normdist(x, mu, sigma, f):
if f:
y = normcdf(x,mu,sigma)
else:
y = normpdf(x,mu,sigma)
return y