Skip to content

Commit

Permalink
Add support for multiple symbols on obb.equity.price.historical (#5984
Browse files Browse the repository at this point in the history
)

* av - support for multiple symbols

* tiingo - support for multiple symbols

* include symbol only if necessary
  • Loading branch information
hjoaquim authored Jan 23, 2024
1 parent 04df52d commit 604f549
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
from openbb_alpha_vantage.utils.helpers import (
extract_key_name,
filter_by_dates,
get_data,
get_interval,
)
from openbb_core.provider.abstract.fetcher import Fetcher
Expand All @@ -20,7 +19,7 @@
DATA_DESCRIPTIONS,
QUERY_DESCRIPTIONS,
)
from openbb_core.provider.utils.helpers import get_querystring
from openbb_core.provider.utils.helpers import amake_request, get_querystring
from pydantic import (
Field,
NonNegativeFloat,
Expand Down Expand Up @@ -156,7 +155,7 @@ def transform_query(params: Dict[str, Any]) -> AVEquityHistoricalQueryParams:
return AVEquityHistoricalQueryParams(**transformed_params)

@staticmethod
def extract_data(
async def aextract_data(
query: AVEquityHistoricalQueryParams,
credentials: Optional[Dict[str, str]],
**kwargs: Any,
Expand All @@ -166,26 +165,42 @@ def extract_data(

interval = get_interval(query.interval)
query_str = get_querystring(
query.model_dump(by_alias=True), ["start_date", "end_date", "interval"]
query.model_dump(by_alias=True),
["start_date", "end_date", "interval", "symbol"],
)
query_str += f"&function={query._function}&interval={interval}" # pylint: disable=protected-access
url = f"https://www.alphavantage.co/query?{query_str}&apikey={api_key}"

data = get_data(url, **kwargs)
dynamic_key = (set(data.keys()) - {"Meta Data"}).pop()
data = {}

return data[dynamic_key]
for symbol in query.symbol.split(","):
raw_data = await amake_request(f"{url}&symbol={symbol}", **kwargs)
dynamic_key = (set(raw_data.keys()) - {"Meta Data"}).pop()
data[symbol] = raw_data[dynamic_key]

return data

# pylint: disable=unused-argument
@staticmethod
def transform_data(
query: AVEquityHistoricalQueryParams, data: Dict, **kwargs: Any
) -> List[AVEquityHistoricalData]:
"""Transform the data to the standard format."""
data = [
{"date": date, **{extract_key_name(k): v for k, v in values.items()}}
for date, values in data.items()
]
data = filter_by_dates(data, query.start_date, query.end_date)

return [AVEquityHistoricalData.model_validate(d) for d in data]
transformed_data = []
for symbol, content in data.items():
if not isinstance(content, dict):
# if the content isn't a dict, it means that the API returned an error
# most likely too many requests without premium account
raise Exception(content)
d = [
{
**({"symbol": symbol} if "," in query.symbol else {}),
"date": date,
**{extract_key_name(k): v for k, v in values.items()},
}
for date, values in content.items()
]
filter_by_dates(d, query.start_date, query.end_date)
transformed_data += d

return [AVEquityHistoricalData.model_validate(d) for d in transformed_data]
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@
EquityHistoricalQueryParams,
)
from openbb_core.provider.utils.descriptions import QUERY_DESCRIPTIONS
from openbb_core.provider.utils.helpers import get_querystring
from openbb_tiingo.utils.helpers import get_data_many
from openbb_core.provider.utils.helpers import amake_request, get_querystring
from pydantic import Field, PrivateAttr, model_validator


Expand Down Expand Up @@ -115,7 +114,7 @@ def transform_query(params: Dict[str, Any]) -> TiingoEquityHistoricalQueryParams

# pylint: disable=protected-access
@staticmethod
def extract_data(
async def aextract_data(
query: TiingoEquityHistoricalQueryParams,
credentials: Optional[Dict[str, str]],
**kwargs: Any,
Expand All @@ -127,9 +126,18 @@ def extract_data(
query_str = get_querystring(
query.model_dump(by_alias=True), ["symbol", "interval"]
)
url = f"{base_url}/{query.symbol}/prices?{query_str}&resampleFreq={query._frequency}&token={api_key}"
data: List[Dict] = []
for symbol in query.symbol.split(","):
url = f"{base_url}/{symbol}/prices?{query_str}&resampleFreq={query._frequency}&token={api_key}"
d = await amake_request(url, **kwargs)

return get_data_many(url)
if "," in query.symbol:
for item in d:
item["symbol"] = symbol

data += d

return data

# pylint: disable=unused-argument
@staticmethod
Expand Down

0 comments on commit 604f549

Please sign in to comment.