11import json
22from io import StringIO
3+ from typing import Dict , Generator , List , Optional , Tuple , TypeAlias , Union
34
45import pandas as pd
56import requests
67
7- from bcb .utils import Date
8+ from bcb .utils import Date , DateInput
89
910"""
1011Sistema Gerenciador de Séries Temporais (SGS)
1718
1819
1920class 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
0 commit comments