def get_more_thermal_params(N=100,F_2x=3.84): from copulas.multivariate import GaussianMultivariate d1_d2_q1_copula = GaussianMultivariate.load(Path(__file__).parent / "./Parameter_Sets/d1_d2_q1_CMIP6_copula.pkl") d1_d2_q1_df = d1_d2_q1_copula.sample(10*N) while (d1_d2_q1_df<0).any(axis=1).sum() != 0: d1_d2_q1_df.loc[(d1_d2_q1_df<0).any(axis=1)] = d1_d2_q1_copula.sample((d1_d2_q1_df<0).any(axis=1).sum()).values d2_samples = d1_d2_q1_df['d2'].values d3_samples = d1_d2_q1_df['d1'].values q3_samples = d1_d2_q1_df['q1'].values d1_samples = sp.stats.truncnorm(-2,2,loc=283,scale=116).rvs(10*N) TCR_samples = np.random.lognormal(np.log(2.5)/2,np.log(2.5)/(2*1.645),10*N) RWF_samples = sp.stats.truncnorm(-2.75,2.75,loc=0.582,scale=0.06).rvs(10*N) ECS_samples = TCR_samples/RWF_samples d = np.array([d1_samples,d2_samples,d3_samples]) k = 1-(d/70)*(1-np.exp(-70/d)) q = ((TCR_samples/F_2x - k[2]*q3_samples)[np.newaxis,:] - np.roll(k[:2],axis=0,shift=1)*(ECS_samples/F_2x - q3_samples)[np.newaxis,:])/(k[:2] - np.roll(k[:2],axis=0,shift=1)) sample_df = pd.DataFrame(index=['d','q'],columns = [1,2,3]).apply(pd.to_numeric) df_list = [] i=0 j=0 while j<N: curr_df = sample_df.copy() curr_df.loc['d'] = d[:,i] curr_df.loc['q',3] = q3_samples[i] curr_df.loc['q',[1,2]] = q[:,i] if curr_df.loc['q',2]<=0: i+=1 continue df_list += [curr_df] j+=1 i+=1 thermal_params = pd.concat(df_list,axis=1,keys=['therm'+str(x) for x in np.arange(N)]) return thermal_params
def test_save_load(self): data = sample_trivariate_xyz() model = GaussianMultivariate() model.fit(data) sampled_data = model.sample(10) path_to_model = os.path.join(self.test_dir.name, "model.pkl") model.save(path_to_model) model2 = GaussianMultivariate.load(path_to_model) pdf = model.probability_density(sampled_data) pdf2 = model2.probability_density(sampled_data) assert np.all(np.isclose(pdf, pdf2, atol=0.01)) cdf = model.cumulative_distribution(sampled_data) cdf2 = model2.cumulative_distribution(sampled_data) assert np.all(np.isclose(cdf, cdf2, atol=0.01))
def _gaussian(self, dataset): """ For the given dataset, this runs "everything but the kitchen sink" (i.e. every feature of GaussianMultivariate that is officially supported) and makes sure it doesn't crash. """ model = GaussianMultivariate({ dataset.columns[0]: GaussianKDE() # Use a KDE for the first column }) model.fit(dataset) for N in [10, 100, 50]: assert len(model.sample(N)) == N sampled_data = model.sample(10) pdf = model.probability_density(sampled_data) cdf = model.cumulative_distribution(sampled_data) # Test Save/Load from Dictionary config = model.to_dict() model2 = GaussianMultivariate.from_dict(config) for N in [10, 100, 50]: assert len(model2.sample(N)) == N pdf2 = model2.probability_density(sampled_data) cdf2 = model2.cumulative_distribution(sampled_data) assert np.all(np.isclose(pdf, pdf2, atol=0.01)) assert np.all(np.isclose(cdf, cdf2, atol=0.01)) path_to_model = os.path.join(self.test_dir.name, "model.pkl") model.save(path_to_model) model2 = GaussianMultivariate.load(path_to_model) for N in [10, 100, 50]: assert len(model2.sample(N)) == N pdf2 = model2.probability_density(sampled_data) cdf2 = model2.cumulative_distribution(sampled_data) assert np.all(np.isclose(pdf, pdf2, atol=0.01)) assert np.all(np.isclose(cdf, cdf2, atol=0.01))