Source code for curvesim.iterators.price_samplers.price_volume
"""
Contains PriceVolume price sampler and PriceVolumeSample dataclass.
"""
from typing import Iterator
from pandas import DataFrame
from curvesim.logging import get_logger
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):
"""
Iterates over price and volume data in the provided DataFrame.
"""
[docs] def __init__(self, data: DataFrame):
"""
Parameters
----------
data: DataFrame
DataFrame with prices and volumes for each asset pair.
Format should match output of :fun:"curvesim.price_data.get_price_data".
Row indices: datetime.datetime or pandas.Timestamp.
Column indices: MultIndex with "price" and "volume" level 1 for each tuple
of symbols in level 2.
"""
self.data = data
[docs] @override
def __iter__(self) -> Iterator[PriceVolumeSample]:
"""
Yields
-------
:class:`PriceVolumeSample`
"""
for row in self.data.iterrows():
timestamp, row_data = row
prices = row_data["price"].to_dict()
volumes = row_data["volume"].to_dict()
yield PriceVolumeSample(timestamp, prices, volumes) # type:ignore
@property
def prices(self):
"""
Returns price data for all asset pairs.
Returns
-------
pandas.DataFrame
"""
return self.data["price"]
@property
def volumes(self):
"""
Returns volume data for all asset pairs.
Returns
-------
pandas.DataFrame
"""
return self.data["volume"]