mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-11-12 04:13:06 +00:00
* remove python 3.9 support and code * black * more cli lint * more linting * more lint * fix for tests * docstring grammar police * add lock to to build function to avoid async import race conditions * grammar police * lots more linting * relock
105 lines
3.0 KiB
Python
105 lines
3.0 KiB
Python
"""WSJ Asset Performance Active Model."""
|
|
|
|
# pylint: disable=unused-argument
|
|
|
|
from datetime import datetime
|
|
from typing import Any
|
|
|
|
from openbb_core.provider.abstract.fetcher import Fetcher
|
|
from openbb_core.provider.standard_models.etf_performance import (
|
|
ETFPerformanceData,
|
|
ETFPerformanceQueryParams,
|
|
)
|
|
from pydantic import Field, field_validator
|
|
|
|
|
|
class WSJActiveQueryParams(ETFPerformanceQueryParams):
|
|
"""WSJ Asset Performance Active Query.
|
|
|
|
Source: https://www.wsj.com/market-data/mutualfunds-etfs/etfmovers
|
|
"""
|
|
|
|
|
|
class WSJActiveData(ETFPerformanceData):
|
|
"""WSJ Asset Performance Active Data."""
|
|
|
|
__alias_dict__ = {
|
|
"symbol": "ticker",
|
|
"last_price": "lastPrice",
|
|
"percent_change": "percentChange",
|
|
"net_change": "priceChange",
|
|
"date": "timestamp",
|
|
}
|
|
|
|
country: str = Field(
|
|
description="Country of the entity.",
|
|
)
|
|
mantissa: int = Field(
|
|
description="Mantissa.",
|
|
)
|
|
type: str = Field(
|
|
description="Type of the entity.",
|
|
)
|
|
formatted_price: str = Field(
|
|
description="Formatted price.",
|
|
)
|
|
formatted_volume: str = Field(
|
|
description="Formatted volume.",
|
|
)
|
|
formatted_price_change: str = Field(
|
|
description="Formatted price change.",
|
|
)
|
|
formatted_percent_change: str = Field(
|
|
description="Formatted percent change.",
|
|
)
|
|
url: str = Field(
|
|
description="The source url.",
|
|
)
|
|
|
|
@field_validator("date", mode="before", check_fields=False)
|
|
def date_validate(cls, v): # pylint: disable=E0213
|
|
"""Return the datetime object from the date string."""
|
|
return datetime.strptime(v[:10], "%Y-%m-%d").date()
|
|
|
|
|
|
class WSJActiveFetcher(Fetcher[WSJActiveQueryParams, list[WSJActiveData]]):
|
|
"""Transform the query, extract and transform the data from the WSJ endpoints."""
|
|
|
|
@staticmethod
|
|
def transform_query(params: dict[str, Any]) -> WSJActiveQueryParams:
|
|
"""Transform query params."""
|
|
return WSJActiveQueryParams(**params)
|
|
|
|
@staticmethod
|
|
def extract_data(
|
|
query: WSJActiveQueryParams,
|
|
credentials: dict[str, str] | None,
|
|
**kwargs: Any,
|
|
) -> list[dict]:
|
|
"""Get data from WSJ."""
|
|
# pylint: disable=import-outside-toplevel
|
|
from openbb_core.provider.utils.helpers import make_request
|
|
|
|
url = (
|
|
"https://www.wsj.com/market-data/mutualfunds-etfs/etfmovers?id=%7B%22application"
|
|
"%22%3A%22WSJ%22%2C%22etfMover%22%3A%22most_active%22%2C%22count%22%3A25%7D&type="
|
|
"mdc_etfmovers"
|
|
)
|
|
data = make_request(url).json()
|
|
|
|
return data["data"]["instruments"]
|
|
|
|
@staticmethod
|
|
def transform_data(
|
|
query: ETFPerformanceQueryParams,
|
|
data: list[dict],
|
|
**kwargs: Any,
|
|
) -> list[WSJActiveData]:
|
|
"""Transform data."""
|
|
data = data[: query.limit]
|
|
data = sorted(
|
|
data,
|
|
key=lambda x: x["volume"] if query.sort == "asc" else -x["volume"],
|
|
)
|
|
return [WSJActiveData.model_validate(d) for d in data]
|