def testBootstrap(self): crpss_dict = self.crpssDict() crpss_dict['bootstrapSwitch'] = True crpss_dict['bootstrap_number'] = 5 crpss = Crpss(**crpss_dict) crpss.prepareInput() crpss.analyze()
def testCrpss(self): crpss_dict = self.crpssDict() crpss = Crpss(**crpss_dict) crpss.prepareInput() crpss.analyze() #test file names res_files = [f for r,_,files in os.walk(self.tmp_dir+'/output') for f in files] test_files = [f for r,_,files in os.walk(self.test_path+'/output') for f in files] self.assertEqual(sorted(res_files),sorted(test_files)) res_files = [f for r,_,files in os.walk(self.tmp_dir+'/plots') for f in files] test_files = [f for r,_,files in os.walk(self.test_path+'/plots') for f in files] self.assertEqual(sorted(res_files),sorted(test_files)) #test values of all .nc files res_files = sorted([os.path.join(r,f) for r,_,files in os.walk(self.tmp_dir+'/output') for f in files]) test_files = sorted([os.path.join(r,f) for r,_,files in os.walk(self.test_path+'/output') for f in files]) for i,f in enumerate(res_files): t1 = FileHandler.openNetCDFFile(res_files[i]) t2 = FileHandler.openNetCDFFile(test_files[i]) np.testing.assert_array_almost_equal(t1['variable'], t2['variable'], 3) #elf.assertTrue((t1['variable']==t2['variable']).all()) self.assertTrue((t1['lon']==t2['lon']).all()) self.assertTrue((t1['lat']==t2['lat']).all())
def testMaxLeadYearHistorical(self): crpss_dict = self.crpssDict() crpss_dict['decadals'] = range(1990,2000,5) crpss_dict['project'] = 'cmip5' crpss_dict['product1'] = 'output1' crpss_dict['leadtimes'] = '1,2' crpss_dict['experiment'] = 'historical' crpss = Crpss(**crpss_dict) crpss.prepareInput() crpss.analyze()
def testEnsemblemembers(self): crpss_dict = self.crpssDict() crpss_dict['ensemblemembers'] = 'r2i1p1,r3i1p1' crpss = Crpss(**crpss_dict) crpss.prepareInput() crpss.analyze() for year in crpss_dict['decadals']: self.assertTrue(len(crpss.inputDict[year]) == 2, 'Too many ensemblemembers found!')
def testTestfiles(self): def crps(var,H,O): x = (H-O)/var crps = -var * (1./np.sqrt(np.pi) - 2. * stats.norm.pdf(x) - x * (2. * stats.norm.cdf(x) - 1.)) return crps def condBias(H,O): H_ensmean = np.mean(H, axis=1) r = np.corrcoef(H_ensmean, O)[0,1] std_H = np.std(H_ensmean) std_O = np.std(O) cond_bias = r * std_O/std_H return cond_bias from create_testfiles import createCrpssInput, getCrpssTimeseries mse_goal = 4 ensspread_goal = 3 ensemble_size = 10 length = 20 #create timeseries (t,hind,obs) = getCrpssTimeseries(mse_goal, ensspread_goal, ensemble_size, length) (hindcasts,observations) = createCrpssInput(1960, hind, obs, ensemble_size, length) crpssDict = self.crpssDict() crpssDict['decadals'] = hindcasts.keys() crpssDict['observation'] = 'HadCrut' crpssDict['leadtimes'] = '1' crpss = Crpss(**crpssDict) crpss.inputRemapped = hindcasts crpss.observationRemapped = observations crpss.analyze() factor = length/(length-2.) factor2 = ensemble_size/(ensemble_size-1.) ensspread = np.mean((factor2*np.var(hind,axis=1)))**0.5 hind_mean = np.mean(hind,axis=1) #calculte crossvalidated mean hind_mean_anom = hind_mean.copy() crossval = np.zeros((length)) for i in range(length): tmp = np.delete(hind_mean,i) crossval[i] = np.mean(tmp) hind_mean_anom[i] = hind_mean[i] - crossval[i] hind_mean = hind_mean_anom.copy() #remove conditional bias bias = condBias(hind, obs) for i in range(length): hind[i,:] = hind[i,:] - crossval[i] hind[i,:] = hind[i,:] + (bias-1)*hind_mean[i] hind_mean_corrected = np.mean(hind,axis=1) RMSE = (factor*np.mean((np.mean(hind,axis=1)-obs)**2))**0.5 #calculate crpss_goal crps1 = np.zeros((length)) crps2 = np.zeros((length)) for i in range(length): crps1[i] = crps(ensspread, hind_mean_corrected[i], obs[i]) crps2[i] = crps(RMSE,hind_mean_corrected[i],obs[i]) crpss_goal = 1 - np.mean(crps1)/np.mean(crps2) #test spreadscore tf = crpss.outputDir+'1-1/baseline1_output_mpi-esm-lr_decs4e_input1/ensemble_spread/1_1_tas_baseline1_output_mpi-esm-lr_decs4e_1960-1979_ensspread_vs_referror.nc' t1 = FileHandler.openNetCDFFile(tf,mode='var') self.assertAlmostEqual(t1[12,12],ensspread/RMSE,2) #test crpss ens vs ref tf = crpss.outputDir+'1-1/baseline1_output_mpi-esm-lr_decs4e_input1/ensemble_spread/1_1_tas_baseline1_output_mpi-esm-lr_decs4e_1960-1979_ens-vs-ref_crpss.nc' t1 = FileHandler.openNetCDFFile(tf,mode='var') self.assertAlmostEqual(t1[12,12],crpss_goal,2)
def main(argv=None): # IGNORE:C0111 '''Command line options.''' if argv is None: argv = sys.argv[1:] args, lastargs = getopt.getopt(argv, _short_args, _args) for flag,arg in args: if flag=='-h' or flag=='--help': return printHelp() murcss_dict = getMurcssDict() for arg in lastargs: if '=' not in arg: raise CommandError("Invalid format for query: %s" % arg) items = arg.split('=') key, value = items[0], ''.join(items[1:]) murcss_dict[key] = value murcss_dict['decadals'] = map(int,murcss_dict['decadals'].split(',')) murcss_dict['bootstrap_number'] = int(murcss_dict['bootstrap_number']) analysis_type = murcss_dict.pop('analysis_type') if analysis_type == 'map': murcss_dict['fieldmean'] = False murcss_dict['zonalmean'] = False elif analysis_type == 'fieldmean': murcss_dict['fieldmean'] = True murcss_dict['zonalmean'] = False elif analysis_type == 'zonalmean': murcss_dict['fieldmean'] = False murcss_dict['zonalmean'] = True output_type = murcss_dict.pop('output_type') if output_type == 'basic': murcss_dict['basic_output'] = True else: murcss_dict['basic_output'] = False #Check for right metics value metrics = murcss_dict.pop('metrics') if metrics not in ['all','accuracy','ensemble_spread']: raise Exception, '%s is not a valid option. Only valid options for metric are: "all", "ensemble_spread", and "accuracy".' % (metrics) if metrics in ['all','accuracy']: print '#######################' print 'Calculating the MSSS' print '#######################' #Calculation of MSESS if(not murcss_dict['significance']): msss_dict = murcss_dict.copy() msss_dict.pop('bootstrap_number') msss_dict.pop('significance') msss = Msss(**msss_dict) msss.prepareInput() msss.analyze() msss.deleteCache() else: from metrics.msssBootstrap import main msss = main(murcss_dict.copy(),'..') if metrics in ['all','ensemble_spread']: print '#######################' print 'Calculating the CRPSS for Model1' print '#######################' crpss1 = Crpss(output=murcss_dict['output'], output_plots=murcss_dict['output_plots'], basic_output=murcss_dict['basic_output'], decadals=murcss_dict['decadals'], variable=murcss_dict['variable'], project = murcss_dict['project1'], product1=murcss_dict['product1'], institute1=murcss_dict['institute1'], model=murcss_dict['model1'], experiment=murcss_dict['experiment1'], ensemblemembers=murcss_dict['ensemblemembers1'], observation = murcss_dict['observation'], leadtimes=murcss_dict['leadtimes'], result_grid=murcss_dict['result_grid'], maskMissingValues=murcss_dict['maskMissingValues'], bootstrapSwitch=murcss_dict['significance'], bootstrap_number=murcss_dict['bootstrap_number'], level=murcss_dict['level'], lonlatbox=murcss_dict['lonlatbox'], fieldmean=murcss_dict['fieldmean'], zonalmean=murcss_dict['zonalmean'], cache=murcss_dict['cache'], baseDir = murcss_dict['baseDir']) if metrics != 'ensemble_spread': crpss1.outputDir = msss.outputDir crpss1.outputPlots = msss.outputPlots crpss1.prepareInput() crpss1.analyze() crpss1.deleteCache() print '#######################' print 'Calculating the CRPSS for Model2' print '#######################' crpss2 = Crpss(output=murcss_dict['output'], output_plots=murcss_dict['output_plots'], basic_output=murcss_dict['basic_output'], decadals=murcss_dict['decadals'], variable=murcss_dict['variable'], project = murcss_dict['project2'], product1=murcss_dict['product2'], institute1=murcss_dict['institute2'], model=murcss_dict['model2'], experiment=murcss_dict['experiment2'], ensemblemembers=murcss_dict['ensemblemembers2'], observation = murcss_dict['observation'], leadtimes=murcss_dict['leadtimes'], result_grid=murcss_dict['result_grid'], maskMissingValues=murcss_dict['maskMissingValues'], bootstrapSwitch=murcss_dict['significance'], bootstrap_number=murcss_dict['bootstrap_number'], level=murcss_dict['level'], lonlatbox=murcss_dict['lonlatbox'], fieldmean=murcss_dict['fieldmean'], zonalmean=murcss_dict['zonalmean'], cache=murcss_dict['cache'], input_part='input2', baseDir = murcss_dict['baseDir']) if metrics != 'ensemble_spread': crpss2.outputDir = msss.outputDir crpss2.outputPlots = msss.outputPlots crpss2.prepareInput() crpss2.analyze() crpss2.deleteCache() import metrics.msss, metrics.metricAbstract, metrics.filehandler, metrics.taylorplot, metrics.crpss, metrics.msssBootstrap del metrics.msss.cdo, metrics.metricAbstract.cdo, metrics.filehandler.cdo, metrics.taylorplot.cdo, metrics.crpss.cdo, metrics.msssBootstrap.cdo print 'Calculation finished.' print 'Plots produced in %s' %(msss.outputPlots,)