summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanglewood <85772166+deeleeramone@users.noreply.github.com>2024-06-11 13:56:05 -0700
committerDanglewood <85772166+deeleeramone@users.noreply.github.com>2024-06-11 13:56:05 -0700
commit2bf8f68285235109f1939ab5c30b3cac893b8431 (patch)
tree68e1a2e0fcc666b8f5fa5cad4108c60bbe0fd7d4
parent8725c19f79f22182aafb3cddd3c09d1b664555f0 (diff)
improve hqm
-rw-r--r--openbb_platform/core/openbb_core/provider/standard_models/high_quality_market.py (renamed from openbb_platform/core/openbb_core/provider/standard_models/hqm.py)22
-rw-r--r--openbb_platform/openbb/assets/reference.json50
-rw-r--r--openbb_platform/openbb/package/fixedincome_corporate.py27
-rw-r--r--openbb_platform/providers/fred/openbb_fred/__init__.py6
-rw-r--r--openbb_platform/providers/fred/openbb_fred/models/high_quality_market.py141
-rw-r--r--openbb_platform/providers/fred/openbb_fred/models/hqm.py109
-rw-r--r--openbb_platform/providers/fred/tests/record/http/test_fred_fetchers/test_fred_high_quality_market_corporate_bond_fetcher.yaml611
-rw-r--r--openbb_platform/providers/fred/tests/test_fred_fetchers.py10
8 files changed, 274 insertions, 702 deletions
diff --git a/openbb_platform/core/openbb_core/provider/standard_models/hqm.py b/openbb_platform/core/openbb_core/provider/standard_models/high_quality_market.py
index 233cec3891c..2152b00b4df 100644
--- a/openbb_platform/core/openbb_core/provider/standard_models/hqm.py
+++ b/openbb_platform/core/openbb_core/provider/standard_models/high_quality_market.py
@@ -3,9 +3,9 @@
from datetime import (
date as dateType,
)
-from typing import Literal, Optional
+from typing import Optional, Union
-from pydantic import Field, field_validator
+from pydantic import Field
from openbb_core.provider.abstract.data import Data
from openbb_core.provider.abstract.query_params import QueryParams
@@ -18,26 +18,18 @@ from openbb_core.provider.utils.descriptions import (
class HighQualityMarketCorporateBondQueryParams(QueryParams):
"""High Quality Market Corporate Bond Query."""
- date: Optional[dateType] = Field(
+ date: Optional[Union[dateType, str]] = Field(
default=None,
description=QUERY_DESCRIPTIONS.get("date", ""),
)
- yield_curve: Literal["spot", "par"] = Field(
- default="spot",
- description="The yield curve type.",
- )
-
- @field_validator("yield_curve", mode="before", check_fields=False)
- @classmethod
- def to_lower(cls, v: Optional[str]) -> Optional[str]:
- """Convert field to lowercase."""
- return v.lower() if v else v
class HighQualityMarketCorporateBondData(Data):
"""High Quality Market Corporate Bond Data."""
date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", ""))
- rate: Optional[float] = Field(description="HighQualityMarketCorporateBond Rate.")
+ rate: float = Field(
+ description="Interest rate.",
+ json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
+ )
maturity: str = Field(description="Maturity.")
- yield_curve: Literal["spot", "par"] = Field(description="The yield curve type.")
diff --git a/openbb_platform/openbb/assets/reference.json b/openbb_platform/openbb/assets/reference.json
index 065f70967c7..2303a662748 100644
--- a/openbb_platform/openbb/assets/reference.json
+++ b/openbb_platform/openbb/assets/reference.json
@@ -32223,26 +32223,18 @@
"message": null
},
"description": "High Quality Market Corporate Bond.\n\nThe HQM yield curve represents the high quality corporate bond market, i.e.,\ncorporate bonds rated AAA, AA, or A. The HQM curve contains two regression terms.\nThese terms are adjustment factors that blend AAA, AA, and A bonds into a single HQM yield curve\nthat is the market-weighted average (MWA) quality of high quality bonds.",
- "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.corporate.hqm(provider='fred')\nobb.fixedincome.corporate.hqm(yield_curve='par', provider='fred')\n```\n\n",
+ "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.corporate.hqm(provider='fred')\nobb.fixedincome.corporate.hqm(yield_curve=par, provider='fred')\n```\n\n",
"parameters": {
"standard": [
{
"name": "date",
- "type": "Union[date, str]",
- "description": "A specific date to get data for.",
+ "type": "Union[Union[Union[str, date], str], List[Union[Union[str, date], str]]]",
+ "description": "A specific date to get data for. Multiple items allowed for provider(s): fred.",
"default": null,
"optional": true,
"choices": null
},
{
- "name": "yield_curve",
- "type": "Literal['spot', 'par']",
- "description": "The yield curve type.",
- "default": "spot",
- "optional": true,
- "choices": null
- },
- {
"name": "provider",
"type": "Literal['fred']",
"description": "The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: f, r, e, d.",
@@ -32250,7 +32242,19 @@
"optional": true
}
],
- "fred": []
+ "fred": [
+ {
+ "name": "yield_curve",
+ "type": "Literal['spot', 'par']",
+ "description": "The yield curve type.",
+ "default": "spot",
+ "optional": true,
+ "choices": [
+ "spot",
+ "par"
+ ]
+ }
+ ]
},
"returns": {
"OBBject": [
@@ -32294,7 +32298,7 @@
{
"name": "rate",
"type": "float",
- "description": "HighQualityMarketCorporateBond Rate.",
+ "description": "Interest rate.",
"default": "",
"optional": false,
"choices": null
@@ -32306,26 +32310,9 @@
"default": "",
"optional": false,
"choices": null
- },
- {
- "name": "yield_curve",
- "type": "Literal['spot', 'par']",
- "description": "The yield curve type.",
- "default": "",
- "optional": false,
- "choices": null
}
],
- "fred": [
- {
- "name": "series_id",
- "type": "str",
- "description": "FRED series id.",
- "default": "",
- "optional": false,
- "choices": null
- }
- ]
+ "fred": []
},
"model": "HighQualityMarketCorporateBond"
},
@@ -32936,6 +32923,7 @@
"non_financial",
"private_sector",
"public_sector",
+ "seasoned_corporate",
"yield_curve"
]
},
diff --git a/openbb_platform/openbb/package/fixedincome_corporate.py b/openbb_platform/openbb/package/fixedincome_corporate.py
index 97dd8953989..b003e876887 100644
--- a/openbb_platform/openbb/package/fixedincome_corporate.py
+++ b/openbb_platform/openbb/package/fixedincome_corporate.py
@@ -166,12 +166,11 @@ class ROUTER_fixedincome_corporate(Container):
def hqm(
self,
date: Annotated[
- Union[datetime.date, None, str],
- OpenBBField(description="A specific date to get data for."),
+ Union[str, datetime.date, None, List[Union[str, datetime.date, None]]],
+ OpenBBField(
+ description="A specific date to get data for. Multiple comma separated items allowed for provider(s): fred."
+ ),
] = None,
- yield_curve: Annotated[
- Literal["spot", "par"], OpenBBField(description="The yield curve type.")
- ] = "spot",
provider: Annotated[
Optional[Literal["fred"]],
OpenBBField(
@@ -190,12 +189,12 @@ class ROUTER_fixedincome_corporate(Container):
Parameters
----------
- date : Union[datetime.date, None, str]
- A specific date to get data for.
- yield_curve : Literal['spot', 'par']
- The yield curve type.
+ date : Union[str, datetime.date, None, List[Union[str, datetime.d...
+ A specific date to get data for. Multiple comma separated items allowed for provider(s): fred.
provider : Optional[Literal['fred']]
The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: fred.
+ yield_curve : Literal['spot', 'par']
+ The yield curve type. (provider: fred)
Returns
-------
@@ -215,14 +214,10 @@ class ROUTER_fixedincome_corporate(Container):
------------------------------
date : date
The date of the data.
- rate : Optional[float]
- HighQualityMarketCorporateBond Rate.
+ rate : float
+ Interest rate.
maturity : str
Maturity.
- yield_curve : Literal['spot', 'par']
- The yield curve type.
- series_id : Optional[str]
- FRED series id. (provider: fred)
Examples
--------
@@ -243,9 +238,9 @@ class ROUTER_fixedincome_corporate(Container):
},
standard_params={
"date": date,
- "yield_curve": yield_curve,
},
extra_params=kwargs,
+ info={"date": {"fred": {"multiple_items_allowed": True}}},
)
)
diff --git a/openbb_platform/providers/fred/openbb_fred/__init__.py b/openbb_platform/providers/fred/openbb_fred/__init__.py
index bdce029bbe5..669a73bdf39 100644
--- a/openbb_platform/providers/fred/openbb_fred/__init__.py
+++ b/openbb_platform/providers/fred/openbb_fred/__init__.py
@@ -14,7 +14,9 @@ from openbb_fred.models.estr_rates import FREDESTRFetcher
from openbb_fred.models.fed_projections import FREDPROJECTIONFetcher
from openbb_fred.models.federal_funds_rate import FredFederalFundsRateFetcher
from openbb_fred.models.ffrmc import FREDSelectedTreasuryConstantMaturityFetcher
-from openbb_fred.models.hqm import FREDHighQualityMarketCorporateBondFetcher
+from openbb_fred.models.high_quality_market import (
+ FredHighQualityMarketCorporateBondFetcher,
+)
from openbb_fred.models.ice_bofa import FREDICEBofAFetcher
from openbb_fred.models.iorb_rates import FREDIORBFetcher
from openbb_fred.models.moody import FREDMoodyCorporateBondIndexFetcher
@@ -67,7 +69,7 @@ Research division of the Federal Reserve Bank of St. Louis that has more than
"FredRegional": FredRegionalDataFetcher,
"RetailPrices": FredRetailPricesFetcher,
"SpotRate": FREDSpotRateFetcher,
- "HighQualityMarketCorporateBond": FREDHighQualityMarketCorporateBondFetcher,
+ "HighQualityMarketCorporateBond": FredHighQualityMarketCorporateBondFetcher,
"TreasuryConstantMaturity": FREDTreasuryConstantMaturityFetcher,
"SelectedTreasuryConstantMaturity": FREDSelectedTreasuryConstantMaturityFetcher,
"SelectedTreasuryBill": FREDSelectedTreasuryBillFetcher,
diff --git a/openbb_platform/providers/fred/openbb_fred/models/high_quality_market.py b/openbb_platform/providers/fred/openbb_fred/models/high_quality_market.py
new file mode 100644
index 00000000000..5a6855d20db
--- /dev/null
+++ b/openbb_platform/providers/fred/openbb_fred/models/high_quality_market.py
@@ -0,0 +1,141 @@
+"""FRED High Quality Market Corporate Bond Model."""
+
+import asyncio
+from datetime import date as dateType
+from typing import Any, Dict, List, Literal, Optional
+
+from dateutil import parser
+from openbb_core.provider.abstract.fetcher import Fetcher
+from openbb_core.provider.standard_models.high_quality_market import (
+ HighQualityMarketCorporateBondData,
+ HighQualityMarketCorporateBondQueryParams,
+)
+from openbb_core.provider.utils.helpers import amake_request
+from pandas import Categorical, DataFrame
+from pydantic import Field, field_validator
+
+
+class FredHighQualityMarketCorporateBondQueryParams(
+ HighQualityMarketCorporateBondQueryParams
+):
+ """FRED High Quality Market Corporate Bond Query."""
+
+ __json_schema_extra__ = {"date": {"multiple_items_allowed": True}}
+
+ yield_curve: Literal["spot", "par"] = Field(
+ default="spot",
+ description="The yield curve type.",
+ json_schema_extra={"choices": ["spot", "par"]},
+ )
+
+ @field_validator("date", mode="before", check_fields=False)
+ @classmethod
+ def validate_date(cls, v):
+ """Validate the dates entered."""
+ if v is None:
+ return None
+ if isinstance(v, (list, dateType)):
+ return v
+ new_dates: List = []
+ date_param = v
+ if isinstance(date_param, str):
+ new_dates = date_param.split(",")
+ elif isinstance(date_param, dateType):
+ new_dates.append(date_param.strftime("%Y-%m-%d"))
+ elif isinstance(date_param, list) and isinstance(date_param[0], dateType):
+ new_dates = [d.strftime("%Y-%m-%d") for d in new_dates]
+ else:
+ new_dates = date_param
+ return ",".join(new_dates) if len(new_dates) > 1 else new_dates[0]
+
+
+class FredHighQualityMarketCorporateBondData(HighQualityMarketCorporateBondData):
+ """FRED High Quality Market Corporate Bond Data."""
+
+
+class FredHighQualityMarketCorporateBondFetcher(
+ Fetcher[
+ FredHighQualityMarketCorporateBondQueryParams,
+ List[FredHighQualityMarketCorporateBondData],
+ ]
+):
+ """FRED High Quality Market Corporate Bond Fetcher."""
+
+ @staticmethod
+ def transform_query(
+ params: Dict[str, Any]
+ ) -> FredHighQualityMarketCorporateBondQueryParams:
+ """Transform query."""
+ return FredHighQualityMarketCorporateBondQueryParams(**params)
+
+ @staticmethod
+ async def aextract_data(
+ query: FredHighQualityMarketCorporateBondQueryParams,
+ credentials: Optional[Dict[str, str]],
+ **kwargs: Any,
+ ) -> List[Dict]:
+ """Extract data."""
+ api_key = credentials.get("fred_api_key") if credentials else ""
+
+ element_id = "219299" if query.yield_curve == "spot" else "219294"
+ dates: List = [""]
+ if query.date and isinstance(query.date, dateType):
+ query.date = query.date.strftime("%Y-%m-%d")
+
+ dates = query.date.split(",")
+ dates = [d.replace(d[-2:], "01") if len(d) == 10 else d for d in dates]
+ dates = list(set(dates))
+ dates = [f"&observation_date={date}" for date in dates if date] if dates else ""
+ URLS = [
+ f"https://api.stlouisfed.org/fred/release/tables?release_id=402&element_id={element_id}"
+ + f"{date}&include_observation_values=true&api_key={api_key}"
+ + "&file_type=json"
+ for date in dates
+ ]
+ results = []
+
+ async def get_one(URL):
+ """Get the observations for a single date."""
+ data = await amake_request(URL)
+ if data:
+ elements = {k: v for k, v in data["elements"].items()}
+ for k, v in elements.items():
+ value = v.get("observation_value")
+ if not value:
+ continue
+ maturity = v.get("name").lower().split("-")
+ results.append(
+ {
+ "date": parser.parse(
+ v.get("observation_date"),
+ ).date(),
+ "rate": float(value) / 100,
+ "maturity": (maturity[1] + "_" + maturity[0]).replace(
+ " ", ""
+ ),
+ }
+ )
+
+ await asyncio.gather(*[get_one(URL) for URL in URLS])
+
+ return results
+
+ @staticmethod
+ def transform_data(
+ query: FredHighQualityMarketCorporateBondQueryParams,
+ data: List[Dict],
+ **kwargs: Any,
+ ) -> List[FredHighQualityMarketCorporateBondData]:
+ """Transform data."""
+ df = DataFrame(data)
+ df["maturity_int"] = df["maturity"].str.replace("year_", "").astype(float)
+ maturity_categories = sorted(df.maturity_int.unique().tolist())
+ df["maturity_int"] = Categorical(
+ df["maturity_int"], categories=maturity_categories, ordered=True
+ )
+ df = df.sort_values(by=["date", "maturity_int"]).reset_index(drop=True)
+ df = df.drop(columns=["maturity_int"])
+ records = df.to_dict("records")
+ return [
+ FredHighQualityMarketCorporateBondData.model_validate(d) for d in records
+ ]
diff --git a/openbb_platform/providers/fred/openbb_fred/models/hqm.py b/openbb_platform/providers/fred/openbb_fred/models/hqm.py
deleted file mode 100644
index bb028a33c32..00000000000
--- a/openbb_platform/providers/fred/openbb_fred/models/hqm.py
+++ /dev/null
@@ -1,109 +0,0 @@
-"""FRED High Quality Market Corporate Bond Model."""
-
-from datetime import datetime, timedelta
-from typing import Any, Dict, List, Optional
-
-from openbb_core.provider.abstract.fetcher import Fetcher
-from openbb_core.provider.standard_models.hqm import (
- HighQualityMarketCorporateBondData,
- HighQualityMarketCorporateBondQueryParams,
-)
-from openbb_fred.utils.fred_base import Fred
-from openbb_fred.utils.fred_helpers import (
- YIELD_CURVE_SERIES_CORPORATE_PAR,
- YIELD_CURVE_SERIES_CORPORATE_SPOT,
-)
-from pydantic import Field, field_validator
-
-
-class FREDHighQualityMarketCorporateBondQueryParams(
- HighQualityMarketCorporateBondQueryParams
-):
- """FRED High Quality Market Corporate Bond Query."""
-
-
-class FREDHighQualityMarketCorporateBondData(HighQualityMarketCorporateBondData):
- """FRED High Quality Market Corporate Bond Data."""
-
- __alias_dict__ = {"rate": "value"}
-
- series_id: str = Field(description="FRED series id.")
-
- @field_validator("rate", mode="before", check_fields=False)
- @classmethod
- def value_validate(cls, v):
- """Validate rate."""
- try:
- return float(v)
- except ValueError:
- return None
-
-
-class FREDHighQualityMarketCorporateBondFetcher(
- Fetcher[
- FREDHighQualityMarketCorporateBondQueryParams,
- List[FREDHighQualityMarketCorporateBondData],
- ]
-):
- """Transform the query, extract and transform the data from the FRED endpoints."""
-
- @staticmethod
- def transform_query(
- params: Dict[str, Any]
- ) -> FREDHighQualityMarketCorporateBondQueryParams:
- """Transform query."""
- return FREDHighQualityMarketCorporateBondQueryParams(**params)
-
- @staticmethod
- def extract_data(
- query: FREDHighQualityMarketCorporateBondQueryParams,
- credentials: Optional[Dict[str, str]],
- **kwargs: Any
- ) -> list:
- """Extract data."""
- key = credentials.get("fred_api_key") if credentials else ""
- fred = Fred(key)
-
- data = []
-
- today = datetime.today().date()
- if query.date and query.date >= today:
- raise ValueError("Date must be in the past.")
-
- start_date = (
- query.date - timedelta(days=50)
- if query.date
- else today - timedelta(days=50)
- )
-
- if query.yield_curve == "spot":
- fred_series = YIELD_CURVE_SERIES_CORPORATE_SPOT
- elif query.yield_curve == "par":
- fred_series = YIELD_CURVE_SERIES_CORPORATE_PAR
- else:
- raise ValueError("Invalid yield curve type.")
-
- for maturity, id_ in fred_series.items():
- d = fred.get_series(
- series_id=id_,
- start_date=start_date,
- **kwargs,
- )
- for observation in d:
- series_data = {
- "series_id": id_,
- "maturity": maturity,
- "yield_curve": query.yield_curve,
- "date": observation["date"],
- "value": observation["value"],
- }
- data.append(series_data)
-
- return data
-
- @staticmethod
- def transform_data(
- query: FREDHighQualityMarketCorporateBondQueryParams, data: list, **kwargs: Any
- ) -> List[FREDHighQualityMarketCorporateBondData]:
- """Transform data."""
- return [FREDHighQualityMarketCorporateBondData.model_validate(d) for d in data]
diff --git a/openbb_platform/providers/fred/tests/record/http/test_fred_fetchers/test_fred_high_quality_market_corporate_bond_fetcher.yaml b/openbb_platform/providers/fred/tests/record/http/test_fred_fetchers/test_fred_high_quality_market_corporate_bond_fetcher.yaml
index 495047d064c..f9a5217fc66 100644
--- a/openbb_platform/providers/fred/tests/record/http/test_fred_fetchers/test_fred_high_quality_market_corporate_bond_fetcher.yaml
+++ b/openbb_platform/providers/fred/tests/record/http/test_fred_fetchers/test_fred_high_quality_market_corporate_bond_fetcher.yaml
@@ -3,551 +3,112 @@ interactions:
body: null
headers:
Accept:
- - '*/*'
+ - application/json
Accept-Encoding:
- gzip, deflate
Connection:
- keep-alive
method: GET
- uri: https://api.stlouisfed.org/fred/series/observations?api_key=MOCK_API_KEY&file_type=json&observation_start=2022-11-12&series_id=HQMCB6MT
+ uri: https://api.stlouisfed.org/fred/release/tables?api_key=MOCK_API_KEY&element_id=219299&file_type=json&include_observation_values=true&observation_date=2023-01-01&release_id=402
response:
body:
string: !!binary |
- H4sIAAAAAAAEA6pWKkpNzCnJzE2NLy5JLCpRslIyMjAy1jU01DUwUtJByKbmpaDL5ScVpxaVJZZk
- 5uchazYCaTYEaUZWANFvaWlpqWtopGtsqKSjVJqXWVKsZKWUk5mnpKOUX1pSUFoSX1JZkKpkZaij
- lJaZkwrlKWUV54OVFKWkFsUnVSpZKSEbnZJYkqqko1ScX1QSnw9SomSllFicrKSjlJxfmleiZGVo
- qKOUn5ZWnFqiZGWgo5STmZsJEjUAAR1ko4qVrKIpCRGwS8AhCA4EA5AvyxJzSlOVrJRM9CxNlGp1
- qGa8kS668WZUM95Y18AQw3hjahqP5npTPUMLahoP8oCSjhIs7E31jAypabwJauCY6hlZUtN4U3Tj
- TcypabwZuvHmVI1ac3TjqRqzFjQ13RLDdMBMlWpjawGZSd1lJgUAAA==
- headers:
- Accept-Ranges:
- - bytes
- Connection:
- - keep-alive
- Content-Encoding:
- - gzip
- Content-Length:
- - '325'
- Content-Type:
- - application/json; charset=UTF-8
- Date:
- - Thu, 02 Nov 2023 13:45:31 GMT
- Expires:
- - Thu, 02 Nov 2023 13:46:31 GMT
- Last-Modified:
- - Tue, 10 Oct 2023 20:03:04 GMT
- Vary:
- - Accept-Encoding
- x-rate-limit-limit:
- - '120'
- x-rate-limit-remaining:
- - '104'
- status:
- code: 200
- message: OK
-- request:
- body: null
- headers:
- Accept:
- - '*/*'
- Accept-Encoding:
- - gzip, deflate
- Connection:
- - keep-alive
- method: GET
- uri: https://api.stlouisfed.org/fred/series/observations?api_key=MOCK_API_KEY&file_type=json&observation_start=2022-11-12&series_id=HQMCB1YR
- response:
- body:
- string: !!binary |
- H4sIAAAAAAAEA6pWKkpNzCnJzE2NLy5JLCpRslIyMjAy1jU01DUwUtJByKbmpaDL5ScVpxaVJZZk
- 5uchazYCaTYEaUZWANFvaWlpqWtopGtsqKSjVJqXWVKsZKWUk5mnpKOUX1pSUFoSX1JZkKpkZaij
- lJaZkwrlKWUV54OVFKWkFsUnVSpZKSEbnZJYkqqko1ScX1QSnw9SomSllFicrKSjlJxfmleiZGVo
- qKOUn5ZWnFqiZGWgo5STmZsJEjUAAR1ko4qVrKIpCRGwS8AhCA4EA5AvyxJzSlOVrJRM9QxMlGp1
- qGa8kS6K8SZ6ltQz3ljXwBDdeAtLqrneWNcAzfWmeoam1DQe5AElHSVE2BuaUdN4E9TAMdUzoGrg
- mKIbb0RV15uhG09V080xTLegZtBboBtvbkhN4y0xjAfMUqk2thYA0w3BlicFAAA=
- headers:
- Accept-Ranges:
- - bytes
- Connection:
- - keep-alive
- Content-Encoding:
- - gzip
- Content-Length:
- - '332'
- Content-Type:
- - application/json; charset=UTF-8
- Date:
- - Thu, 02 Nov 2023 13:45:31 GMT
- Expires:
- - Thu, 02 Nov 2023 13:46:31 GMT
- Last-Modified:
- - Tue, 10 Oct 2023 20:04:03 GMT
- Vary:
- - Accept-Encoding
- x-rate-limit-limit:
- - '120'
- x-rate-limit-remaining:
- - '103'
- status:
- code: 200
- message: OK
-- request:
- body: null
- headers:
- Accept:
- - '*/*'
- Accept-Encoding:
- - gzip, deflate
- Connection:
- - keep-alive
- method: GET
- uri: https://api.stlouisfed.org/fred/series/observations?api_key=MOCK_API_KEY&file_type=json&observation_start=2022-11-12&series_id=HQMCB2YR
- response:
- body:
- string: !!binary |
- H4sIAAAAAAAEA6pWKkpNzCnJzE2NLy5JLCpRslIyMjAy1jU01DUwUtJByKbmpaDL5ScVpxaVJZZk
- 5uchazYCaTYEaUZWANFvaWlpqWtopGtsqKSjVJqXWVKsZKWUk5mnpKOUX1pSUFoSX1JZkKpkZaij
- lJaZkwrlKWUV54OVFKWkFsUnVSpZKSEbnZJYkqqko1ScX1QSnw9SomSllFicrKSjlJxfmleiZGVo
- qKOUn5ZWnFqiZGWgo5STmZsJEjUAAR1ko4qVrKIpCRGwS8AhCA4EA5AvyxJzSlOVrJRM9QxNlGp1
- qGa8kS6K8SZ6FpZUM95Y18AQw3hDahqP5npTPQNzahoP8oCSjhIi7A1MqWm8CXrgmFPV9aboxlsa
- U9P1ZqjGm+oZUzVwzNGNNzGjpust0I03pV62MtY1sEQ3HjAzc6Xa2FoAgopyRigFAAA=
- headers:
- Accept-Ranges:
- - bytes
- Connection:
- - keep-alive
- Content-Encoding:
- - gzip
- Content-Length:
- - '335'
- Content-Type:
- - application/json; charset=UTF-8
- Date:
- - Thu, 02 Nov 2023 13:45:31 GMT
- Expires:
- - Thu, 02 Nov 2023 13:46:31 GMT
- Last-Modified:
- - Tue, 10 Oct 2023 20:04:05 GMT
- Vary:
- - Accept-Encoding
- x-rate-limit-limit:
- - '120'
- x-rate-limit-remaining:
- - '102'
- status:
- code: 200
- message: OK
-- request:
- body: null
- headers:
- Accept:
- - '*/*'
- Accept-Encoding:
- - gzip, deflate
- Connection:
- - keep-alive
- method: GET
- uri: https://api.stlouisfed.org/fred/series/observations?api_key=MOCK_API_KEY&file_type=json&observation_start=2022-11-12&series_id=HQMCB3YR
- response:
- body:
- string: !!binary |
- H4sIAAAAAAAEA6pWKkpNzCnJzE2NLy5JLCpRslIyMjAy1jU01DUwUtJByKbmpaDL5ScVpxaVJZZk
- 5uchazYCaTYEaUZWANFvaWlpqWtopGtsqKSjVJqXWVKsZKWUk5mnpKOUX1pSUFoSX1JZkKpkZaij
- lJaZkwrlKWUV54OVFKWkFsUnVSpZKSEbnZJYkqqko1ScX1QSnw9SomSllFicrKSjlJxfmleiZGVo
- qKOUn5ZWnFqiZGWgo5STmZsJEjUAAR1ko4qVrKIpCRGwS8AhCA4EA5AvyxJzSlOVrJRM9QyNlWp1
- qGa8kS6K8SZ6FoZUM95Y18AQ3XhzapqO4XhLU2oaD3K/ko4SLOhN9KhrvAl62JgZUdP1pujGm5tR
- 03gzVONN9QypGvbm6MYbUdX1FujGG1M1YVqiGw+YqbFSbWwtAMVmGZAnBQAA
- headers:
- Accept-Ranges:
- - bytes
- Connection:
- - keep-alive
- Content-Encoding:
- - gzip
- Content-Length:
- - '330'
- Content-Type:
- - application/json; charset=UTF-8
- Date:
- - Thu, 02 Nov 2023 13:45:31 GMT
- Expires:
- - Thu, 02 Nov 2023 13:46:31 GMT
- Last-Modified:
- - Tue, 10 Oct 2023 20:03:03 GMT
- Vary:
- - Accept-Encoding
- x-rate-limit-limit:
- - '120'
- x-rate-limit-remaining:
- - '101'
- status:
- code: 200
- message: OK
-- request:
- body: null
- headers:
- Accept:
- - '*/*'
- Accept-Encoding:
- - gzip, deflate
- Connection:
- - keep-alive
- method: GET
- uri: https://api.stlouisfed.org/fred/series/observations?api_key=MOCK_API_KEY&file_type=json&observation_start=2022-11