Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for multiple symbols on obb.equity.price.historical #5984

Merged
merged 6 commits into from
Jan 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading