Latin Hyopercube Sampling ========================= .. code:: ipython3 %matplotlib inline import pysd import numpy as np import pandas as pd import pyDOE import scipy.stats.distributions as dist import multiprocessing .. code:: ipython3 model = pysd.read_vensim('../../models/Capability_Trap/Capability Trap.mdl') .. code:: ipython3 # define the sample space ranges = {'Fraction of Effort for Sales':(0,1), 'Startup Subsidy':(0,2), 'Startup Subsidy Length':(0,12)} # generate LHS samples within the unit square lhs = pyDOE.lhs(n=len(ranges), samples=2000) # transform samples into our sample space samples = pd.DataFrame( data=dist.uniform(loc=[x[0] for x in ranges.values()], scale=[x[1] for x in ranges.values()]).ppf(lhs), columns=ranges.keys()) samples.head() .. raw:: html
Fraction of Effort for Sales Startup Subsidy Startup Subsidy Length
0 0.611800 1.367751 2.058684
1 0.851258 0.305343 2.631837
2 0.114397 1.789170 2.471216
3 0.126074 1.541200 2.653847
4 0.546046 0.012404 6.980225
.. code:: ipython3 def runner(params): market = market_model.run(dict(params),return_columns=['Tenure']) motiv = motivation_model.run(dict(params),return_columns=['Tenure']) return pd.Series({'market':market['Tenure'].iloc[-1], 'motivation':motiv['Tenure'].iloc[-1]}) .. code:: ipython3 def _apply_df(args): df, func, kwargs = args return df.apply(func, **kwargs) def apply_by_multiprocessing(df, func, workers=multiprocessing.cpu_count(), **kwargs): pool = multiprocessing.Pool(processes=workers) result = pool.map(_apply_df, [(d, func, kwargs) for d in np.array_split(df, workers)]) pool.close() return pd.concat(list(result)) res = apply_by_multiprocessing(samples, runner, axis=1) .. code:: ipython3 # define the sample space ranges = {'Fraction of Effort for Sales':(0,1), 'Startup Subsidy':(0,2), 'Startup Subsidy Length':(0,12)} # generate LHS samples within the unit square lhs = pyDOE.lhs(n=len(ranges), samples=2000) # transform samples into our sample space samples = pd.DataFrame( data=dist.uniform(loc=[x[0] for x in ranges.values()], scale=[x[1] for x in ranges.values()]).ppf(lhs), columns=ranges.keys()) samples.head()