Welcome, guest | Sign In | My Account | Store | Cart

Notice! PyPM is being replaced with the ActiveState Platform, which enhances PyPM’s build and deploy capabilities. Create your free Platform account to download ActivePython or customize Python with the packages you require and get automatic updates.


mcerp is unavailable in PyPM, because there aren't any builds for it in the package repositories. Click the linked icons to find out why.

 Python 2.7Python 3.2Python 3.3
Windows (32-bit)
Windows (64-bit)
Mac OS X (10.5+)
Linux (32-bit)
Linux (64-bit)
0.9.4 Failed View build log
0.9.4 Failed View build log
BSD License
Lastest release
version 0.9.4 on Sep 20th, 2013


mcerp is an on-the-fly calculator for Monte Carlo methods that uses latin-hypercube sampling (see soerp for the Python implementation of the analytical second-order error propagation original Fortran code 'SOERP' by N. D. Cox) to perform non-order specific error propagation (or uncertainty analysis). The mcerp package allows you to easily and transparently track the effects of uncertainty through mathematical calculations. Advanced mathematical functions, similar to those in the standard math module can also be evaluated directly.

Due to the nature of random sampling techniques, calculation results will vary from session to session (but be consistent within the session) since new latin-hypercube samples are only generated when variables are newly defined or re-defined. By default, each variable uses 10,000 latin-hypercube samples that are sufficiently random. The number of samples can be changed by assigning an integer value to the mcerp.npts object (typically, values between 1,000 and 1,000,000 are sufficiently large to insure small errors in the resulting statistics). This should only be changed prior to performing calculations since all subsequent calculations assume that each input has the same number of sampled points (this could be changed through resampling, I suppose...).

In order to correctly use mcerp, knowledge of the distributions from the scipy.stats sub-module is required. The result of all calculations generates a mean, variance, and standardized skewness and kurtosis coefficients.

Required Packages

  • NumPy : Numeric Python
  • SciPy : Scientific Python

Suggested Packages

  • Matplotlib : Python plotting library (required for mcerp.plot)

Basic examples

Let's start with the main import:

>>> from mcerp import *  # N, U, Gamma, Beta, etc.

Now, we can construct many kinds of statistical distributions (both continuous and discrete). Here's a basic example that involves a three-part assembly:

>>> x1 = N(24, 1) # normally distributed
>>> x2 = N(37, 4) # normally distributed
>>> x3 = Exp(2)  # exponentially distributed
>>> x1.stats  # the first four moments can be accessed at any time
[24.0, 1.0, 0.0, 3.0]

Now we'll compute the actual stack-up using normal mathematics and see what happens:

>>> Z = (x1*x2**2)/(15*(1.5 + x3))

We can see how the statistics of each of these distributions propagated through the calculations in two basic ways:

  1. Telling python to print the object:

    >>> Z  # Explicit "print" command not necessary at the command-line
    uv(1160.88699676, 115937.252336, 0.380725871818, 3.10604764643)
  2. Using the describe class method (provides a more detailed explanation):

    >>> Z.describe()
    MCERP Uncertain Value:
     > Mean...................  1160.88699676
     > Variance...............  115937.252336
     > Skewness Coefficient...  0.380725871818
     > Kurtosis Coefficient...  3.10604764643
Viewing the distribution

We can also plot the distributions using the plot class method:

>>> x1.plot()  # No inputs shows the distribution's PDF
>>> x1.show()  # explicit 'show()' required to display to screen

and for the outputs:

>>> Z.plot()  # shows the Kernel Density Estimate (KDE) of the data
>>> Z.show()
>>> Z.plot(hist=True)  # shows a histogram instead of a KDE
>>> Z.show()

or both:

>>> Z.plot()
>>> Z.plot(hist=True)
>>> Z.show()

Even correlations are correctly handled:

>>> x1 - x1

>>> Z*Z - Z**2

Advanced Example

Here's a slightly more advanced engineering example, showing how the random effects of input parameters propagates through the calculation of the volumetric gas flow through an orifice meter:

>>> import mcerp.umath as umath  # sin, exp, sqrt, etc.
>>> H = N(64, 0.5)
>>> M = N(16, 0.1)
>>> P = N(361, 2)
>>> t = N(165, 0.5)
>>> C = 38.4
>>> Q = C*umath.sqrt((520*H*P)/(M*(t + 460)))
>>> Q.describe()
MCERP Uncertain Value:
 > Mean...................  1330.9997362
 > Variance...............  57.5497899824
 > Skewness Coefficient...  0.0229295468388
 > Kurtosis Coefficient...  2.99662898689

Interestingly enough, even though the calculations involve multiplication, division, and a square-root, the result appears to be very close to a Normal (Gaussian) distribution (Q ~ N(1331, 7.6) where 7.6 = sqrt(58.2)).

Using Distributions

Since all of the variables in mcerp are statistical distributions, they are created using the scipy.stats distributions. There are also some convenience constructors that should make defining a distribution easier, though it's not necessary to use them. See the source code of the UncertainVariable class for info that describes how to construct many of the most common statistical continuous and discrete distributions using the scipy.stats distributions.

Here are the equivalent constructors that I've found to be easier to use (the location, scale, and shape parameters are described in the respective Wikipedia pages):

Continuous Distributions
N(mu, sigma) Normal distribution
U(a, b) Uniform distribution
Exp(lamda, [mu]) Exponential distribution
Gamma(k, theta) Gamma distribution
Beta(alpha, beta, [a, b]) Beta distribution
LogN(mu, sigma) Log-normal distribution
X2(k) Chi-squared distribution
F(d1, d2) F-distribution
Tri(a, b, c) Triangular distribution
T(v) T-distribution
Weib(lamda, k) Weibull distribution
Discrete Distributions
Bern(p) Bernoulli distribution
B(n, p) Binomial distribution
G(p) Geometric distribution
H(M, n, N) Hypergeometric distribution
Pois(lamda) Poisson distribution

For example, the following constructions are equivalent:

# explicitly calling out the scipy.stats distribution
>>> import scipy.stats as ss
>>> x = uv(ss.norm(loc=10, scale=1))

# using a built-in constructor
>>> x = N(10, 1)

From my experience, the first option can be tedious and difficult to work with, but you make the choice. That's why there are options!

Main Features

  1. Transparent calculations. No or little modification to existing code required.
  2. Basic NumPy support without modification. (I haven't done extensive testing, so please let me know if you encounter bugs.)
  3. Advanced mathematical functions supported through the mcerp.umath sub-module. If you think a function is in there, it probably is. If it isn't, please request it!
  4. Easy statistical distribution constructors. The location, scale, and shape parameters follow the notation in the respective Wikipedia articles.


Make sure you have the SciPy and NumPy packages installed! This package won't work without them.

You have several easy, convenient options to install the mcerp package (administrative privileges may be required)

  1. Simply copy the unzipped mcerp-XYZ directory to any other location that python can find it and rename it mcerp.

  2. From the command-line, do one of the following:

    1. Manually download the package files below, unzip to any directory, and run:

      $ [sudo] python setup.py install
    2. If setuptools is installed, run:

      $ [sudo] easy_install --upgrade mcerp
    3. If pip is installed, run:

      $ [sudo] pip install --upgrade mcerp
Python 3

To use this package with Python 3.x, you will need to run the 2to3 conversion tool at the command-line using the following syntax while in the unzipped mcerp directory:

$ 2to3 -w .

This should take care of the main changes required. Then, run:

$ python3 setup.py install

If bugs continue to pop up, please email the author.

See also


Please send feature requests, bug reports, or feedback to Abraham Lee.

Subscribe to package updates

Last updated Sep 20th, 2013

What does the lock icon mean?

Builds marked with a lock icon are only available via PyPM to users with a current ActivePython Business Edition subscription.

Need custom builds or support?

ActivePython Enterprise Edition guarantees priority access to technical support, indemnification, expert consulting and quality-assured language builds.

Plan on re-distributing ActivePython?

Get re-distribution rights and eliminate legal risks with ActivePython OEM Edition.