Improved TSC.get

This commit is contained in:
Gourav Kumar 2022-04-24 23:47:27 +05:30
parent c99ffe02d0
commit 978566e0a8
2 changed files with 56 additions and 24 deletions

View File

@ -19,7 +19,7 @@ Fincal aims to simplify things by allowing you to:
## To-do ## To-do
### Core features ### Core features
- [ ] Add __setitem__ - [x] Add __setitem__
- [ ] Create emtpy TimeSeries object - [ ] Create emtpy TimeSeries object
- [x] Read from CSV - [x] Read from CSV
- [ ] Write to CSV - [ ] Write to CSV

View File

@ -6,7 +6,7 @@ import warnings
from collections import UserList from collections import UserList
from dataclasses import dataclass from dataclasses import dataclass
from numbers import Number from numbers import Number
from typing import Callable, Iterable, List, Literal, Mapping, Sequence, Type from typing import Any, Callable, Iterable, List, Literal, Mapping, Sequence, Type
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
@ -765,39 +765,71 @@ class TimeSeriesCore:
raise NotImplementedError("This operation is not supported.") raise NotImplementedError("This operation is not supported.")
@date_parser(1) @date_parser(1)
def get(self, date: str | datetime.datetime, default=None, closest=None, raise_error: bool = False): def get(
self,
date: str | datetime.datetime,
default: Any = None,
closest: Literal["previous", "next"] = None,
limit: int = 1000,
raise_error: bool = False,
) -> tuple | Any:
"""Get a value for a particular key. Return a default value on KeyError
Parameters
----------
date:
Date for which the value needs to be fetched.
default: Optional, Default None
Default value to be returned in case the date is not found. Default None.
closest:
Look for previous or next value when date is not found.
If not specified, the value set in FincalOptions is used
limit:
Maximum number of days to look for the closest available date.
If exceeded without finding a date, default value will be returned.
raise_error : bool, optional
Whether to raise an error and ignore the default value.
Meant for use with __getitem__.
Returns
-------
tuple | Any
_description_
Raises
------
ValueError
If the argument for closest is not valid.
KeyError
if raise_error is true and date is not found
"""
if closest is None: if closest is None:
closest = FincalOptions.get_closest closest = FincalOptions.get_closest
if closest == "exact": time_delta_dict = {"exact": 0, "previous": -1, "next": 1}
# try:
# item = self.data[date]
# return date, item
# except KeyError:
# if raise_error:
# raise KeyError(date)
# return default if closest not in time_delta_dict:
delta = 0
elif closest == "previous":
delta = datetime.timedelta(-1)
elif closest == "next":
delta = datetime.timedelta(1)
else:
raise ValueError(f"Invalid argument from closest {closest!r}") raise ValueError(f"Invalid argument from closest {closest!r}")
delta = relativedelta(days=time_delta_dict[closest])
while True: for _ in range(limit):
try: try:
item = self.data[date] return date, self.data[date]
return date, item
except KeyError: except KeyError:
if delta == 0: if not delta:
if raise_error: break
raise KeyError(date)
return default
date += delta date += delta
if raise_error:
raise KeyError(date)
return default
@property @property
def iloc(self) -> Mapping: def iloc(self) -> Mapping:
"""Returns an item or a set of items based on index """Returns an item or a set of items based on index