Added frequencies as classes
This commit is contained in:
parent
115e667bde
commit
1f2b75282b
@ -1,13 +1,58 @@
|
||||
import datetime
|
||||
from typing import Any, Dict, Iterable, List, Union
|
||||
from dataclasses import dataclass
|
||||
from typing import List
|
||||
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
|
||||
@dataclass
|
||||
class Options:
|
||||
date_format: str = '%Y-%m-%d'
|
||||
closest: str = 'before' # after
|
||||
|
||||
|
||||
class Frequency:
|
||||
def __init__(self, name, interval_type, interval_value, interval_days_value):
|
||||
self.name = name
|
||||
self.type = interval_type
|
||||
self.value = interval_value
|
||||
self.days = interval_days_value
|
||||
|
||||
def __repr__(self):
|
||||
return f"Frequency({self.name}, {self.type}, {self.value}, {self.days})"
|
||||
|
||||
|
||||
class AllFrequencies:
|
||||
D = Frequency('daily', 'days', 1, 1)
|
||||
W = Frequency('weekly', 'days', 7, 7)
|
||||
M = Frequency('monthly', 'months', 1, 30)
|
||||
Q = Frequency('quarterly', 'months', 3, 91)
|
||||
H = Frequency('half-yearly', 'months', 6, 182)
|
||||
Y = Frequency('annual', 'years', 1, 365)
|
||||
|
||||
|
||||
def create_date_series(
|
||||
start_date: datetime.datetime,
|
||||
end_date: datetime.datetime,
|
||||
frequency: Frequency
|
||||
) -> List[datetime.datetime]:
|
||||
"""Creates a date series using a frequency"""
|
||||
|
||||
print(f"{start_date=}, {end_date=}")
|
||||
datediff = (end_date - start_date).days/frequency.days+1
|
||||
dates = []
|
||||
|
||||
for i in range(0, int(datediff)):
|
||||
diff = {frequency.type: frequency.value*i}
|
||||
dates.append(start_date + relativedelta(**diff))
|
||||
|
||||
return dates
|
||||
|
||||
|
||||
class TimeSeries:
|
||||
"""Container for TimeSeries objects"""
|
||||
|
||||
def __init__(self, data: List[tuple], date_format: str = "%Y-%m-%d", frequency="infer"):
|
||||
def __init__(self, data: List[tuple], date_format: str = "%Y-%m-%d", frequency="D"):
|
||||
"""Instantiate a TimeSeries object
|
||||
|
||||
Parameters
|
||||
@ -35,6 +80,7 @@ class TimeSeries:
|
||||
print("Warning: The input data contains duplicate dates which have been ignored.")
|
||||
self.start_date = list(self.time_series)[0]
|
||||
self.end_date = list(self.time_series)[-1]
|
||||
self.frequency = getattr(AllFrequencies, frequency)
|
||||
|
||||
def __repr__(self):
|
||||
if len(self.time_series) > 6:
|
||||
@ -80,7 +126,7 @@ class TimeSeries:
|
||||
cur_val = self.time_series[cur_date]
|
||||
except KeyError:
|
||||
pass
|
||||
new_ts.update({cur_date: cur_val})
|
||||
new_ts.update({cur_date: cur_val}) # type: ignore
|
||||
|
||||
if inplace:
|
||||
self.time_series = new_ts
|
||||
@ -98,7 +144,7 @@ class TimeSeries:
|
||||
cur_val = self.time_series[cur_date]
|
||||
except KeyError:
|
||||
pass
|
||||
new_ts.update({cur_date: cur_val})
|
||||
new_ts.update({cur_date: cur_val}) # type: ignore
|
||||
|
||||
if inplace:
|
||||
self.time_series = new_ts
|
||||
@ -161,3 +207,17 @@ class TimeSeries:
|
||||
rolling_returns.append((i, returns))
|
||||
self.rolling_returns = rolling_returns
|
||||
return self.rolling_returns
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
date_series = [
|
||||
datetime.datetime(2020, 1, 1),
|
||||
datetime.datetime(2020, 1, 2),
|
||||
datetime.datetime(2020, 1, 3),
|
||||
datetime.datetime(2020, 1, 4),
|
||||
datetime.datetime(2020, 1, 7),
|
||||
datetime.datetime(2020, 1, 8),
|
||||
datetime.datetime(2020, 1, 9),
|
||||
datetime.datetime(2020, 1, 10),
|
||||
datetime.datetime(2020, 1, 12),
|
||||
]
|
||||
|
BIN
requirements.txt
Normal file
BIN
requirements.txt
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user