WIP: Fix Aggregazione market Product #67

Draft
Simo93-rgb wants to merge 13 commits from 62-aggregazione-market-product-non-corretta into main
2 changed files with 3 additions and 15 deletions
Showing only changes of commit 192adec7d0 - Show all commits

View File

@@ -96,9 +96,6 @@ class MarketAPIsTool(MarketWrapper, Toolkit):
and combines the data using volume-weighted average price (VWAP) to provide and combines the data using volume-weighted average price (VWAP) to provide
the most accurate and comprehensive price data. the most accurate and comprehensive price data.
Use this when you need highly reliable price data from multiple sources.
Warning: This uses more API calls (4x) than get_product().
Args: Args:
asset_id (str): The asset ID to retrieve information for (e.g., "BTC", "ETH"). asset_id (str): The asset ID to retrieve information for (e.g., "BTC", "ETH").
@@ -108,15 +105,8 @@ class MarketAPIsTool(MarketWrapper, Toolkit):
Raises: Raises:
Exception: If all providers fail to return results. Exception: If all providers fail to return results.
Example:
>>> tool.get_product_aggregated("BTC")
ProductInfo(symbol="BTC", price=45123.50, provider="Binance, YFinance, Coinbase", ...)
""" """
# try_call_all returns dict[str, ProductInfo] where key is provider name return self.get_products_aggregated([asset_id])[0]
# We need list[ProductInfo] for aggregation, so we extract values
all_products = self.handler.try_call_all(lambda w: w.get_product(asset_id))
return ProductInfo.aggregate_single_asset(all_products)
def get_products_aggregated(self, asset_ids: list[str]) -> list[ProductInfo]: def get_products_aggregated(self, asset_ids: list[str]) -> list[ProductInfo]:
""" """
@@ -135,9 +125,7 @@ class MarketAPIsTool(MarketWrapper, Toolkit):
Raises: Raises:
Exception: If all providers fail to return results. Exception: If all providers fail to return results.
""" """
all_products: dict[str, list[ProductInfo]] = {} all_products = self.handler.try_call_all(lambda w: w.get_products(asset_ids))
for asset in asset_ids:
all_products[asset] = self.handler.try_call_all(lambda w: w.get_product(asset))
return ProductInfo.aggregate_multi_assets(all_products) return ProductInfo.aggregate_multi_assets(all_products)
def get_historical_prices_aggregated(self, asset_id: str = "BTC", limit: int = 100) -> list[Price]: def get_historical_prices_aggregated(self, asset_id: str = "BTC", limit: int = 100) -> list[Price]: