48 lines
1.2 KiB
Python
48 lines
1.2 KiB
Python
import logging
|
|
from collections import OrderedDict
|
|
from datetime import datetime
|
|
from typing import Any
|
|
|
|
import pandas as pd
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
MAX_CACHE_SIZE = 100
|
|
|
|
_price_data_cache: OrderedDict[str, tuple[pd.DataFrame, datetime]] = OrderedDict()
|
|
|
|
|
|
def get_cached_price_data(ticker: str) -> pd.DataFrame | None:
|
|
if ticker not in _price_data_cache:
|
|
return None
|
|
|
|
df, timestamp = _price_data_cache[ticker]
|
|
|
|
_price_data_cache.move_to_end(ticker)
|
|
|
|
return df.copy()
|
|
|
|
|
|
def set_cached_price_data(ticker: str, data: pd.DataFrame) -> None:
|
|
global _price_data_cache
|
|
|
|
if ticker in _price_data_cache:
|
|
_price_data_cache.move_to_end(ticker)
|
|
_price_data_cache[ticker] = (data.copy(), datetime.now())
|
|
return
|
|
|
|
while len(_price_data_cache) >= MAX_CACHE_SIZE:
|
|
_price_data_cache.popitem(last=False)
|
|
|
|
_price_data_cache[ticker] = (data.copy(), datetime.now())
|
|
logger.debug(
|
|
"Cached price data for %s (cache size: %d)", ticker, len(_price_data_cache)
|
|
)
|
|
|
|
|
|
def clear_run_cache() -> None:
|
|
global _price_data_cache
|
|
count = len(_price_data_cache)
|
|
_price_data_cache.clear()
|
|
logger.debug("Cleared run cache (%d entries removed)", count)
|