1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
"""CPI Standard Model."""
from datetime import date as dateType
from typing import Literal, Optional
from dateutil import parser
from pydantic import Field, field_validator
from openbb_core.provider.abstract.data import Data
from openbb_core.provider.abstract.query_params import QueryParams
from openbb_core.provider.utils.descriptions import (
DATA_DESCRIPTIONS,
QUERY_DESCRIPTIONS,
)
from openbb_core.provider.utils.helpers import check_item
CPI_COUNTRIES = [
"australia",
"austria",
"belgium",
"brazil",
"bulgaria",
"canada",
"chile",
"china",
"croatia",
"cyprus",
"czech_republic",
"denmark",
"estonia",
"euro_area",
"finland",
"france",
"germany",
"greece",
"hungary",
"iceland",
"india",
"indonesia",
"ireland",
"israel",
"italy",
"japan",
"korea",
"latvia",
"lithuania",
"luxembourg",
"malta",
"mexico",
"netherlands",
"new_zealand",
"norway",
"poland",
"portugal",
"romania",
"russian_federation",
"slovak_republic",
"slovakia",
"slovenia",
"south_africa",
"spain",
"sweden",
"switzerland",
"turkey",
"united_kingdom",
"united_states",
]
CPI_UNITS = Literal["growth_previous", "growth_same", "index_2015"]
CPI_FREQUENCY = Literal["monthly", "quarter", "annual"]
class ConsumerPriceIndexQueryParams(QueryParams):
"""CPI Query."""
country: str = Field(
description=QUERY_DESCRIPTIONS.get("country"),
json_schema_extra={"choices": CPI_COUNTRIES}, # type: ignore[dict-item]
)
units: CPI_UNITS = Field(
default="growth_same",
description=QUERY_DESCRIPTIONS.get("units", "")
+ """
Options:
- `growth_previous`: Percent growth from the previous period.
If monthly data, this is month-over-month, etc
- `growth_same`: Percent growth from the same period in the previous year.
If looking at monthly data, this would be year-over-year, etc.
- `index_2015`: Rescaled index value, such that the value in 2015 is 100.""",
)
frequency: CPI_FREQUENCY = Field(
default="monthly",
description=QUERY_DESCRIPTIONS.get("frequency", "")
+ """
Options: `monthly`, `quarter`, and `annual`.""",
)
harmonized: bool = Field(
default=False, description="Whether you wish to obtain harmonized data."
)
start_date: Optional[dateType] = Field(
default=None, description=QUERY_DESCRIPTIONS.get("start_date")
)
end_date: Optional[dateType] = Field(
default=None, description=QUERY_DESCRIPTIONS.get("end_date")
)
@field_validator("country", mode="before", check_fields=False)
def validate_country(cls, c: str): # pylint: disable=E0213
"""Validate country."""
result = []
values = c.replace(" ", "_").split(",")
for v in values:
check_item(v.lower(), CPI_COUNTRIES)
result.append(v.lower())
return ",".join(result)
class ConsumerPriceIndexData(Data):
"""CPI data."""
date: dateType = Field(description=DATA_DESCRIPTIONS.get("date"))
@field_validator("date", mode="before")
@classmethod
def date_validate(cls, v):
"""Validate date."""
return parser.isoparse(v)
|