Пример #1
0
    def __init__(self, no_levels, verbose = False):
        """
        Init function.
        """

        DataField.__init__(self)
        self.no_levels = no_levels
        self.low_freq = None
        self.input_pcs = None
        self.input_eofs = None
        self.verbose = verbose
        self.combined = False
        self.delay_model = False
Пример #2
0
    def __init__(self,
                 fname,
                 varname,
                 start_date,
                 end_date,
                 lats,
                 lons,
                 level=None,
                 dataset="NCEP",
                 sampling='monthly',
                 anom=False,
                 pickled=False,
                 verbose=False):
        """
        Initialisation of the class.
        """

        # if sampling == 'monthly':
        #     self.g = load_NCEP_data_monthly(fname, varname, start_date, end_date, None, None, None, anom)
        # elif sampling == 'daily':
        #     self.g = load_NCEP_data_daily(fname, varname, start_date, end_date, None, None, None, anom)

        DataField.__init__(self)
        if not pickled:
            self.load(fname, varname, dataset=dataset, print_prog=False)
        else:
            self.load_field(fname)
            self.data_mask = None
            self.var_name = varname
        self.select_date(start_date, end_date)
        self.select_lat_lon(lats, lons)
        if level is not None:
            self.select_level(level)
        if anom:
            self.anomalise()
        day, month, year = self.extract_day_month_year()
        if verbose:
            print(
                "[%s] NCEP data loaded with shape %s. Date range is %d.%d.%d - %d.%d.%d inclusive."
                % (str(datetime.now()), str(self.data.shape), day[0], month[0],
                   year[0], day[-1], month[-1], year[-1]))

        self.phase = None
        self.amplitude = None
        self.wave = None
        self.adjacency_matrix = None

        self.num_lats = self.lats.shape[0]
        self.num_lons = self.lons.shape[0]
        self.sampling = sampling
Пример #3
0
def load_enso_index(fname, nino_type, start_date, end_date, anom = False):
    """
    Data loader for various ENSO indices.
    """

    from dateutil.relativedelta import relativedelta

    g = DataField()

    enso_raw = np.loadtxt(fname, skiprows = 1)
    y = int(enso_raw[0,0])
    start_date_ts = date(y, 1, 1)
    enso_raw = enso_raw[:, 1:]
    enso_raw = enso_raw.reshape(np.prod(enso_raw.shape))

    g.data = enso_raw.copy()
    time = np.zeros_like(enso_raw, dtype = np.int32)
    delta = relativedelta(months = +1)
    d = start_date_ts
    for i in range(time.shape[0]):
        time[i] = d.toordinal()
        d += delta

    g.time = time.copy()
    g.location = ('NINO%s SSTs' % nino_type)

    print("** loaded")
    g.select_date(start_date, end_date)
    if anom:
        print("** anomalising")
        g.anomalise()
    _, month, year = g.extract_day_month_year()

    print("[%s] Nino%s data loaded with shape %s. Date range is %d/%d - %d/%d inclusive." 
        % (str(datetime.now()), nino_type, str(g.data.shape), month[0], 
           year[0], month[-1], year[-1]))
           
    return g
    
Пример #4
0
    def __init__(self, fname, varname, start_date, end_date, lats, lons, level = None, dataset = "NCEP", sampling = 'monthly', anom = False, pickled = False, verbose = False):
        """
        Initialisation of the class.
        """

        # if sampling == 'monthly':
        #     self.g = load_NCEP_data_monthly(fname, varname, start_date, end_date, None, None, None, anom)
        # elif sampling == 'daily':
        #     self.g = load_NCEP_data_daily(fname, varname, start_date, end_date, None, None, None, anom)

        DataField.__init__(self)
        if not pickled:
            self.load(fname, varname, dataset = dataset, print_prog = False)
        else:
            self.load_field(fname)
            self.data_mask = None
            self.var_name = varname
        self.select_date(start_date, end_date)
        self.select_lat_lon(lats, lons)
        if level is not None:
            self.select_level(level)
        if anom:
            self.anomalise()
        day, month, year = self.extract_day_month_year()
        if verbose:
            print("[%s] NCEP data loaded with shape %s. Date range is %d.%d.%d - %d.%d.%d inclusive." 
                    % (str(datetime.now()), str(self.data.shape), day[0], month[0], 
                       year[0], day[-1], month[-1], year[-1]))


        self.phase = None
        self.amplitude = None
        self.wave = None
        self.adjacency_matrix = None

        self.num_lats = self.lats.shape[0]
        self.num_lons = self.lons.shape[0]
        self.sampling = sampling
Пример #5
0
def load_enso_SSTs(CMIP5model = None, num_ts = None, PROmodel = False):
    # load enso SSTs
    print("[%s] Loading monthly ENSO SSTs..." % str(datetime.now()))
    enso_raw = np.loadtxt("nino34m13.txt") # length x 2 as 1st column is continuous year, second is SST in degC
    enso = DataField()

    enso.data = enso_raw[:, 1]

    time = np.zeros_like(enso.data, dtype = np.int32)
    y = np.int(enso_raw[0, 0])
    start_date = date(y, 1, 1)
    delta = relativedelta(months = +1)
    d = start_date
    for i in range(time.shape[0]):
        time[i] = d.toordinal()
        d += delta

    enso.time = time
    enso.location = 'NINO3.4 SSTs'

    if CMIP5model is not None and num_ts is not None:
        print("Loading %s model, time series %d..." % (CMIP5model, num_ts))
        fname = CMIP5model + '.txt'
        model = np.loadtxt('N34_CMIP5/' + fname)
        enso.data = model[:, num_ts]

        # varnorm, not seasonal
        enso.data /= np.std(enso.data, axis = 0, ddof = 1)

    if PROmodel:
        print("[%s] Integrating PRO model which will be used instead of ENSO SSTs..." % (str(datetime.now())))
        from parametric_recharge_oscillator import ENSO_PROmodel
        PROmodel_enso = ENSO_PROmodel(length = enso.data.shape[0], daily = False, damped = True, ENSOperiod = 3.75, modulation = 2, lambda0 = 0.4)
        PROmodel_enso.integrate_PROmodel()
        enso.data = PROmodel_enso.data.copy()

    if NUM_SURR > 0:
        a = list(enso.get_seasonality(DETREND = False))
        enso_sg = SurrogateField()

        _, _, idx = enso.get_data_of_precise_length(length = 1024, end_date = date(2014, 1, 1), copy = False)
        enso_sg.copy_field(enso)
        enso_sg.data = enso_sg.data[idx[0]:idx[1]]

        enso.return_seasonality(a[0], a[1], None)

        a[0] = a[0][idx[0]:idx[1]]
        a[1] = a[1][idx[0]:idx[1]]

    # select 1024 data points
    enso.get_data_of_precise_length(length = 1024, end_date = date(2014, 1, 1), copy = True)
    print("[%s] Data loaded with shape %s" % (str(datetime.now()), enso.data.shape))

    return enso, enso_sg, a
Пример #6
0
 def __init__(self, data=None):
     DataField.__init__(self)
     self.data = None
     self.model_grid = None
     self.original_data = data
        # amp_to_plot_surr = amp_to_plot_surr[idx[0] : idx[1]]
        phase_amp = phase_amp[idx[0] : idx[1]]
        sg.data =  sg.data[idx[0] : idx[1]]

        cond_temp = np.zeros((BINS,2))
        for i in range(cond_means.shape[0]):
            ndx = ((phase_amp >= phase_bins[i]) & (phase_amp <= phase_bins[i+1]))
            cond_temp[i,1] = np.mean(sg.data[ndx])
        data_diff = cond_temp[:, 1].max() - cond_temp[:, 1].min()

        resq.put([data_diff, np.mean(amplitude2)])


g = load_station_data('../data/ECAstation-TG/TG_STAID000027.txt', date(1958, 1, 1), date(2013, 11, 10), True)
g_amp = load_station_data('../data/ECAstation-TG/TG_STAID000027.txt', date(1958, 1, 1), date(2013, 11, 10), True)
g_data = DataField()

g.wavelet(PERIOD, period_unit='y', cut=None)
phase = g.phase.copy()

if AMPLITUDE:
    g_amp.wavelet(8, period_unit='y', cut=None)
    amplitude = g_amp.amplitude.copy()
    phase_amp = g_amp.phase.copy()

    # fitting oscillatory phase / amplitude to actual SAT
    reconstruction = amplitude * np.cos(phase_amp)
    fit_x = np.vstack([reconstruction, np.ones(reconstruction.shape[0])]).T
    m, c = np.linalg.lstsq(fit_x, g_amp.data)[0]
    amplitude = m * amplitude + c
    print("Oscillatory series fitted to SAT data with coeff. %.3f and intercept %.3f" % (m, c))
Пример #8
0
from datetime import date
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec


PERIOD = 8
BINS = 8
NUM_SURR = 1000

def get_equidistant_bins(num):
    return np.array(np.linspace(-np.pi, np.pi, num+1))


g = load_station_data('../data/ECAstation-TG/TG_STAID000027.txt', date(1924,1,14), date(2013,10,1), anom=True)
g_amp = load_station_data('../data/ECAstation-TG/TG_STAID000027.txt', date(1924,1,14), date(2013, 10, 1), anom=False)
g_data = DataField()

mean, var, trend = g.get_seasonality(True)
mean2, var2, trend2 = g_amp.get_seasonality(True)

sg_amp = SurrogateField()
sg_amp.copy_field(g_amp)
sg = SurrogateField()
sg.copy_field(g)

g.return_seasonality(mean, var, trend)
g_amp.return_seasonality(mean2, var2, trend2)

g.wavelet(PERIOD, period_unit='y', cut=None)
# wave, _, _, _ = wavelet_analysis.continous_wavelet(g.data, 1, False, wavelet_analysis.morlet, dj = 0, s0 = s0, j1 = 0, k0 = k0) # perform wavelet
phase = g.phase.copy()
Пример #9
0
NUM_SURR = 1000


def get_equidistant_bins(num):
    return np.array(np.linspace(-np.pi, np.pi, num + 1))


g = load_station_data('../data/ECAstation-TG/TG_STAID000027.txt',
                      date(1924, 1, 14),
                      date(2013, 10, 1),
                      anom=True)
g_amp = load_station_data('../data/ECAstation-TG/TG_STAID000027.txt',
                          date(1924, 1, 14),
                          date(2013, 10, 1),
                          anom=False)
g_data = DataField()

mean, var, trend = g.get_seasonality(True)
mean2, var2, trend2 = g_amp.get_seasonality(True)

sg_amp = SurrogateField()
sg_amp.copy_field(g_amp)
sg = SurrogateField()
sg.copy_field(g)

g.return_seasonality(mean, var, trend)
g_amp.return_seasonality(mean2, var2, trend2)

g.wavelet(PERIOD, period_unit='y', cut=None)
# wave, _, _, _ = wavelet_analysis.continous_wavelet(g.data, 1, False, wavelet_analysis.morlet, dj = 0, s0 = s0, j1 = 0, k0 = k0) # perform wavelet
phase = g.phase.copy()
Пример #10
0
def load_enso_SSTs(num_ts = None, PROmodel = False, EMRmodel = None, DDEmodel = None):
    # load enso SSTs
    print("[%s] Loading monthly ENSO SSTs..." % str(datetime.now()))
    # enso_raw = np.loadtxt("nino34m13.txt") # length x 2 as 1st column is continuous year, second is SST in degC
    # enso = DataField()

    # enso = load_enso_index("nino34raw.txt", '3.4', date(1900, 1, 1), date(2001, 1, 1))
    enso = DataField()
    enso.data = np.loadtxt("nino34_CESMhigh.dat")
    enso.create_time_array(date_from = date(1900, 1, 1), sampling = 'm')
    # fname = "conceptualRossler1:2monthlysampling_100eps0-0.25.dat"
    # r = read_rossler(fname)
    # x, y = r[0.0707][20000:52768, 0], r[0.0707][20000:52768, 1] # 
    # x, y = r[0.1465][20000:21024, 0], r[0.1465][20000:21024, 1] # x is annual, y is biennal
    # print("rossler data read")

    # add noise
    # x += np.random.normal(0, scale = 0.1*np.std(x, ddof = 1), size = (x.shape[0],))
    # y += np.random.normal(0, scale = 0.1*np.std(y, ddof = 1), size = (y.shape[0],))
    # print("added noise to rossler data...")
    # exa = np.loadtxt("ExA-comb-mode-20CR-1900-2010-PC2-stand.txt")
    # enso.data = exa.copy()
    # enso.data = enso_raw[:, 1]
    # enso.data = np.zeros((1200,))
    # if '4k' in EMRmodel:
    #     enso.data = np.zeros((4096,))
    # elif '8k' in EMRmodel:  
    #     enso.data = np.zeros((8192,))
    # elif '16k' in EMRmodel:
    #     enso.data = np.zeros((16384,))
    # elif '32k' in EMRmodel:
    #     enso.data = np.zeros((32768,))
    # enso.data = x.copy()
    # enso.create_time_array(date(1900, 1, 1), sampling = 'm')
    print enso.data.shape
    print enso.get_date_from_ndx(0), enso.get_date_from_ndx(-1)

    # enso.select_date(date(1884,1,1), date(2014,1,1))

    # if CMIP5model is not None and num_ts is not None:
    #     fname = CMIP5model + '.txt'
    #     model = np.loadtxt('N34_CMIP5/' + fname)
    #     enso.data = model[:, num_ts]
    # with open("SST-EOFanalysis-inputPCs.bin", "rb") as f:
    #     pcs = cPickle.load(f)
    # pcs = pcs['PC']
    # if num_ts != 2:
    #     enso.data = pcs[0, :]
    # elif num_ts == 2:
    #     enso.data = pcs[3, :]

    if PROmodel:
        print("[%s] Integrating PRO model which will be used instead of ENSO SSTs..." % (str(datetime.now())))
        from parametric_recharge_oscillator import ENSO_PROmodel
        PROmodel_enso = ENSO_PROmodel(length = enso.data.shape[0], daily = False, damped = False, ENSOperiod = 3.75, modulation = 2., lambda0 = 0.4)
        PROmodel_enso.integrate_PROmodel()
        enso.data = PROmodel_enso.data.copy()

    if DDEmodel is not None:
        print("[%s] Integrating DDE model which will be used instead of ENSO SSTs..." % (str(datetime.now())))
        from enso_dde_model import enso_dde_model
        kappa, tau, b, subsample = DDEmodel
        t, h = enso_dde_model(kappa = kappa, tau = tau, b = b, nyears = enso.time.shape[0]//12+10, subsample_to_monthly = subsample)
        enso.data = h.copy()

    if EMRmodel is not None:
        print("[%s] Loading EMR (%s) simulated syntethic ENSO time series..." % (str(datetime.now()), EMRmodel))
        # raw = sio.loadmat("Nino34-%s.mat" % (EMRmodel))['N34s']
        raw = sio.loadmat("Nino34-linear-10PCsel-L3-seasonal-surrs.mat")['N34s']
        enso.data = raw[num_ts, -1332:] # same length as nino3.4 data
        # if '4k' in EMRmodel:
        #     enso.data = raw[-4096:, num_ts].copy()
        # elif '8k' in EMRmodel:  
        #     enso.data = raw[-8192:, num_ts].copy()
        # elif '16k' in EMRmodel:
        #     enso.data = raw[-16384:, num_ts].copy()
        # elif '32k' in EMRmodel:
        #     enso.data = raw[-32768:, num_ts].copy()

        # if num_ts%3 == 0:
        #     dat = enso.get_date_from_ndx(12423)
        # elif num_ts%3 == 1:
        #     dat = enso.get_date_from_ndx(2434)
        # elif num_ts%3 == 2:
        #     dat = enso.get_date_from_ndx(7354)
        
    # enso.get_data_of_precise_length(length = 1200, end_date = enso.get_date_from_ndx(-1), apply_to_data = True)


    if NUM_SURR > 0:
        a = list(enso.get_seasonality(detrend = False))
        enso_sg = SurrogateField()

        # _, _, idx = enso.get_data_of_precise_length(length = 1024, end_date = date(2014, 1, 1), COPY = False)
        enso_sg.copy_field(enso)
        # enso_sg.data = enso_sg.data[idx[0]:idx[1]]

        enso.return_seasonality(a[0], a[1], None)

        # a[0] = a[0][idx[0]:idx[1]]
        # a[1] = a[1][idx[0]:idx[1]]

    # select 1024 data points
    # enso.get_data_of_precise_length(length = 1024, end_date = date(2014, 1, 1), COPY = True)
    print("[%s] Data loaded with shape %s" % (str(datetime.now()), enso.data.shape))

    return enso, enso_sg, a#, y
Пример #11
0
def load_ERA_data_daily(filename, varname, start_date, end_date, lats, lons, anom, parts = 1, logger_function = None):
    """
    Data loader for daily ERA-40 / ERA-Interim data.
    If more than one file, filename should be all letters they have got in common without suffix.
    """
    
    if logger_function is None:
        def logger(msg):
            print("[%s] %s" % (str(datetime.now()), msg))
    else:
        logger = logger_function
        
    logger("Loading daily ERA-40 / ERA-Interim data...")
    
    # if in one file, just load it
    if parts == 1:
        path, name = split(filename)
        if path != '':
            path += '/'
            g = DataField(data_folder = path)
        else:
            g = DataField()
        g.load(name, varname, dataset = 'ERA', print_prog = False)
    
    # if in more files, find them all and load them
    else:
        fnames = []
        glist = []
        Ndays = 0
        path, name = split(filename)
        if path != '':
            path += '/'
        else:
            path = '../data'
        for root, _, files in os.walk(path):
            if root == path:
                for f in files:
                    if name in f:
                        fnames.append(f)
        if parts != len(fnames): 
            logger("Something went wrong since %d files matching your filename were found instead of %d." % (len(fnames), parts))
            raise Exception('Check your files and enter correct number of files you want to load.')
        for f in fnames:
            g = DataField(data_folder = path + '/')                
            g.load(f, varname, dataset = 'ERA', print_prog = False)
            Ndays += g.time.shape[0]
            glist.append(g)
            
        data = np.zeros((Ndays, len(glist[0].lats), len(glist[0].lons)))
        time = np.zeros((Ndays,))
        n = 0
        for g in glist:
            Ndays_i = len(g.time)
            data[n:Ndays_i + n, ...] = g.data
            time[n:Ndays_i + n] = g.time
            n += Ndays_i
        g = DataField(data = data, lons = glist[0].lons, lats = glist[0].lats, time = time)
        del glist
        
    if not np.all(np.unique(g.time) == g.time):
        logger('**WARNING: Some fields are overlapping, trying to fix this... (please note: experimental feature)')
        doubles = []
        for i in range(g.time.shape[0]):
            if np.where(g.time == g.time[i])[0].shape[0] == 1:
                # if there is one occurence of time value do nothing
                pass
            else:
                # remember the indices of other occurences
                doubles.append(np.where(g.time == g.time[i])[0][1:])
        logger("... found %d multiple values (according to the time field)..." % (len(doubles)/4))
        delete_mask = np.squeeze(np.array(doubles)) # mask with multiple indices
        # time
        g.time = np.delete(g.time, delete_mask)
        # data
        g.data = np.delete(g.data, delete_mask, axis = 0)
        
        
    logger("** loaded")
    g.select_date(start_date, end_date)
    g.select_lat_lon(lats, lons)
    g.average_to_daily()
    if anom:
        logger("** anomalising")
        g.anomalise()
    day, month, year = g.extract_day_month_year()
    logger("ERA-40 / ERA-Interim data loaded with shape %s. Date range is %d.%d.%d - %d.%d.%d inclusive." 
        % (str(g.data.shape), day[0], month[0], 
           year[0], day[-1], month[-1], year[-1])) 
           
    return g
Пример #12
0
def load_NCEP_data_monthly(filename, varname, start_date, end_date, lats, lons, level, anom):
    """
    Data loader for monthly reanalyses data. 
    """

    print("[%s] Loading monthly NCEP/NCAR data..." % str(datetime.now()))
    g = DataField()
    g.load(filename, varname, dataset = 'NCEP', print_prog = False)
    print("** loaded")
    g.select_date(start_date, end_date)
    g.select_lat_lon(lats, lons)
    if level is not None:
        g.select_level(level)
    if anom:
        print("** anomalising")
        g.anomalise()
    day, month, year = g.extract_day_month_year()

    print("[%s] NCEP data loaded with shape %s. Date range is %d.%d.%d - %d.%d.%d inclusive." 
        % (str(datetime.now()), str(g.data.shape), day[0], month[0], 
           year[0], day[-1], month[-1], year[-1]))

    return g
Пример #13
0
def load_NCEP_data_daily(filename, varname, start_date, end_date, lats, lons, level, anom):
    """
    Data loader for daily reanalyses data. Filename in form path/air.sig995.%d.nc
    """
    
    print("[%s] Loading daily NCEP/NCAR data..." % str(datetime.now()))
    start_year = start_date.year
    end_year = end_date.year - 1
    glist = []
    Ndays = 0
    path, name = split(filename)
    path += "/"
    
    for year in range(start_year, end_year+1):
        g = DataField(data_folder = path)
        fname = name % year
        g.load(fname, varname, dataset = 'NCEP', print_prog = False)
        Ndays += len(g.time)
        glist.append(g)
        
    if glist[0].data.ndim == 3:
        data = np.zeros((Ndays, len(glist[0].lats), len(glist[0].lons)))
    else:
        data = np.zeros((Ndays, len(glist[0].level), len(glist[0].lats), len(glist[0].lons)))
    time = np.zeros((Ndays,))
    n = 0
    for g in glist:
        Ndays_i = len(g.time)
        data[n:Ndays_i + n, ...] = g.data
        time[n:Ndays_i + n] = g.time
        n += Ndays_i
        
    g = DataField(data = data, lons = glist[0].lons, lats = glist[0].lats, time = time)
    del glist
    print("** loaded")
    g.select_date(start_date, end_date)
    g.select_lat_lon(lats, lons)
    if level is not None:
        g.select_level(level)
    if anom:
        print("** anomalising")
        g.anomalise()
    day, month, year = g.extract_day_month_year()

    print("[%s] NCEP data loaded with shape %s. Date range is %d.%d.%d - %d.%d.%d inclusive." 
        % (str(datetime.now()), str(g.data.shape), day[0], month[0], 
           year[0], day[-1], month[-1], year[-1]))
           
    return g
Пример #14
0
def load_ECA_D_data_daily(filename, varname, start_date, end_date, lats, lons, anom, logger_function = None):
    """
    Data loader for daily ECA&D reanalysis data.
    """

    if logger_function is None:
        def logger(msg):
            print("[%s] %s" % (str(datetime.now()), msg))
    else:
        logger = logger_function

    logger("Loading daily ECA&D data...")
    g = DataField()
    g.load(filename, varname, dataset = 'ECA-reanalysis', print_prog = False)
    logger("** loaded")
    g.select_date(start_date, end_date)
    g.select_lat_lon(lats, lons)
    if anom:
        logger("** anomalising")
        g.anomalise()
    day, month, year = g.extract_day_month_year()

    logger("ECA&D data loaded with shape %s. Date range is %d.%d.%d - %d.%d.%d inclusive." 
        % (str(g.data.shape), day[0], month[0], 
           year[0], day[-1], month[-1], year[-1]))

    return g
Пример #15
0
def load_station_data(filename, start_date, end_date, anom, to_monthly=False, dataset='ECA-station', offset=1):
    """
    Data loader for station data.
    """

    print("[%s] Loading station data..." % (str(datetime.now())))
    g = DataField()
    g.load_station_data(filename, dataset, print_prog=False, offset_in_file=offset)
    print("** loaded")
    g.select_date(start_date, end_date)
    if anom:
        print("** anomalising")
        g.anomalise()
    if to_monthly:
        g.get_monthly_data()
    day, month, year = g.extract_day_month_year()
    print("[%s] Data from %s loaded with shape %s. Date range is %d.%d.%d - %d.%d.%d inclusive." 
        % (str(datetime.now()), g.location, str(g.data.shape), day[0], month[0], 
           year[0], day[-1], month[-1], year[-1]))
           
    return g