Skip to content

Commit 3dcaed5

Browse files
committed
Enhance type annotations for improved clarity and type safety in SGS and utils modules
Issue #26
1 parent 047f149 commit 3dcaed5

3 files changed

Lines changed: 42 additions & 11 deletions

File tree

bcb/sgs/__init__.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import json
22
from io import StringIO
3+
from typing import Dict, Generator, List, Optional, Tuple, TypeAlias, Union
34

45
import pandas as pd
56
import requests
67

7-
from bcb.utils import Date
8+
from bcb.utils import Date, DateInput
89

910
"""
1011
Sistema Gerenciador de Séries Temporais (SGS)
@@ -17,7 +18,7 @@
1718

1819

1920
class SGSCode:
20-
def __init__(self, code, name=None):
21+
def __init__(self, code: Union[str, int], name: Optional[str] = None) -> None:
2122
if name is None:
2223
if isinstance(code, int) or isinstance(code, str):
2324
self.name = str(code)
@@ -30,7 +31,16 @@ def __repr__(self):
3031
return f"{self.code} - {self.name}" if self.name else f"{self.code}"
3132

3233

33-
def _codes(codes):
34+
SGSCodeInput: TypeAlias = Union[
35+
int,
36+
str,
37+
Tuple[str, Union[int, str]],
38+
List[Union[int, str, Tuple[str, Union[int, str]]]],
39+
Dict[str, Union[int, str]],
40+
]
41+
42+
43+
def _codes(codes: SGSCodeInput) -> Generator[SGSCode, None, None]:
3444
if isinstance(codes, int) or isinstance(codes, str):
3545
yield SGSCode(codes)
3646
elif isinstance(codes, tuple):
@@ -44,7 +54,7 @@ def _codes(codes):
4454
yield SGSCode(code, name)
4555

4656

47-
def _get_url_and_payload(code, start_date, end_date, last):
57+
def _get_url_and_payload(code: int, start_date: DateInput, end_date: DateInput, last: int) -> Dict[str, str]:
4858
payload = {"formato": "json"}
4959
if last == 0:
5060
if start_date is not None or end_date is not None:
@@ -58,7 +68,7 @@ def _get_url_and_payload(code, start_date, end_date, last):
5868
return {"payload": payload, "url": url}
5969

6070

61-
def _format_df(df, code, freq):
71+
def _format_df(df: pd.DataFrame, code: SGSCode, freq: str) -> pd.DataFrame:
6272
cns = {"data": "Date", "valor": code.name, "datafim": "enddate"}
6373
df = df.rename(columns=cns)
6474
if "Date" in df:
@@ -71,7 +81,14 @@ def _format_df(df, code, freq):
7181
return df
7282

7383

74-
def get(codes, start=None, end=None, last=0, multi=True, freq=None):
84+
def get(
85+
codes: SGSCodeInput,
86+
start: Optional[DateInput] = None,
87+
end: Optional[DateInput] = None,
88+
last: int = 0,
89+
multi: bool = True,
90+
freq: Optional[str] = None,
91+
) -> Union[pd.DataFrame, List[pd.DataFrame]]:
7592
"""
7693
Retorna um DataFrame pandas com séries temporais obtidas do SGS.
7794
@@ -130,7 +147,7 @@ def get(codes, start=None, end=None, last=0, multi=True, freq=None):
130147
return dfs
131148

132149

133-
def get_json(code: int, start=None, end=None, last: int = 0) -> str:
150+
def get_json(code: int, start: Optional[DateInput] = None, end: Optional[DateInput] = None, last: int = 0) -> str:
134151
"""
135152
Retorna um JSON com séries temporais obtidas do SGS.
136153

bcb/sgs/regional_economy.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1+
from typing import Dict, List, Optional, Union
2+
3+
import pandas as pd
4+
15
from bcb.sgs import get
6+
from bcb.utils import DateInput
27

38
"""
49
Dados da Economia Regional
@@ -119,7 +124,7 @@
119124
}
120125

121126

122-
def get_non_performing_loans_codes(states_or_region, mode="total"):
127+
def get_non_performing_loans_codes(states_or_region: Union[str, List[str]], mode: str = "total") -> Dict[str, str]:
123128
is_state = False
124129
is_region = False
125130
states_or_region = [states_or_region] if isinstance(states_or_region, str) else states_or_region
@@ -151,7 +156,14 @@ def get_non_performing_loans_codes(states_or_region, mode="total"):
151156
return codes
152157

153158

154-
def get_non_performing_loans(states_or_region, mode="total", start=None, end=None, last=0, freq=None):
159+
def get_non_performing_loans(
160+
states_or_region: Union[str, List[str]],
161+
mode: str = "total",
162+
start: Optional[DateInput] = None,
163+
end: Optional[DateInput] = None,
164+
last: int = 0,
165+
freq: Optional[str] = None,
166+
) -> pd.DataFrame:
155167
"""Dados de inadimplência das operações de crédito.
156168
157169
Esta função é um *wrapper* para o método para a função ``get`` do módulo ``sgs``,

bcb/utils.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from datetime import date, datetime
2-
from typing import Union
2+
from typing import TypeAlias, Union
33

44
BRAZILIAN_REGIONS = {
55
"N": ["AC", "AP", "AM", "PA", "RO", "RR", "TO"],
@@ -12,9 +12,11 @@
1212
for state in BRAZILIAN_REGIONS.values():
1313
BRAZILIAN_STATES.extend(state)
1414

15+
DateInput: TypeAlias = Union[str, datetime, "Date", date]
16+
1517

1618
class Date:
17-
def __init__(self, d: Union[str, datetime, "Date", date], format: str = "%Y-%m-%d") -> None:
19+
def __init__(self, d: DateInput, format: str = "%Y-%m-%d") -> None:
1820
if isinstance(d, str):
1921
if d == "now" or d == "today":
2022
d = date.today()

0 commit comments

Comments
 (0)