Example #1
0
    def test_template_statistics(self):
        """ensure that statistics fns work on template creation"""
        v = np.ones(self.test_data.shape)
        y = q.DiurnalLocalTimeStatistics(v, self.time_axis, self.timestep,
                                         self.lons)
        x = q.DiurnalLocalTimeStatistics(self.test_data, template=y)
        x.load_day(3)

        # mean
        first_point = ma.array(self.test_data[0, 8:16],
                               mask=x.mask[0, :]).mean()
        self.assertEqual(first_point, x.mean()[0])
        first_point = self.test_data[0, 12:16].mean()
        self.assertEqual(first_point, x.mean()[0])

        # max
        first_point = ma.array(self.test_data[0, 8:16],
                               mask=x.mask[0, :]).max()
        self.assertEqual(first_point, x.max()[0])
        first_point = self.test_data[0, 12:16].max()
        self.assertEqual(first_point, x.max()[0])

        # min
        first_point = ma.array(self.test_data[0, 8:16],
                               mask=x.mask[0, :]).min()
        self.assertEqual(first_point, x.min()[0])
        first_point = self.test_data[0, 12:16].min()
        self.assertEqual(first_point, x.min()[0])
Example #2
0
    def test_ref_val(self):
        """checks that we pick the correct reference value for all lon points."""
        x = q.DiurnalLocalTimeStatistics(self.test_data, self.time_axis,
                                         self.timestep, self.lons)
        lsf = q.LongitudeSamplingFunction(24 * u.hour / self.timestep,
                                          13 * u.hour)
        i_lons = lsf.get_index(self.lons) + 4

        result = np.empty((len(i_lons), ))
        for i in range(len(i_lons)):
            result[i] = self.test_data[i, i_lons[i]]

        self.assertTrue(np.all(result == x.ref_val()))

        # now switch test data so that there's more land points than time points
        # and the axes are reversed
        self.test_data = np.arange(100 * 16).reshape(16, 100)
        self.time_axis = 0
        self.lons = np.arange(100) * 2 * u.deg - 135 * u.deg
        x = q.DiurnalLocalTimeStatistics(self.test_data, self.time_axis,
                                         self.timestep, self.lons)
        lsf = q.LongitudeSamplingFunction(24 * u.hour / self.timestep,
                                          13 * u.hour)
        i_lons = lsf.get_index(self.lons) + 4

        result = np.empty((len(i_lons), ))
        for i in range(len(i_lons)):
            result[i] = self.test_data[i_lons[i], i]

        self.assertTrue(np.all(result == x.ref_val()))
Example #3
0
    def test_template_create(self):
        """make sure we can create new instances from a template."""
        x = q.DiurnalLocalTimeStatistics(self.test_data, self.time_axis,
                                         self.timestep, self.lons)

        v = np.ones(self.test_data.shape)
        y = q.DiurnalLocalTimeStatistics(v, template=x)
        self.assertEqual(self.time_axis, y.time_axis)
        self.assertEqual(self.timestep, y.timestep)
        self.assertTrue(np.all(self.lons == y.lons))
        self.assertTrue(np.all(x.i_ref == y.i_ref))
        self.assertTrue(np.all(x.mask == y.mask))
        self.assertTrue(np.all(x.source == self.test_data))
        self.assertTrue(np.all(y.source == v))
Example #4
0
    def test_nonsequential_stats(self):
        """checks that we can compute statistics after loading nonsequentially"""
        x = q.DiurnalLocalTimeStatistics(self.test_data,
                                         self.time_axis,
                                         self.timestep,
                                         self.lons,
                                         sequential=False)
        x.load_day(3)

        # mean
        first_point = ma.array(self.test_data[0, 8:16],
                               mask=x.mask[0, :]).mean()
        self.assertEqual(first_point, x.mean()[0])
        first_point = self.test_data[0, 12:16].mean()
        self.assertEqual(first_point, x.mean()[0])

        # max
        first_point = ma.array(self.test_data[0, 8:16],
                               mask=x.mask[0, :]).max()
        self.assertEqual(first_point, x.max()[0])
        first_point = self.test_data[0, 12:16].max()
        self.assertEqual(first_point, x.max()[0])

        # min
        first_point = ma.array(self.test_data[0, 8:16],
                               mask=x.mask[0, :]).min()
        self.assertEqual(first_point, x.min()[0])
        first_point = self.test_data[0, 12:16].min()
        self.assertEqual(first_point, x.min()[0])
Example #5
0
    def test_forego_units(self):
        """make sure we can forego units if needed"""
        x = q.DiurnalLocalTimeStatistics(self.test_data,
                                         self.time_axis,
                                         self.timestep,
                                         self.lons,
                                         unit=u.Pa)

        self.assertEqual(x.get_utc_day().unit, u.Pa)
        self.assertEqual(x.get_preceeding_day().unit, u.Pa)
        self.assertEqual(x.get_buffer().unit, u.Pa)
        x.load_day(3)

        # mean
        first_point = ma.array(self.test_data[0, 8:16],
                               mask=x.mask[0, :]).mean()
        self.assertEqual(first_point, x.mean(unitted=False)[0])
        first_point = self.test_data[0, 12:16].mean()
        self.assertEqual(first_point, x.mean(unitted=False)[0])

        # max
        first_point = ma.array(self.test_data[0, 8:16],
                               mask=x.mask[0, :]).max()
        self.assertEqual(first_point, x.max(unitted=False)[0])
        first_point = self.test_data[0, 12:16].max()
        self.assertEqual(first_point, x.max(unitted=False)[0])

        # min
        first_point = ma.array(self.test_data[0, 8:16],
                               mask=x.mask[0, :]).min()
        self.assertEqual(first_point, x.min(unitted=False)[0])
        first_point = self.test_data[0, 12:16].min()
        self.assertEqual(first_point, x.min(unitted=False)[0])
Example #6
0
 def test_next(self):
     """test that next() advances to the next day"""
     x = q.DiurnalLocalTimeStatistics(self.test_data, self.time_axis,
                                      self.timestep, self.lons)
     x.next()
     self.assertEqual(x.cur_day, 3)
     self.assertTrue(np.all(x.buffer[0, :] == self.test_data[0, 4:12]))
Example #7
0
 def test_max(self):
     """test the masked max function"""
     x = q.DiurnalLocalTimeStatistics(self.test_data, self.time_axis,
                                      self.timestep, self.lons)
     first_point = ma.array(self.test_data[0, :8], mask=x.mask[0, :]).max()
     self.assertEqual(first_point, x.max()[0])
     first_point = self.test_data[0, 4:8].max()
     self.assertEqual(first_point, x.max()[0])
Example #8
0
 def test_attributes(self):
     """test initialization of various attributes"""
     x = q.DiurnalLocalTimeStatistics(self.test_data, self.time_axis,
                                      self.timestep, self.lons)
     self.assertEqual(x.diurnal_window, 4)
     self.assertEqual(x.time_axis, self.time_axis)
     self.assertEqual(x.timestep, self.timestep)
     self.assertTrue(np.all(self.lons == x.lons))
     self.assertTrue(np.all(x.buffer.shape == np.array((6, 8))))
Example #9
0
 def setUp(self):
     # six points, four samples/day, 4 days
     self.test_data = np.arange(96).reshape((6, 16))
     self.time_axis = 1
     self.timestep = 6 * u.hour
     self.lons = np.arange(6) * 45 * u.deg - 135 * u.deg
     self.dlts = q.DiurnalLocalTimeStatistics(self.test_data,
                                              self.time_axis, self.timestep,
                                              self.lons)
Example #10
0
    def test_unit(self):
        """make sure that returned data have correct units attached"""
        x = q.DiurnalLocalTimeStatistics(self.test_data,
                                         self.time_axis,
                                         self.timestep,
                                         self.lons,
                                         unit=u.Pa)

        self.assertEqual(x.get_utc_day().unit, u.Pa)
        self.assertEqual(x.get_preceeding_day().unit, u.Pa)
        self.assertEqual(x.get_buffer().unit, u.Pa)

        # repeat for "no units" case
        x = q.DiurnalLocalTimeStatistics(self.test_data, self.time_axis,
                                         self.timestep, self.lons)
        self.assertFalse(hasattr(x.get_utc_day(), "unit"))
        self.assertFalse(hasattr(x.get_preceeding_day(), "unit"))
        self.assertFalse(hasattr(x.get_buffer(), "unit"))
Example #11
0
 def test_nonsequential_load(self):
     """checks that loading days nonsequentially works OK"""
     x = q.DiurnalLocalTimeStatistics(self.test_data,
                                      self.time_axis,
                                      self.timestep,
                                      self.lons,
                                      sequential=False)
     self.assertEqual(None, x.cur_day)
     self.assertEqual(None, x.buffer)
     x.load_day(3)
     self.assertTrue(np.all(x.buffer[0, :] == self.test_data[0, 8:16]))
     x.load_day(1)
     self.assertTrue(np.all(x.buffer[0, :] == self.test_data[0, :8]))
Example #12
0
    def test_preceeding_day(self):
        """tests to ensure the correct data is returned"""
        x = q.DiurnalLocalTimeStatistics(self.test_data, self.time_axis,
                                         self.timestep, self.lons)
        lsf = q.LongitudeSamplingFunction(24 * u.hour / self.timestep,
                                          13 * u.hour)
        i_lons = lsf.get_index(self.lons)

        result = np.empty((len(i_lons), 4))
        for i in range(len(i_lons)):
            result[i, :] = self.test_data[i, i_lons[i] + 1:i_lons[i] + 5]

        self.assertTrue(np.all(result == x.get_preceeding_day()))
Example #13
0
    def test_mask(self):
        """test initialization of mask"""
        x = q.DiurnalLocalTimeStatistics(self.test_data, self.time_axis,
                                         self.timestep, self.lons)
        lsf = q.LongitudeSamplingFunction(24 * u.hour / self.timestep,
                                          13 * u.hour)
        i_lons = lsf.get_index(self.lons)

        afternoon = i_lons[0]
        self.assertTrue(afternoon == 3)
        mask_test = [
            not ((i > afternoon) and (i <= afternoon + 4)) for i in range(8)
        ]
        self.assertTrue(np.all(x.mask[0, :] == mask_test))
Example #14
0
    def register_variable(self, varname, unit):
        """adds "varname" to the list of variables to track"""
        bufs = self.get_buffer_group()

        forcing = self.get_forcing()
        ncvar = forcing.variables[varname]
        if not bufs.template_ready():
            time_axis = ncvar.dimensions.index('tstep')
            bufs.add(
                varname,
                q.DiurnalLocalTimeStatistics(ncvar,
                                             time_axis,
                                             self.get_timestep(),
                                             self.get_longitudes(),
                                             unit=unit))
        else:
            bufs.create(varname, ncvar, unit)

        return bufs.get(varname)
Example #15
0
    def test_netcdf_source(self):
        """test to ensure we can use netcdf variable as source"""
        d = nc.Dataset('test.nc', 'w', diskless=True)

        d.createDimension('time', 16)
        d.createDimension('land', 6)

        v = d.createVariable('test',
                             self.test_data.dtype,
                             dimensions=('land', 'time'))
        v[:] = self.test_data

        x = q.DiurnalLocalTimeStatistics(v, self.time_axis, self.timestep,
                                         self.lons)

        x.load_day(3)

        # mean
        first_point = ma.array(self.test_data[0, 8:16],
                               mask=x.mask[0, :]).mean()
        self.assertEqual(first_point, x.mean()[0])
        first_point = self.test_data[0, 12:16].mean()
        self.assertEqual(first_point, x.mean()[0])

        # max
        first_point = ma.array(self.test_data[0, 8:16],
                               mask=x.mask[0, :]).max()
        self.assertEqual(first_point, x.max()[0])
        first_point = self.test_data[0, 12:16].max()
        self.assertEqual(first_point, x.max()[0])

        # min
        first_point = ma.array(self.test_data[0, 8:16],
                               mask=x.mask[0, :]).min()
        self.assertEqual(first_point, x.min()[0])
        first_point = self.test_data[0, 12:16].min()
        self.assertEqual(first_point, x.min()[0])
Example #16
0
    def test_units_on_statistics(self):
        """make sure statistics functions return Quantities by default"""
        x = q.DiurnalLocalTimeStatistics(self.test_data,
                                         self.time_axis,
                                         self.timestep,
                                         self.lons,
                                         sequential=False,
                                         unit=u.Pa)
        x.load_day(3)

        # mean
        mean = x.mean()
        self.assertTrue(hasattr(mean, "unit"))
        self.assertEqual(mean.unit, u.Pa)

        # max
        mx = x.max()
        self.assertTrue(hasattr(mx, "unit"))
        self.assertEqual(mx.unit, u.Pa)

        # min
        mn = x.min()
        self.assertTrue(hasattr(mn, "unit"))
        self.assertEqual(mn.unit, u.Pa)
Example #17
0
 def test_creation(self):
     """test creation and initialization of object"""
     x = q.DiurnalLocalTimeStatistics(self.test_data, self.time_axis,
                                      self.timestep, self.lons)