Coverage for foxplot / hot_series.py: 88%
24 statements
« prev ^ index » next coverage.py v7.14.0, created at 2026-05-15 10:53 +0000
« prev ^ index » next coverage.py v7.14.0, created at 2026-05-15 10:53 +0000
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3#
4# SPDX-License-Identifier: Apache-2.0
6"""Series data unpacked from input dictionaries."""
8from typing import Any, Dict
10import numpy as np
12from .labeled_series import LabeledSeries
13from .series import Series
16class HotSeries(LabeledSeries):
17 """Indexed time-series in which we can still insert values.
19 Internally, this datastructure maps time indexes (the corresponding times
20 themselves are stored in a different list) to values.
21 """
23 __indexed_values: Dict[int, Any]
25 def __init__(self, label: str):
26 """Initialize a new indexed series.
28 Args:
29 label: Label of the series in the input data.
30 """
31 super().__init__(label)
32 self.__indexed_values = {}
34 def __len__(self):
35 """Length of the indexed series."""
36 return len(self.__indexed_values)
38 def __repr__(self):
39 """String representation of the series."""
40 values = list(self.__indexed_values.values())
41 return f"Time series with values: {values}"
43 def _update(self, index: int, value: Any) -> None:
44 """Update the value at a given time index.
46 Args:
47 index: Time index.
48 value: New value.
49 """
50 self.__indexed_values[index] = value
52 def _freeze(self, max_index: int) -> Series:
53 """Get indexed series as a list of values.
55 Args:
56 max_index: The output list will range from 0 (first time from the
57 input) to this maximum index (excluded).
59 Returns:
60 Indexed series as a list of values.
61 """
62 last_value = None
63 values = []
64 for index in range(max_index):
65 last_value = self.__indexed_values.get(index, last_value)
66 values.append(last_value)
67 array = (
68 np.array(values, dtype=np.float64)
69 if isinstance(last_value, (int, float))
70 else np.array(values)
71 )
72 return Series(label=self._label, values=array, times=None)