def test_construction(self): u = None v = None with pytest.raises(ValueError): # mismatched data and dates length dates = [] u = TimeSeriesProp( 'u', 'm/s', [datetime.datetime.now(), datetime.datetime.now()], [ 5, ]) u = TimeSeriesProp('u', 'm/s', [datetime.datetime.now()], [ 5, ]) assert u is not None assert u.name == 'u' assert u.units == 'm/s' v = None with pytest.raises(ValueError): v = TimeSeriesProp('v', 'nm/hr', [datetime.datetime.now()], [ 5, ]) assert v is None constant = TimeSeriesProp.constant('const', 'm/s', 5) assert constant.data[0] == 5 assert all(constant.at(np.array((0, 0)), datetime.datetime.now()) == 5)
def __init__(self, temperature=300., salinity=35.0, sediment=.005, fetch=0, name='WaterConditions', **kwargs): ''' Assume units are SI for all properties. 'units' attribute assumes SI by default. This can be changed, but initialization takes SI. ''' if isinstance(temperature, (Number)): self.temperature = TemperatureTS.constant(data=temperature) elif isinstance(temperature, (EnvProp)): self.temperature = temperature else: raise TypeError('Temperature is not an environment object or number') if isinstance(salinity, (Number)): self.salinity = TimeSeriesProp.constant(name='Salinity', units='psu', data=salinity) elif isinstance(salinity, (EnvProp)): self.salinity = salinity else: raise TypeError('Salinity is not an environment object or number') if isinstance(sediment, (Number)): self.sediment = TimeSeriesProp.constant(name='Sediment', units='kg/m^3', data=sediment) elif isinstance(sediment, (EnvProp)): self.sediment = sediment else: raise TypeError('Sediment is not an environment object or number') # self.wave_height = wave_height self.fetch = fetch self.kinematic_viscosity = 0.000001 self.name = 'WaterConditions'
def test_at(self): dates2 = np.array([ dt.datetime(2000, 1, 1, 0), dt.datetime(2000, 1, 1, 2), dt.datetime(2000, 1, 1, 4), dt.datetime(2000, 1, 1, 6), dt.datetime(2000, 1, 1, 8), ]) u_data = np.array([2., 4., 6., 8., 10.]) u = TimeSeriesProp(name='u', units='m/s', time=dates2, data=u_data) corners = np.array(((1, 1), (2, 2))) t1 = dt.datetime(1999, 12, 31, 23) t2 = dt.datetime(2000, 1, 1, 0) t3 = dt.datetime(2000, 1, 1, 1) t4 = dt.datetime(2000, 1, 1, 8) t5 = dt.datetime(2000, 1, 1, 9) # No extrapolation. out of bounds time should fail with pytest.raises(ValueError): u.at(corners, t1) assert (u.at(corners, t2) == np.array([2])).all() assert (u.at(corners, t3) == np.array([3])).all() assert (u.at(corners, t4) == np.array([10])).all() with pytest.raises(ValueError): u.at(corners, t5) # turn extrapolation on assert (u.at(corners, t1, extrapolate=True) == np.array([2])).all() assert (u.at(corners, t5, extrapolate=True) == np.array([10])).all()
def __init__(self, name=None, units='K', time=None, data=None, **kwargs): if 'timeseries' in kwargs: ts = kwargs['timeseries'] time = map(lambda e: e[0], ts) data = np.array(map(lambda e: e[1], ts)) TimeSeriesProp.__init__(self, name, units, time, data=data)
def __init__(self, name=None, units='kg/m^3', temperature=None, salinity=None): if temperature is None or salinity is None or not isinstance(temperature, TemperatureTS) or not isinstance(salinity, SalinityTS): raise ValueError('Must provide temperature and salinity time series Environment objects') density_times = temperature.time if len(temperature.time.time) > len(salinity.time.time) else salinity.time dummy_pt = np.array([[0, 0], ]) import gsw from gnome import constants data = [gsw.rho(salinity.at(dummy_pt, t), temperature.at(dummy_pt, t, units='C'), constants.atmos_pressure * 0.0001) for t in density_times.time] TimeSeriesProp.__init__(self, name, units, time=density_times, data=data)
def test_unit_conversion(self): u = TimeSeriesProp('u', 'm/s', [datetime.datetime.now()], [ 5, ]) t = u.in_units('km/hr') assert t.data is not u.data assert round(t.data[0], 2) == 18.0 with pytest.raises(unit_conversion.NotSupportedUnitError): # mismatched data and dates length t = u.in_units('nm/hr')
def new_from_dict(cls, dict_): varnames = dict_['varnames'] vs = [] for i, varname in enumerate(varnames): vs.append( TimeSeriesProp(name=varname, units=dict_['units'], time=dict_['time'], data=dict_['data'][i])) dict_.pop('data') dict_['variables'] = vs return super(VelocityTS, cls).new_from_dict(dict_)
def test_construction(self): u = None v = None with pytest.raises(ValueError): # mismatched data and dates length u = TimeSeriesProp('u', 'm/s', dates, u_data) assert u is None u = TimeSeriesProp('u', 'm/s', dates2, u_data) assert u is not None assert u.name == 'u' assert u.units == 'm/s' print u.time == Time(dates2) assert u.time == Time(dates2) assert (u.data == u_data).all() v = None with pytest.raises(ValueError): v = TimeSeriesProp('v', 'nm/hr', dates2, v_data) assert v is None
def constant(cls, name='', speed=0, direction=0, units='m/s'): """ utility to create a constant wind "timeseries" :param speed: speed of wind :param direction: direction -- degrees True, direction wind is from (degrees True) :param units='m/s': units for speed, as a string, i.e. "knots", "m/s", "cm/s", etc. .. note:: The time for a constant wind timeseries is irrelevant. This function simply sets it to datetime.now() accurate to hours. """ direction = direction * -1 - 90 u = speed * np.cos(direction * np.pi / 180) v = speed * np.sin(direction * np.pi / 180) u = TimeSeriesProp.constant('u', units, u) v = TimeSeriesProp.constant('v', units, v) return super(VelocityTS, cls).constant(name, units, variables=[u, v])
def __init__(self, angle=None, **kwargs): """ :param angle: scalar field of cell rotation angles (for rotated/distorted grids) """ if 'variables' in kwargs: variables = kwargs['variables'] if len(variables) == 2: variables.append(TimeSeriesProp(name='constant w', data=[0.0], time=Time.constant_time(), units='m/s')) kwargs['variables'] = variables if angle is None: df = None if kwargs.get('dataset', None) is not None: df = kwargs['dataset'] elif kwargs.get('grid_file', None) is not None: df = _get_dataset(kwargs['grid_file']) if df is not None and 'angle' in df.variables.keys(): # Unrotated ROMS Grid! self.angle = GriddedProp(name='angle', units='radians', time=None, grid=kwargs['grid'], data=df['angle']) else: self.angle = None else: self.angle = angle super(VelocityGrid, self).__init__(**kwargs)
) # scale winds from 100-0% depending on ice coverage return vels else: return self.wind_var.at(points, time, units, extrapolate) if __name__ == "__main__": import datetime as dt dates = np.array([ dt.datetime(2000, 1, 1, 0), dt.datetime(2000, 1, 1, 2), dt.datetime(2000, 1, 1, 4) ]) u_data = np.array([3, 4, 5]) v_data = np.array([4, 3, 12]) u = TimeSeriesProp('u', 'm/s', dates, u_data) v = TimeSeriesProp('v', 'm/s', dates, v_data) print u.at(np.array([(1, 1), (1, 2)]), dt.datetime(2000, 1, 1, 1)) vprop = TSVectorProp('velocity', 'm/s', variables=[u, v]) print vprop.at(np.array([(1, 1), (1, 2)]), dt.datetime(2000, 1, 1, 3)) vel = VelocityTS('test_vel', variables=[u, v]) print vel.at(np.array([(1, 1), (1, 2)]), dt.datetime(2000, 1, 1, 3)) import pprint pp = pprint.PrettyPrinter(indent=4) pp.pprint(vel.serialize()) pp.pprint(VelocityTS.deserialize(vel.serialize()))
def v(): return TimeSeriesProp(name='v', units='m/s', time=dates2, data=v_data)
def u(): return TimeSeriesProp(name='u', units='m/s', time=dates2, data=u_data)