From aeeb639fe27af5f6bfad761626fd38a4abebb138 Mon Sep 17 00:00:00 2001 From: Giulio De Pasquale Date: Thu, 16 Oct 2025 12:17:56 +0100 Subject: [PATCH] refactor(data): restructure TimeSeriesTickerData to use series list and add helper methods --- paperone/data.py | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/paperone/data.py b/paperone/data.py index a1134ec..8fa132f 100644 --- a/paperone/data.py +++ b/paperone/data.py @@ -1,4 +1,4 @@ -from dataclasses import dataclass +from dataclasses import dataclass, field from datetime import datetime from typing import List @@ -11,15 +11,46 @@ class TickerData: low: float high: float avg: float - volume: float + volume: int @dataclass class TimeSeriesTickerData: ticker: str - target_date: datetime - current_day_data: TickerData - past_30d_data: List[TickerData] + series: List[TickerData] = field(default_factory=list) + + @staticmethod + def build_time_series_ticker_data( + ticker: str, all_data: List[TickerData] + ): + ordered = sorted({d.date: d for d in all_data}.values(), key=lambda d: d.date) + + return TimeSeriesTickerData( + ticker=ticker, + series=ordered, + ) + + def get_by_date(self, dt: datetime) -> TickerData | None: + for d in self.series: + if d.date == dt: + return d + + return None + + def get_latest(self) -> TickerData | None: + if not self.series: + return None + + return self.series[-1] + + def get_range(self, start_date: datetime, end_date: datetime) -> List[TickerData]: + return [d for d in self.series if start_date <= d.date <= end_date] + + @property + def target_date_data(self) -> TickerData | None: + """Return the most recent TickerData (by convention, the target date tick).""" + return self.get_latest() + @dataclass