from typing import Union
import casadi as ca
import numpy as np
[docs]
class Timeseries:
"""
Time series object, bundling time stamps with values.
"""
[docs]
def __init__(self, times: np.ndarray, values: Union[float, np.ndarray, list, ca.DM]):
"""
Create a new time series object.
:param times: Iterable of time stamps.
:param values: Iterable of values.
"""
self.__times = times
if isinstance(values, ca.DM):
# Note that a ca.DM object has no __iter__ attribute, which we
# want it to have. We also want it to store it as a _flat_ array,
# not a 2-D column vector.
assert values.shape[0] == 1 or values.shape[1] == 1, "Only 1D ca.DM objects supported"
values = values.toarray().ravel()
elif isinstance(values, (np.ndarray, list)) and len(values) == 1:
values = values[0]
if hasattr(values, "__iter__"):
self.__values = np.array(values, dtype=np.float64, copy=True)
else:
self.__values = np.full_like(times, values, dtype=np.float64)
@property
def times(self) -> np.ndarray:
"""
Array of time stamps.
"""
return self.__times
@property
def values(self) -> np.ndarray:
"""
Array of values.
"""
return self.__values
def __neg__(self) -> "Timeseries":
return self.__class__(self.times, -self.values)
def __repr__(self) -> str:
return "Timeseries({}, {})".format(self.__times, self.__values)
def __eq__(self, other: "Timeseries") -> bool:
return np.array_equal(self.times, other.times) and np.array_equal(self.values, other.values)