Skip to content

Commit

Permalink
[Feature] Forward EBITDA (#6433)
Browse files Browse the repository at this point in the history
* forward ebitda

* codespell

* sort intrinio output

* get

* list instead of dict

---------

Co-authored-by: Igor Radovanovic <[email protected]>
  • Loading branch information
deeleeramone and IgorWounds authored May 20, 2024
1 parent e292237 commit bffd88f
Show file tree
Hide file tree
Showing 15 changed files with 1,274 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
"""Forward EBITDA Estimates Standard Model."""

from datetime import date as dateType
from typing import Optional, Union

from pydantic import Field, field_validator

from openbb_core.provider.abstract.data import Data, ForceInt
from openbb_core.provider.abstract.query_params import QueryParams
from openbb_core.provider.utils.descriptions import (
DATA_DESCRIPTIONS,
QUERY_DESCRIPTIONS,
)


class ForwardEbitdaEstimatesQueryParams(QueryParams):
"""Forward EBITDA Estimates Query Parameters."""

symbol: Optional[str] = Field(
default=None,
description=QUERY_DESCRIPTIONS["symbol"],
)

@field_validator("symbol", mode="before", check_fields=False)
@classmethod
def to_upper(cls, v):
"""Convert field to uppercase."""
return v.upper() if v else None


class ForwardEbitdaEstimatesData(Data):
"""Forward EBITDA Estimates Data."""

symbol: str = Field(description=DATA_DESCRIPTIONS.get("symbol", ""))
name: Optional[str] = Field(default=None, description="Name of the entity.")
last_updated: Optional[dateType] = Field(
default=None,
description="The date of the last update.",
)
period_ending: Optional[dateType] = Field(
default=None,
description="The end date of the reporting period.",
)
fiscal_year: Optional[int] = Field(
default=None, description="Fiscal year for the estimate."
)
fiscal_period: Optional[str] = Field(
default=None, description="Fiscal quarter for the estimate."
)
calendar_year: Optional[int] = Field(
default=None, description="Calendar year for the estimate."
)
calendar_period: Optional[Union[int, str]] = Field(
default=None, description="Calendar quarter for the estimate."
)
low_estimate: Optional[ForceInt] = Field(
default=None, description="The EBITDA estimate low for the period."
)
high_estimate: Optional[ForceInt] = Field(
default=None, description="The EBITDA estimate high for the period."
)
mean: Optional[ForceInt] = Field(
default=None, description="The EBITDA estimate mean for the period."
)
median: Optional[ForceInt] = Field(
default=None, description="The EBITDA estimate median for the period."
)
standard_deviation: Optional[ForceInt] = Field(
default=None,
description="The EBITDA estimate standard deviation for the period.",
)
number_of_analysts: Optional[int] = Field(
default=None,
description="Number of analysts providing estimates for the period.",
)
33 changes: 33 additions & 0 deletions openbb_platform/extensions/equity/integration/test_equity_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -1982,3 +1982,36 @@ def test_equity_estimates_forward_pe(params, headers):
result = requests.get(url, headers=headers, timeout=10)
assert isinstance(result, requests.Response)
assert result.status_code == 200


@parametrize(
"params",
[
(
{
"symbol": "AAPL,MSFT",
"fiscal_period": "quarter",
"provider": "intrinio",
}
),
(
{
"symbol": "AAPL,MSFT",
"fiscal_period": "annual",
"limit": None,
"include_historical": False,
"provider": "fmp",
}
),
],
)
@pytest.mark.integration
def test_equity_estimates_forward_ebitda(params, headers):
"""Test the equity estimates forward_ebitda endpoint."""
params = {p: v for p, v in params.items() if v}

query_str = get_querystring(params, [])
url = f"http://0.0.0.0:8000/api/v1/equity/estimates/forward_ebitda?{query_str}"
result = requests.get(url, headers=headers, timeout=10)
assert isinstance(result, requests.Response)
assert result.status_code == 200
Original file line number Diff line number Diff line change
Expand Up @@ -750,6 +750,36 @@ def test_equity_estimates_forward_eps(params, obb):
assert len(result.results) > 0


@parametrize(
"params",
[
(
{
"symbol": "AAPL,MSFT",
"fiscal_period": "quarter",
"provider": "intrinio",
}
),
(
{
"symbol": "AAPL,MSFT",
"fiscal_period": "annual",
"limit": None,
"include_historical": False,
"provider": "fmp",
}
),
],
)
@pytest.mark.integration
def test_equity_estimates_forward_ebitda(params, obb):
"""Test the equity estimates forward EBITDA endpoint."""
result = obb.equity.estimates.forward_ebitda(**params)
assert result
assert isinstance(result, OBBject)
assert len(result.results) > 0


@parametrize(
"params",
[
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,36 @@ async def forward_sales(
return await OBBject.from_query(Query(**locals()))


@router.command(
model="ForwardEbitdaEstimates",
examples=[
APIEx(parameters={"provider": "intrinio"}),
APIEx(
parameters={
"symbol": "AAPL",
"fiscal_period": "annual",
"provider": "intrinio",
}
),
APIEx(
parameters={
"symbol": "AAPL,MSFT",
"fiscal_period": "quarter",
"provider": "fmp",
}
),
],
)
async def forward_ebitda(
cc: CommandContext,
provider_choices: ProviderChoices,
standard_params: StandardParams,
extra_params: ExtraParams,
) -> OBBject:
"""Get forward EBITDA estimates."""
return await OBBject.from_query(Query(**locals()))


@router.command(
model="ForwardEpsEstimates",
examples=[
Expand Down
Loading

0 comments on commit bffd88f

Please sign in to comment.