Source code for curvesim.iterators.price_samplers.price_volume
from typing import Iterator
from curvesim.logging import get_logger
from curvesim.price_data import get
from curvesim.templates.price_samplers import PriceSample, PriceSampler
from curvesim.utils import dataclass, override
logger = get_logger(__name__)
[docs]@dataclass(slots=True)
class PriceVolumeSample(PriceSample):
"""
Attributes
-----------
timestamp : datetime.datetime
Timestamp for the current price/volume.
prices : dict
Price for each pairwise coin combination.
volumes : dict
Volume for each pairwise coin combination.
"""
volumes: dict
[docs]class PriceVolume(PriceSampler):
"""
An iterator that retrieves price/volume and iterates over timepoints in the data.
"""
[docs] def __init__(
self,
assets,
*,
days=60,
data_dir="data",
src="coingecko",
end=None,
):
"""
Retrieves price/volume data and prepares it for iteration.
Parameters
----------
assets: SimAssets
Object giving the properties of the assets for simulation
(e.g., symbols, addresses, chain)
days: int, defaults to 60
Number of days to pull data for.
data_dir: str, defaults to "data"
Relative path to saved data folder.
src: str, defaults to "coingecko"
Identifies pricing source: coingecko or local.
"""
prices, volumes, _ = get(
assets.addresses,
chain=assets.chain,
days=days,
data_dir=data_dir,
src=src,
end=end,
)
self.prices = prices.set_axis(assets.symbol_pairs, axis="columns")
self.volumes = volumes.set_axis(assets.symbol_pairs, axis="columns")
[docs] @override
def __iter__(self) -> Iterator[PriceVolumeSample]:
"""
Yields
-------
:class:`PriceVolumeSample`
"""
for price_row, volume_row in zip(
self.prices.iterrows(), self.volumes.iterrows()
):
price_timestamp, prices = price_row
volume_timestamp, volumes = volume_row
assert (
price_timestamp == volume_timestamp
), "Price/volume timestamps don't match"
prices = prices.to_dict()
volumes = volumes.to_dict()
yield PriceVolumeSample(price_timestamp, prices, volumes) # type:ignore