Example #1
0
    def __init__(self, cfg, time_period=0, models=NAMES_UA):
        # logging
        log = gen.getLogger(gen.getClassName(self))
        log.info("start creating ua ensemble monthly average")

        # aos
        obj = aos.DataObject(('ua_ens_month_avg', time_period, models))
        if obj.load():
            obj.copy(self)
            return (None)

        # init
        self._time_period = time_period
        self._models = models
        self.cfg = dict(cfg)

        # create list of time_avg_lat_lon 2D-fields
        ensemble_time_avg_lat_lon = []
        if time_period == '1979-2005':
            directory_prefix = pl.Path(
                self.cfg['data_folders']['historical']).joinpath('ua/mon')
        elif time_period == '2070-2099':
            directory_prefix = pl.Path(
                self.cfg['data_folders']['rcp85']).joinpath('ua/mon')
        else:
            raise Exception("ua_ens_avg: time period '%s' not known" %
                            time_period)

        print("Load data from time period %s" % time_period)
        log.info("ua_ens_month_avg: Load data from time period %s" %
                 time_period)
        for name in self._models:
            print("Loading %s from file" % name)
            log.info("Loading %s from file" % name)
            directory = directory_prefix.joinpath(name).joinpath('r1i1p1')
            tall = time_avg_month_lat_lon_dir(directory,
                                              time_period=time_period)
            ensemble_time_avg_lat_lon += [tall]

        # check consistancy of grids in the ensemble of time_avg_lat_lon 2D-fields and store grid
        tall_0 = ensemble_time_avg_lat_lon[0]
        for tall in ensemble_time_avg_lat_lon:
            if not tall_0.grid_equal(tall):
                raise Exception(
                    "ua_ens_month_avg: error, grids are not consistent")
        self.points = tall_0.points
        self.area = tall_0.area

        # put ensemble into a 3D array with shape (n_points, 24, n_models)
        tall_0 = ensemble_time_avg_lat_lon[0]
        n_points = tall_0.data.shape[0]
        self.n_models = len(ensemble_time_avg_lat_lon)
        self.data = np.zeros((n_points, 24, self.n_models))
        for tall, model in zip(ensemble_time_avg_lat_lon,
                               range(self.n_models)):
            self.data[:, :, model] = tall.data

        # aos
        obj.save(self)
Example #2
0
    def __init__(self, time_period=0):
        # aos
        obj = aos.DataObject(('uas_ens_avg', time_period))
        if obj.load():
            obj.copy(self)
            return (None)

        # init
        self._time_period = time_period
        self._models = NAMES_UAS

        # create list of time_avg_lat_lon 2D-fields
        ensemble_time_avg_lat_lon = []
        if (time_period == '1971-2000') or (time_period == '1979-2005'):
            directory_prefix = 'data/ModData2/CMIP5/atmos/historical/uas/mon/'
        elif (time_period == '2071-2100') or (time_period == '2070-2099'):
            directory_prefix = 'data/ModData2/CMIP5/atmos/rcp85/uas/mon/'
        else:
            raise Exception("uas_ens_avg: time period '%s' not known" %
                            time_period)
        print("Load data from time period %s" % time_period)

        for name in self._models:
            print("Loading %s from file" % name)
            directory = directory_prefix + name + '/r1i1p1/'
            uas_list = [
                uas(['file', os.path.join(directory, f)])
                for f in os.listdir(directory) if f.endswith(".nc")
            ]
            tall = time_avg_lat_lon(['uas list', uas_list],
                                    time_period=time_period)
            ensemble_time_avg_lat_lon += [tall]

        # check consistancy of grids in the ensemble of time_avg_lat_lon 2D-fields and store grid
        tall_0 = ensemble_time_avg_lat_lon[0]
        for tall in ensemble_time_avg_lat_lon:
            if not tall_0.grid_equal(tall):
                raise Exception("uas_ens_avg: error, grids are not consistent")
        self.points = tall_0.points
        self.area = tall_0.area

        # put ensemble into a 2D array: [data,talls]
        data = []
        for tall in ensemble_time_avg_lat_lon:
            data += [tall.data]
        self.data = np.hstack(data)

        # area

        # aos
        obj.save(self)
Example #3
0
    def __init__(self, data):
        # aos
        obj = aos.DataObject(('ua', data))
        if obj.load():
            obj.copy(self)
            return (None)

        # logging
        log = gen.getLogger(gen.getClassName(self))
        log.info("creating class")

        if not data:
            raise Exception("ua: Initialization error, provide data")
        if data[0] == 'file':
            self._init_ua_from_file(data[1])
        else:
            raise Exception("ua: Initialization error, unknow mode")

        # aos
        obj.save(self)
Example #4
0
    def __init__(self, directory, time_period=0):
        # logging
        log = gen.getLogger(gen.getClassName(self))
        log.info("starting")

        # aos
        obj = aos.DataObject(('time_avg_lat_lon_dir', directory, time_period))
        if obj.load():
            obj.copy(self)
            log.info("loaded")
            return (None)

        ua_list = []
        for f in directory.iterdir():
            if '_reg.nc' in str(f):
                gen.print_truncate("  Loading file %s" % f)
                ua_list = ua_list + [ua(['file', directory.joinpath(f)])]
        super(time_avg_lat_lon_dir, self).__init__(['ua list', ua_list],
                                                   time_period=time_period)

        # aos
        obj.save(self)
        log.info("created")
Example #5
0
    def __init__(self, e, n=360, max_length=360, min_length=30):
        """Class initialization

        Parameters
        ----------
        e : class
            Evaluation class for a single evaluation to run
        n : int, optional
            Range of starting degrees [0, 360].
        max_length : int, optional
            Maximum size of averaging window [1, 360).
        min_length : int, optional
            Minumum size of averaging window [1, 359).

        Returns
        -------
        TYPE
            Description
        """
        # logging
        log = gen.getLogger(gen.getClassName(self))
        log.info("start evaluating all [JJA]")

        # Error files
        self.minima_error_file = 'min_max_error.csv'
        self.nan_error_file = 'nan_error.csv'

        # aos
        obj = aos.DataObject(('EvaluateAll [JJA]', n))
        if obj.load():
            obj.copy(self)
            return (None)

        # prepare evaluate
        self.n = n
        self.min_length = min_length
        self.max_length = max_length

        x = np.arange(self.n)
        y = np.arange(self.min_length, self.max_length + 1)
        xx, yy = np.meshgrid(x, y)
        individuals = np.transpose(
            np.hstack((xx.reshape(-1, 1), yy.reshape(-1, 1))))

        # evaluate
        self.ret = e(individuals)

        # Process / convert results
        self.start = individuals[0, :].reshape(-1, 1)
        self.length = individuals[1, :].reshape(-1, 1)
        self.fitness = self.ret[0, :].reshape(-1, 1)
        self.result = pd.DataFrame(
            {
                'start': self.start.ravel(),
                'length': self.length.ravel(),
                'fitness': self.fitness.ravel()
            },
            index=np.arange(len(self.fitness.ravel())))

        # Longitudes in input goes from -179.5 to 179.5.
        # Here we convert from integer degree (offset) to the proper longitude value.
        self.result['start'] -= 179.5
        self.save_errors(e.f.n_models)

        # aos
        obj.save(self)