예제 #1
0
    def test_files_list(self):
        patterns = list(TEST_FILE_PATTERNS.keys())
        d = DecadesDataset()
        for pattern in patterns:
            d.add_file(pattern)

        for pattern in patterns:
            self.assertIn(pattern, [i.filepath for i in d.files])
예제 #2
0
    def setUp(self):
        self.test_index_1 = pd.date_range(start=datetime.datetime(2000, 1, 1),
                                          periods=10,
                                          freq='S')

        self.test_index_32 = pd.date_range(start=datetime.datetime(2000, 1, 1),
                                           periods=320,
                                           freq='31250000N')

        self.d = DecadesDataset(datetime.datetime(2000, 1, 1))
        self.v = DecadesVariable({TEST_VAR_NAME: TEST_VAR_VALUES},
                                 index=self.test_index_1,
                                 frequency=1)
예제 #3
0
    def test_add_decades_file(self):
        patterns = list(TEST_FILE_PATTERNS.keys())

        d = DecadesDataset()
        for pattern in patterns:
            d.add_file(pattern)

        files = []
        for i in d.readers:
            files += i.files

        for _file in files:
            self.assertIn(_file.filepath, patterns)
예제 #4
0
    def test_instance(cls, dataset=None):
        """
        Return a test instance of a postprocessing module, initialized with a
        DecadesDataset containing the modules test data.
        """
        now = datetime.datetime.now().replace(microsecond=0)

        if dataset is None:
            d = DecadesDataset(now.date())
        else:
            d = dataset

        if callable(cls.test):
            # pylint: disable=not-callable
            _test = cls.test()
        else:
            _test = cls.test

        for key, val in _test.items():
            _type, *_values = val

            if val[0] == 'const':
                d.constants[key] = val[1]

            elif val[0] == 'data':

                _values, _freq = val[1:]
                _dt = datetime.timedelta(seconds=1 / _freq)
                freq = '{}N'.format((1 / _freq) * 1e9)

                start_time = datetime.datetime(*d.date.timetuple()[:3])
                end_time = (start_time +
                            datetime.timedelta(seconds=len(_values)) - _dt)

                hz1_index = pd.date_range(start=start_time,
                                          periods=len(_values),
                                          freq='S')
                full_index = pd.date_range(start=start_time,
                                           end=end_time,
                                           freq=freq)

                data = pd.Series(_values,
                                 hz1_index).reindex(full_index).interpolate()

                var = DecadesVariable(data, name=key, frequency=_freq)
                d.add_input(var)

        return cls(d, test_mode=True)
예제 #5
0
    def test_infer_readers(self):
        for pattern, reader in TEST_FILE_PATTERNS.items():

            self.assertIs(DecadesDataset.infer_reader(DecadesFile(pattern)),
                          reader)

            os.remove(pattern)
예제 #6
0
def get_flagmod_doc(module):
    """
    Returns documentation for a given flagging module, as restructured text.

    Args:
        module: the flagging module to document, expected to be a subclass of 
            ppodd.flags.FlaggingBase.

    Returns:
        A restructured text string containing the module documentation.
    """
    index = module.test_index
    flag = module.test_flag
    d = DecadesDataset()
    for var in module.flagged:
        v = DecadesVariable(pd.Series(flag, index=index, name=var),
                            flag=DecadesBitmaskFlag)
        d.add_output(v)

    mod = module(d)
    mod._flag(test=True)

    output = "\n\n"
    output += '-' * len(module.__name__) + '\n'
    output += module.__name__ + '\n'
    output += '-' * len(module.__name__) + '\n\n'
    output += mod.__doc__

    for var, flag_infos in mod.flags.items():
        mod_var_txt = f'Flagged variable: `{var}`'
        output += '\n\n' + mod_var_txt + '\n'
        output += '-' * len(mod_var_txt) + '\n\n'

        for flag_info in flag_infos:
            output += f'* ``{flag_info[0]}`` - {flag_info[1]}\n'

    return output
예제 #7
0
 def test_dataset_date_attribute(self):
     today = datetime.date.today()
     d = DecadesDataset(today)
     self.assertEqual(d.date, today)
예제 #8
0
 def test_create_dataset_with_date(self):
     d = DecadesDataset(datetime.date.today())
예제 #9
0
 def test_create_dataset(self):
     d = DecadesDataset()
예제 #10
0
class TestDecades(unittest.TestCase):
    """
    An empty subclass of unittest.TestCase, to which we append tests for each
    module.
    """
    def setUp(self):
        self.test_index_1 = pd.date_range(start=datetime.datetime(2000, 1, 1),
                                          periods=10,
                                          freq='S')

        self.test_index_32 = pd.date_range(start=datetime.datetime(2000, 1, 1),
                                           periods=320,
                                           freq='31250000N')

        self.d = DecadesDataset(datetime.datetime(2000, 1, 1))
        self.v = DecadesVariable({TEST_VAR_NAME: TEST_VAR_VALUES},
                                 index=self.test_index_1,
                                 frequency=1)

    @classmethod
    def setUpClass(cls):
        for pattern in TEST_FILE_PATTERNS.keys():
            with open(pattern, 'w'):
                pass

    @classmethod
    def teardownClass(cls):
        for pattern in TEST_FILE_PATTERNS.keys():
            os.remove(pattern)

    def _get_var_1(self):
        return DecadesVariable({TEST_VAR_NAME: TEST_VAR_VALUES},
                               index=self.test_index_1)

    def _get_var_32(self):
        return DecadesVariable({TEST_VAR_NAME: TEST_VAR_VALUES * 32},
                               index=self.test_index_32)

    def test_create_dataset(self):
        d = DecadesDataset()

    def test_variable_isnumeric(self):
        self.assertTrue(self.v.isnumeric)

        v2 = DecadesVariable({'stringvar': ['a'] * len(TEST_VAR_VALUES)},
                             index=self.test_index_1,
                             frequency=1)
        self.assertFalse(v2.isnumeric)

    def test_create_dataset_with_date(self):
        d = DecadesDataset(datetime.date.today())

    def test_create_decades_variable(self):
        self._get_var_1()

    def test_t0_correct(self):
        v = self._get_var_1()
        self.assertEqual(v.t0, self.test_index_1[0])

    def test_t1_correct(self):
        v = self._get_var_1()
        self.assertEqual(v.t1, self.test_index_1[-1])

    def test_time_bounds(self):
        v = self._get_var_1()
        i = self.test_index_1
        bounds = v.time_bounds()
        self.assertEqual(bounds[0], self.test_index_1[0])
        self.assertEqual(bounds[1], self.test_index_1[-1])

    def test_dataset_date_attribute(self):
        today = datetime.date.today()
        d = DecadesDataset(today)
        self.assertEqual(d.date, today)

    def test_calling_variable_name(self):
        v = self._get_var_1()()
        self.assertEqual(v.name, TEST_VAR_NAME)

    def test_calling_variable_index(self):
        v = self._get_var_1()()
        for a, b in zip(v.index, self.test_index_1):
            self.assertEqual(a, b)

    def test_get_freq_for_1hz_and_32hz(self):
        var1 = self._get_var_1()
        var32 = self._get_var_32()
        self.assertEqual(var1.frequency, 1)
        self.assertEqual(var32.frequency, 32)

    def test_calling_variable_values(self):
        v = self._get_var_1()()
        for a, b in zip(v.values, TEST_VAR_VALUES):
            self.assertEqual(a, b)

    def test_variable_array_attribute(self):
        v = self._get_var_1()
        for a, b in zip(v.array, TEST_VAR_VALUES):
            self.assertEqual(a, b)

    def test_variable_length(self):
        v = self._get_var_1()
        self.assertEqual(len(v), len(v.array))

    def test_variable_trim(self):
        v = self._get_var_1()
        start = self.test_index_1[3]
        end = self.test_index_1[-3]
        v.trim(start, end)
        self.assertEqual(v.t0, start)
        self.assertEqual(v.t1, end)
        f = v.flag()
        self.assertEqual(f.index[0], start)
        self.assertEqual(f.index[-1], end)

    def test_recover_index(self):
        v = self._get_var_1()
        index = v.index
        self.d.add_input(v)
        for a, b in zip(self.d[v.name].index, index):
            self.assertEqual(a, b)

    def test_variable_merge_contiguous(self):
        index1 = pd.date_range(start=datetime.datetime(2000, 1, 1),
                               periods=10,
                               freq='S')

        index2 = pd.date_range(start=datetime.datetime(2000, 1, 1, 0, 0, 10),
                               periods=10,
                               freq='S')

        v1 = DecadesVariable({TEST_VAR_NAME: TEST_VAR_VALUES},
                             index=index1,
                             frequency=1)

        v2 = DecadesVariable({TEST_VAR_NAME: TEST_VAR_VALUES},
                             index=index2,
                             frequency=1)

        v1.merge(v2)

        self.assertEqual(v1.t0, index1[0])
        self.assertEqual(v1.t1, index2[-1])
        self.assertEqual(len(v1), 2 * (len(TEST_VAR_VALUES)))

    def test_variable_merge_noncontiguous(self):
        index1 = pd.date_range(start=datetime.datetime(2000, 1, 1),
                               periods=10,
                               freq='S')

        index2 = pd.date_range(start=datetime.datetime(2000, 1, 1, 0, 0, 15),
                               periods=10,
                               freq='S')

        v1 = DecadesVariable({TEST_VAR_NAME: TEST_VAR_VALUES},
                             index=index1,
                             frequency=1)

        v2 = DecadesVariable({TEST_VAR_NAME: TEST_VAR_VALUES},
                             index=index2,
                             frequency=1)

        v1.merge(v2)

        self.assertEqual(v1.t0, index1[0])
        self.assertEqual(v1.t1, index2[-1])
        self.assertEqual(len(v1), 2 * (len(TEST_VAR_VALUES)) + 5)

    def test_variable_merge_interleaved(self):
        index1 = pd.date_range(start=datetime.datetime(2000, 1, 1),
                               periods=10,
                               freq='2S')

        index2 = pd.date_range(start=datetime.datetime(2000, 1, 1, 0, 0, 1),
                               periods=10,
                               freq='2S')

        v1 = DecadesVariable({TEST_VAR_NAME: TEST_VAR_VALUES},
                             index=index1,
                             frequency=1)

        v2 = DecadesVariable({TEST_VAR_NAME: TEST_VAR_VALUES},
                             index=index2,
                             frequency=1)

        v1.merge(v2)

        self.assertEqual(v1.t0, index1[0])
        self.assertEqual(v1.t1, index2[-1])
        self.assertEqual(len(v1), 2 * (len(TEST_VAR_VALUES)))

        expected_array = []
        for i in TEST_VAR_VALUES:
            expected_array.append(i)
            expected_array.append(i)

        for a, b in zip(v1.array, expected_array):
            self.assertEqual(a, b)

    def test_infer_readers(self):
        for pattern, reader in TEST_FILE_PATTERNS.items():

            self.assertIs(DecadesDataset.infer_reader(DecadesFile(pattern)),
                          reader)

            os.remove(pattern)

    def test_files_list(self):
        patterns = list(TEST_FILE_PATTERNS.keys())
        d = DecadesDataset()
        for pattern in patterns:
            d.add_file(pattern)

        for pattern in patterns:
            self.assertIn(pattern, [i.filepath for i in d.files])

    def test_add_decades_file(self):
        patterns = list(TEST_FILE_PATTERNS.keys())

        d = DecadesDataset()
        for pattern in patterns:
            d.add_file(pattern)

        files = []
        for i in d.readers:
            files += i.files

        for _file in files:
            self.assertIn(_file.filepath, patterns)

    def test_takeoff_land_time(self):
        vals = [1, 1, 1, 1, 0, 0, 0, 1, 1, 1]
        prtaft = DecadesVariable({'PRTAFT_wow_flag': vals},
                                 index=self.test_index_1)
        self.d.add_input(prtaft)

        self.assertEqual(self.d.takeoff_time, self.test_index_1[4])
        self.assertEqual(self.d.landing_time, self.test_index_1[7])

    def test_dataset_time_bounds_inputs(self):
        v1 = DecadesVariable({'a': TEST_VAR_VALUES}, index=self.test_index_1)
        index2 = self.test_index_1 + datetime.timedelta(minutes=1)
        v2 = DecadesVariable({'b': TEST_VAR_VALUES}, index=index2)
        self.d.add_input(v1)
        self.d.add_input(v2)
        bnds = self.d.time_bounds()
        self.assertEqual(bnds[0], self.test_index_1[0])
        self.assertEqual(bnds[1], index2[-1])

    def test_dataset_time_bounds_outputs(self):
        v1 = DecadesVariable({'a': TEST_VAR_VALUES},
                             index=self.test_index_1,
                             frequency=1)
        index2 = self.test_index_1 + datetime.timedelta(minutes=1)
        v2 = DecadesVariable({'b': TEST_VAR_VALUES}, index=index2)
        self.d.add_output(v1)
        self.d.add_output(v2)
        bnds = self.d.time_bounds()
        self.assertEqual(bnds[0], self.test_index_1[0])
        self.assertEqual(bnds[1], index2[-1])

    def test_dataset_time_bounds_input_output(self):
        v1 = DecadesVariable({'a': TEST_VAR_VALUES},
                             index=self.test_index_1,
                             frequency=1)
        index2 = self.test_index_1 + datetime.timedelta(minutes=1)
        v2 = DecadesVariable({'b': TEST_VAR_VALUES}, index=index2, frequency=1)
        self.d.add_output(v1)
        self.d.add_input(v2)
        bnds = self.d.time_bounds()
        self.assertEqual(bnds[0], self.test_index_1[0])
        self.assertEqual(bnds[1], index2[-1])

    def test_add_input_variable(self):
        self.d.add_input(self.v)
        self.assertIn(self.v, self.d._backend.inputs)

    def test_add_output_variable(self):
        self.d.add_output(self.v)
        self.assertIn(self.v, self.d._backend.outputs)

    def test_list_variables(self):
        v1 = DecadesVariable({'a': TEST_VAR_VALUES},
                             index=self.test_index_1,
                             frequency=1)
        v2 = DecadesVariable({'b': TEST_VAR_VALUES},
                             index=self.test_index_1,
                             frequency=1)

        self.d.add_input(v1)
        self.d.add_output(v2)

        self.assertIn(v1.name, self.d.variables)
        self.assertIn(v2.name, self.d.variables)

    def test_remove_variable(self):
        self.d.add_input(self.v)
        self.d.remove(self.v.name)
        self.assertEqual(self.d.variables, [])

        self.d.add_output(self.v)
        self.d.remove(self.v.name)
        self.assertEqual(self.d.variables, [])

    def test_add_constant(self):
        self.d.add_constant('LTUAE', 42)
        self.assertEqual(self.d['LTUAE'], 42)

    def test_lazy_constant_item(self):
        value = self.d.lazy['LTUAE']
        self.d.add_constant('LTUAE', 42)
        self.assertEqual(value(), 42)
        self.assertEqual(self.d.lazy['LTUAE'], 42)

    def test_outputs_list(self):
        v1 = self.v
        v2 = DecadesVariable({'v2': TEST_VAR_VALUES},
                             index=self.test_index_1,
                             frequency=1)
        self.d.add_output(v1)
        self.d.add_output(v2)
        self.assertIn(v1, self.d.outputs)
        self.assertIn(v2, self.d.outputs)

    def test_clear_outputs(self):
        v1 = self.v
        v2 = DecadesVariable({'v2': TEST_VAR_VALUES},
                             index=self.test_index_1,
                             frequency=1)
        self.d.add_output(v1)
        self.d.add_output(v2)
        self.d.clear_outputs()
        self.assertEqual(self.d.outputs, [])

    def test_add_global(self):
        self.assertRaises(NonStandardAttributeError,
                          lambda: self.d.add_global('LTUAE', 42))
        self.d.globals.strict = False
        self.d.add_global('LTUAE', 42)
        self.assertEqual(self.d.globals()['LTUAE'], 42)

    def test_add_interpolated_global(self):
        self.d.globals.strict = False
        self.d.add_global('one', 2)
        self.d.add_global('two', '{one}')
        self.d._interpolate_globals()
        self.assertEqual(self.d.globals()['two'], '2')

    def test_add_data_global(self):
        self.d.add_output(self.v)
        self.d.globals.strict = False
        self.d.add_global('test1', f'<data {TEST_VAR_NAME} max>')
        self.assertEqual(self.d.globals()['test1'], max(TEST_VAR_VALUES))
        self.d.add_global('test2', f'<call datetime.date.today>')
        self.assertEqual(self.d.globals()['test2'], datetime.date.today())