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)
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)
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)
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