def test_ensoindices_on_irregular_series(self):
     "Try setting ensoindices on a non-regular series"
     ensoi = self.ensoi
     ensoi.set_monthly_indices(minimum_size=5, reference_season='NDJ')
     #
     bseries = climate_series(range(24),
                              start_date=ts.Date('M', '1982-01'),
                              ensoindicator=ensoi)
     control_indices = [-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1]
     control_indices = ts.time_series(control_indices,
                                      start_date=bseries.dates[0])
     tseries = bseries[::2]
     assert_equal(tseries.ensoindices, control_indices[::2])
     mseries = climate_series(tseries, ensoindicator=bseries.ensoindicator)
     assert_equal(mseries.ensoindices, bseries.ensoindices[::2])
     mseries = climate_series(tseries, ensoindicator=bseries.ensoindicator)
 def test_ensoindices_on_empty_series(self):
     "Try on an empty series"
     ensoi = self.ensoi
     ensoi.set_monthly_indices(minimum_size=5, reference_season='NDJ')
     bseries = climate_series(range(24),
                              start_date=hydro.Date('M', '1982-01'),
                              ensoindicator=ensoi)
     bseries = bseries[[]]
     assert (bseries.ensoindicator is None)
 def test_ensoindices_on_empty_series(self):
     "Try on an empty series"
     ensoi = self.ensoi
     ensoi.set_monthly_indices(minimum_size=5, reference_season='NDJ')
     bseries = climate_series(range(24),
                              start_date=hydro.Date('M', '1982-01'),
                              ensoindicator=ensoi)
     bseries = bseries[[]]
     assert(bseries.ensoindicator is None)
 def test_ensoindices_on_irregular_series(self):
     "Try setting ensoindices on a non-regular series"
     ensoi = self.ensoi
     ensoi.set_monthly_indices(minimum_size=5, reference_season='NDJ')
     #
     bseries = climate_series(range(24),
                              start_date=ts.Date('M', '1982-01'),
                              ensoindicator=ensoi)
     control_indices = [
         -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         1, 1
     ]
     control_indices = ts.time_series(control_indices,
                                      start_date=bseries.dates[0])
     tseries = bseries[::2]
     assert_equal(tseries.ensoindices, control_indices[::2])
     mseries = climate_series(tseries, ensoindicator=bseries.ensoindicator)
     assert_equal(mseries.ensoindices, bseries.ensoindices[::2])
     mseries = climate_series(tseries, ensoindicator=bseries.ensoindicator)
 def test_ensoindices_from_daily_indicator(self):
     "Try setting ensoindices from a daily indicator"
     ensoi = self.ensoi
     ensoi.set_monthly_indices(minimum_size=5, reference_season='NDJ')
     #
     bseries = climate_series(range(24),
                              start_date=ts.Date('M', '1982-01'),
                              ensoindicator=ensoi)
     control_indices = [-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1]
     control_indices = ts.time_series(control_indices,
                                      start_date=bseries.dates[0])
     # Basic check
     assert_equal(bseries.ensoindices, control_indices)
     # Define daily series
     dseries = climate_series(range(730),
                              start_date=ts.Date('D', '1982-01-01'),
                              ensoindicator=ensoi)
     mseries = climate_series(range(24),
                              start_date=ts.Date('M', '1982-01'),
                              ensoindicator=dseries.ensoindicator)
     assert_equal(mseries.ensoindices, bseries.ensoindices)
Example #6
0
def wet_spells(rainfall, threshold=0, start=True, mode='both'):
    """
    Compute the wet spells for a series of precipitations

    Parameters
    ----------
    rainfall : TimeSeries
        TimeSeries of precipitations.
    threshold : float, optional
        Minimum amount of precipitation defining a wet day.
    start : boolean, optional
        Whether the spells are associated with the first or last day of the spell.
    mode : {'durations', 'intensities', 'all'}
        Whether to return only durations, intensities or both.
    

    Returns
    -------
    wet_spells : TimeSeries
        A :class:`TimeSeries` giving the duration and/or intensity of a spell
        at either the first or last date.
    """
    rdates = getattr(rainfall, 'dates', None)
    rdata = ma.masked_array(rainfall, subok=False)
    condition = ma.masked_less(rdata, threshold)
    slices = ma.clump_unmasked(condition)
    # Get the durations and starting dates of each spell
    mode = (mode or 'both').lower()[0]
    if mode == 'd':
        # Durations
        result = np.array([s.stop - s.start for s in slices], dtype=int)
    elif mode == 'i':
        # Intensities
        result = np.array([rdata[s].sum() for s in slices])
    else:
        durations = [s.stop - s.start for s in slices]
        intensities = [rdata[s].sum() for s in slices]
        result = np.array(zip(durations, intensities),
                          dtype=[('durations', int), ('intensities', float)],)
    if rdates is None:
        return result
    if start:
        dates = rdates[[s.start for s in slices]]
    else:
        dates = rdates[[s.stop - 1 for s in slices]]
    ensoi = getattr(rainfall, 'ensoindicator', None)
    if mode in 'id':
        spells = enso.climate_series(result, dates=dates, ensoindicator=ensoi)
    else:
        spells = enso.climate_records(result, dates=dates, ensoindicator=ensoi)
    return spells
 def test_ensoindices_from_daily_indicator(self):
     "Try setting ensoindices from a daily indicator"
     ensoi = self.ensoi
     ensoi.set_monthly_indices(minimum_size=5, reference_season='NDJ')
     #
     bseries = climate_series(range(24),
                              start_date=ts.Date('M', '1982-01'),
                              ensoindicator=ensoi)
     control_indices = [
         -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         1, 1
     ]
     control_indices = ts.time_series(control_indices,
                                      start_date=bseries.dates[0])
     # Basic check
     assert_equal(bseries.ensoindices, control_indices)
     # Define daily series
     dseries = climate_series(range(730),
                              start_date=ts.Date('D', '1982-01-01'),
                              ensoindicator=ensoi)
     mseries = climate_series(range(24),
                              start_date=ts.Date('M', '1982-01'),
                              ensoindicator=dseries.ensoindicator)
     assert_equal(mseries.ensoindices, bseries.ensoindices)
Example #8
0
 def test_set_ensoindices(self):
     "Test setting indices"
     ONI = load_oni('standard')
     mseries = climate_series(np.random.rand(120),
                              start_date=ts.Date('M', '1991-01'),
                              ensoindicator=ONI)
     control = ONI['1991-01':'2001-01']
     assert_equal(mseries.ensoindices, control.indices)
     test = mseries.set_ensoindices(full_year=True).copy()
     self.failUnless(mseries.ensoindicator.optinfo['full_year'])
     assert_equal(test, control.set_indices(full_year=True))
     self.failUnless(control.optinfo['full_year'])
     assert_equal(test, mseries.ensoindices)
     assert_equal(mseries.set_ensoindices(lag=6), test.tshift(-6))
     #
     mseries.set_ensoindices(full_year=True, lag=0)
     series = ts.lib.backward_fill(mseries.convert('D'))
     series_m = series.convert('M', ma.mean)
     assert_equal(test, series_m.ensoindices)
 def test_set_ensoindices(self):
     "Test setting indices"
     ONI = load_oni('standard')
     mseries = climate_series(np.random.rand(120),
                              start_date=ts.Date('M','1991-01'),
                              ensoindicator=ONI)
     control = ONI['1991-01':'2001-01']
     assert_equal(mseries.ensoindices, control.indices)
     test = mseries.set_ensoindices(full_year=True).copy()
     self.failUnless(mseries.ensoindicator.optinfo['full_year'])
     assert_equal(test,
                  control.set_indices(full_year=True))
     self.failUnless(control.optinfo['full_year'])
     assert_equal(test, mseries.ensoindices)
     assert_equal(mseries.set_ensoindices(lag=6), test.tshift(-6))
     #
     mseries.set_ensoindices(full_year=True, lag=0)
     series = ts.lib.backward_fill(mseries.convert('D'))
     series_m = series.convert('M', ma.mean)
     assert_equal(test, series_m.ensoindices)
Example #10
0
def dry_spells(rainfall, threshold=0.254, start=True):
    """
    Compute the dry spells for a series of precipitations

    Parameters
    ----------
    rainfall : TimeSeries
        TimeSeries of precipitations.
    threshold : float, optional
        Minimum amount of precipitation defining a wet day.
    start : boolean, optional
        Whether the spells are associated with the first or last day of the spell.
    

    Returns
    -------
    dry_spells : TimeSeries
        A :class:`TimeSeries` giving the duration of the spell at either the first 
        or last date.
    """
    rdates = getattr(rainfall, 'dates', None)
    rdata = ma.masked_array(rainfall, subok=False)
    condition = ma.masked_greater(rdata, threshold)
    slices = ma.clump_unmasked(condition)
    # Get the durations and starting dates of each spell
    durations = [s.stop - s.start for s in slices]
    # Give up if we have no dates
    if rdates is None:
        return np.array(durations)
    # Get the dates, then...
    if start:
        dates = rdates[[s.start for s in slices]]
    else:
        dates = rdates[[s.stop - 1 for s in slices]]
    ensoi = getattr(rainfall, 'ensoindicator', None)
    spells = enso.climate_series(durations, dates=dates, ensoindicator=ensoi)
    return spells