def test_set_start_updates_indexes(self): model = TimeSeriesModelFixedResolution( TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [2.3, -5.0], True, False) ) model.set_start(dateutil.parser.parse("1975-07-07T06:33")) self.assertEqual(model.value, TimeSeriesFixedResolution("1975-07-07T06:33", "2h", [2.3, -5.0], True, False)) self.assertEqual(model.indexes, np.array(["1975-07-07T06:33", "1975-07-07T08:33"], dtype="datetime64"))
def test_cannot_remove_all_rows(self): model = TimeSeriesModelFixedResolution( TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [2.3, -5.0, 7.0], True, False) ) self.assertTrue(model.removeRows(0, 3)) self.assertEqual(model.value, TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [2.3], True, False)) self.assertEqual(model.indexes, np.array(["2019-07-05T12:00"], dtype="datetime64"))
def test_removeRows_from_the_middle(self): model = TimeSeriesModelFixedResolution( TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [2.3, -5.0, 7.0], True, False) ) self.assertTrue(model.removeRows(1, 1)) self.assertEqual(model.value, TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [2.3, 7.0], True, False)) self.assertEqual(model.indexes, np.array(["2019-07-05T12:00", "2019-07-05T14:00"], dtype="datetime64"))
def test_value_access(self): editor = TimeSeriesFixedResolutionEditor() editor.set_value( TimeSeriesFixedResolution("1996-04-06T16:06", "3 days", [4.0, 3.5, 3.0], True, True)) self.assertEqual( editor.value(), TimeSeriesFixedResolution("1996-04-06T16:06", "3 days", [4.0, 3.5, 3.0], True, True))
def test_batch_set_data(self): model = TimeSeriesModelFixedResolution( TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [2.3, -5.0, 7.0], True, False) ) indexes = [model.index(0, 0), model.index(1, 1), model.index(2, 1)] values = ["1999-01-01T12:00", 55.5, -55.5] model.batch_set_data(indexes, values) expected = TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [2.3, 55.5, -55.5], True, False) self.assertEqual(model.value, expected)
def test_set_resolution_updates_indexes(self): model = TimeSeriesModelFixedResolution( TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [2.3, -5.0], True, False) ) model.set_resolution([relativedelta(minutes=4)]) self.assertEqual( model.value, TimeSeriesFixedResolution("2019-07-05T12:00", "4 minutes", [2.3, -5.0], True, False) ) self.assertEqual(model.indexes, np.array(["2019-07-05T12:00", "2019-07-05T12:04"], dtype="datetime64"))
def test_setData(self): model = TimeSeriesModelFixedResolution( TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [2.3, -5.0], True, False) ) model_index = model.index(0, 1) model.setData(model_index, -4.0) self.assertEqual( model.value, TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [-4.0, -5.0], True, False) )
def test_reset_updates_indexes(self): model = TimeSeriesModelFixedResolution( TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [2.3, -5.0], True, False) ) model.reset(TimeSeriesFixedResolution("1991-01-01T13:30", "3 months", [7.0, -4.0], False, True)) self.assertEqual( model.value, TimeSeriesFixedResolution("1991-01-01T13:30", "3 months", [7.0, -4.0], False, True) ) self.assertEqual(model.indexes, np.array(["1991-01-01T13:30", "1991-04-01T13:30"], dtype="datetime64"))
def test_insertRows_single_row_in_the_middle(self): model = TimeSeriesModelFixedResolution( TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [-5.0, 7.0], True, False) ) self.assertTrue(model.insertRows(1, 1)) self.assertEqual( model.value, TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [-5.0, 0.0, 7.0], True, False) ) self.assertEqual( model.indexes, np.array(["2019-07-05T12:00", "2019-07-05T14:00", "2019-07-05T16:00"], dtype="datetime64") )
def test_insertRows_at_the_beginning(self): model = TimeSeriesModelFixedResolution( TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [-5.0, 7.0], True, False) ) self.assertTrue(model.insertRows(0, 1)) self.assertEqual( model.value, TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [0.0, -5.0, 7.0], True, False) ) np.testing.assert_equal( model.indexes, np.array(["2019-07-05T12:00", "2019-07-05T14:00", "2019-07-05T16:00"], dtype="datetime64") )
def insertRows(self, row, count, parent=QModelIndex()): """ Inserts new values to the series. The new values are set to zero. Start time or resolution are left unchanged. Args: row (int): a numeric index to the first stamp/value to insert count (int): number of stamps/values to insert parent (QModelIndex): index to a parent model Returns: True if the operation was successful """ self.beginInsertRows(parent, row, row + count - 1) old_values = self._value.values if row == len(old_values): new_values = np.append(old_values, np.zeros(count)) else: new_values = np.insert(old_values, row, np.zeros(count)) self._value = TimeSeriesFixedResolution(self._value.start, self._value.resolution, new_values, self._value.ignore_year, self._value.repeat) self._index_cache = self._value.indexes self.endInsertRows() return True
def removeRows(self, row, count, parent=QModelIndex()): """ Removes values from the series. Args: row (int): a numeric index to the series where to begin removing count (int): how many stamps/values to remove parent (QModelIndex): an index to the parent model Returns: True if the operation was successful. """ if len(self._value) == 1: return False if count == len(self._value): count = len(self._value) - 1 row = 1 self.beginRemoveRows(parent, row, row + count - 1) old_values = self._value.values remove_indexes = range(row, row + count) if count > 1 else row new_values = np.delete(old_values, remove_indexes) self._value = TimeSeriesFixedResolution(self._value.start, self._value.resolution, new_values, self._value.ignore_year, self._value.repeat) self._index_cache = self._value.indexes self.endRemoveRows() return True
def setUp(self): QApplication.clipboard().clear() self._table_view = TimeSeriesFixedResolutionTableView(parent=None) series = TimeSeriesFixedResolution("2019-08-08T15:00", "1h", [1.1, 2.2, 3.3, 4.4], False, False) model = TimeSeriesModelFixedResolution(series) self._table_view.setModel(model)
def test_indexes(self): # pylint: disable=no-self-use model = TimeSeriesModelFixedResolution( TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [-5.0, 7.0], True, False) ) numpy.testing.assert_equal( model.indexes, numpy.array(["2019-07-05T12:00", "2019-07-05T14:00"], dtype='datetime64') )
def test_initial_value(self): editor = TimeSeriesFixedResolutionEditor() value = editor.value() self.assertEqual( value, TimeSeriesFixedResolution("2000-01-01T00:00", "1 hour", [0.0, 0.0], False, False))
def test_editor_sets_fixed_resolution_time_series_in_parent_model(self): start = dateutil.parser.parse("2019-07-03T12:22") resolution = [duration_to_relativedelta("4 years")] values = np.array([23.0, 5.0]) time_series = TimeSeriesFixedResolution(start, resolution, values, False, True) self._check_parent_model_updated_when_closed(time_series)
def test_flags(self): model = TimeSeriesModelFixedResolution( TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [-5.0, 7.0], True, False) ) model_index = model.index(0, 0) self.assertEqual(model.flags(model_index), Qt.ItemIsSelectable | Qt.ItemIsEnabled) model_index = model.index(0, 1) self.assertEqual(model.flags(model_index), Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable)
def test_time_series_in_edit_role(self): value = TimeSeriesFixedResolution("2019-07-12T08:00", "7 hours", [1.1, 2.2, 3.3], False, False) self.db_mngr.get_item.return_value = {"value": to_database(value)} formatted = self.get_value(Qt.EditRole) self.assertEqual(formatted, to_database(value)) value = TimeSeriesVariableResolution(["2019-07-12T08:00", "2019-07-12T16:00"], [0.0, 100.0], False, False) self.db_mngr.get_item.return_value = {"value": to_database(value)} formatted = self.get_value(Qt.EditRole) self.assertEqual(formatted, to_database(value))
def test_data(self): model = TimeSeriesModelFixedResolution( TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [-5.0, 7.0], True, False) ) for role in [Qt.DisplayRole, Qt.EditRole]: model_index = model.index(0, 0) self.assertEqual(model.data(model_index, role), "2019-07-05T12:00:00") model_index = model.index(0, 1) self.assertEqual(model.data(model_index, role), -5.0)
def test_time_series_in_tool_tip_role(self): value = TimeSeriesFixedResolution("2019-07-12T08:00", ["7 hours", "12 hours"], [1.1, 2.2, 3.3], False, False) self.db_mngr.get_item.return_value = {"value": to_database(value)} formatted = self.get_value(Qt.ToolTipRole) self.assertEqual(formatted, "Start: 2019-07-12 08:00:00, resolution: [7h, 12h], length: 3") value = TimeSeriesVariableResolution(["2019-07-12T08:00", "2019-07-12T16:00"], [0.0, 100.0], False, False) self.db_mngr.get_item.return_value = {"value": to_database(value)} formatted = self.get_value(Qt.ToolTipRole) self.assertEqual(formatted, "Start: 2019-07-12T08:00:00, resolution: variable, length: 2")
def test_paste_value_when_time_stamp_is_selected(self): selection_model = self._table_view.selectionModel() model = self._table_view.model() selection_model.select(model.index(0, 0), QItemSelectionModel.Select) copied_data = locale.str(-1.1) QApplication.clipboard().setText(copied_data) self._table_view.paste() series = TimeSeriesFixedResolution("2019-08-08T15:00", "1h", [-1.1, 2.2, 3.3, 4.4], False, False) self.assertEqual(model.value, series)
def test_pasting_to_last_row_expands_model(self): selection_model = self._table_view.selectionModel() model = self._table_view.model() selection_model.select(model.index(3, 1), QItemSelectionModel.Select) copied_data = locale.str(-4.4) + '\n' + locale.str(-5.5) QApplication.clipboard().setText(copied_data) self._table_view.paste() series = TimeSeriesFixedResolution("2019-08-08T15:00", "1h", [1.1, 2.2, 3.3, -4.4, -5.5], False, False) self.assertEqual(model.value, series)
def test_paste_to_larger_selection_overrides_first_rows_only(self): selection_model = self._table_view.selectionModel() model = self._table_view.model() selection_model.select(model.index(0, 1), QItemSelectionModel.Select) selection_model.select(model.index(1, 1), QItemSelectionModel.Select) copied_data = locale.str(-1.1) QApplication.clipboard().setText(copied_data) self._table_view.paste() series = TimeSeriesFixedResolution("2019-08-08T15:00", "1h", [-1.1, 2.2, 3.3, 4.4], False, False) self.assertEqual(model.value, series)
def test_paste_to_multirow_selection_limits_pasted_data(self): selection_model = self._table_view.selectionModel() model = self._table_view.model() selection_model.select(model.index(0, 1), QItemSelectionModel.Select) selection_model.select(model.index(1, 1), QItemSelectionModel.Select) copied_data = locale.str(-1.1) + '\n' + locale.str( -2.2) + '\n' + locale.str(-3.3) QApplication.clipboard().setText(copied_data) self._table_view.paste() series = TimeSeriesFixedResolution("2019-08-08T15:00", "1h", [-1.1, -2.2, 3.3, 4.4], False, False) self.assertEqual(model.value, series)
def test_remove_rows_with_time_series_fixed_resolution_editor(self): editor = TimeSeriesFixedResolutionEditor() editor.set_value(TimeSeriesFixedResolution("2020-11-11T14:25", "1D", [-1.1, -2.2], False, False)) table_view = editor._ui.time_series_table table_view.selectRow(0) model = table_view.model() rect = table_view.visualRect(model.index(0, 0)) menu = ArrayTableContextMenu(editor, table_view, rect.center()) remove_action = _find_action(menu, "Remove rows") self.assertIsNotNone(remove_action) remove_action.trigger() self.assertEqual(model.rowCount(), 1 + 1) self.assertEqual(model.index(0, 0).data(), "2020-11-11T14:25:00") self.assertEqual(model.index(0, 1).data(), -2.2)
def test_insert_row_before_with_time_series_fixed_resolution_editor(self): editor = TimeSeriesFixedResolutionEditor() editor.set_value(TimeSeriesFixedResolution("2020-11-11T14:25", "1D", [-1.1], False, False)) table_view = editor._ui.time_series_table table_view.selectRow(0) model = table_view.model() rect = table_view.visualRect(model.index(0, 0)) menu = IndexedValueTableContextMenu(table_view, rect.center()) insert_action = _find_action(menu, "Insert row before") self.assertIsNotNone(insert_action) insert_action.trigger() self.assertEqual(model.rowCount(), 2 + 1) self.assertEqual(model.index(0, 0).data(), "2020-11-11T14:25:00") self.assertEqual(model.index(0, 1).data(), 0.0) self.assertEqual(model.index(1, 0).data(), "2020-11-12T14:25:00") self.assertEqual(model.index(1, 1).data(), -1.1)
def _change_parameter_type(self, selector_index): """ Handles switching between value types. Does a rude conversion between fixed and variable resolution time series. In other cases, a default 'empty' value is used. Args: selector_index (int): an index to the selector combo box """ old_index = self._ui.editor_stack.currentIndex() if (selector_index == self._editor_indexes[ ValueType.TIME_SERIES_VARIABLE_RESOLUTION] and old_index == self._editor_indexes[ValueType.TIME_SERIES_FIXED_RESOLUTION]): fixed_resolution_value = self._editors[ ValueType.TIME_SERIES_FIXED_RESOLUTION].value() stamps = fixed_resolution_value.indexes values = fixed_resolution_value.values variable_resolution_value = TimeSeriesVariableResolution( stamps, values, fixed_resolution_value.ignore_year, fixed_resolution_value.repeat) self._editors[ValueType.TIME_SERIES_VARIABLE_RESOLUTION].set_value( variable_resolution_value) elif (selector_index == self._editor_indexes[ValueType.TIME_SERIES_FIXED_RESOLUTION] and old_index == self._editor_indexes[ ValueType.TIME_SERIES_VARIABLE_RESOLUTION]): variable_resolution_value = self._editors[ ValueType.TIME_SERIES_VARIABLE_RESOLUTION].value() stamps = variable_resolution_value.indexes start = stamps[0] difference = stamps[1] - start resolution = [duration_to_relativedelta(str(difference))] fixed_resolution_value = TimeSeriesFixedResolution( start, resolution, variable_resolution_value.values, variable_resolution_value.ignore_year, variable_resolution_value.repeat, ) self._editors[ValueType.TIME_SERIES_FIXED_RESOLUTION].set_value( fixed_resolution_value) self._ui.editor_stack.setCurrentIndex(selector_index) if selector_index == self._editor_indexes[ValueType.PLAIN_VALUE]: self._editors[ValueType.PLAIN_VALUE].set_value("")
def __init__(self, parent=None): from ..ui.time_series_fixed_resolution_editor import Ui_TimeSeriesFixedResolutionEditor super().__init__(parent) start = datetime(year=2000, month=1, day=1) resolution = [duration_to_relativedelta("1 hour")] values = 2 * [0.0] initial_value = TimeSeriesFixedResolution(start, resolution, values, False, False) self._model = TimeSeriesModelFixedResolution(initial_value) self._model.dataChanged.connect(self._update_plot) self._model.modelReset.connect(self._update_plot) self._model.rowsInserted.connect(self._update_plot) self._model.rowsRemoved.connect(self._update_plot) self._ui = Ui_TimeSeriesFixedResolutionEditor() self._ui.setupUi(self) self._plot_widget = PlotWidget() self._ui.splitter.insertWidget(1, self._plot_widget) self._ui.start_time_edit.setText(str(initial_value.start)) self._ui.start_time_edit.editingFinished.connect( self._start_time_changed) self._ui.calendar_button.clicked.connect(self._show_calendar) self._ui.resolution_edit.setText( _resolution_to_text(initial_value.resolution)) self._ui.resolution_edit.editingFinished.connect( self._resolution_changed) self._time_series_table = TimeSeriesFixedResolutionTableView( self._ui.splitter) self._ui.left_layout.addWidget(self._time_series_table) self._time_series_table.setModel(self._model) self._time_series_table.setContextMenuPolicy(Qt.CustomContextMenu) self._time_series_table.customContextMenuRequested.connect( self._show_table_context_menu) self._ui.ignore_year_check_box.setChecked( self._model.value.ignore_year) self._ui.ignore_year_check_box.toggled.connect( self._model.set_ignore_year) self._ui.repeat_check_box.setChecked(self._model.value.repeat) self._ui.repeat_check_box.toggled.connect(self._model.set_repeat) self._calendar = QCalendarWidget(self) self._calendar.setMinimumDate(QDate(100, 1, 1)) self._calendar.setWindowFlags(Qt.Popup) self._calendar.activated.connect(self._select_date) self._update_plot()
def test_removing_last_row_fails(self): model = TimeSeriesModelFixedResolution( TimeSeriesFixedResolution("2019-07-05T12:00", "2 hours", [2.3], True, False)) self.assertFalse(model.removeRows(0, 1))