Skip to content

Commit 8ad8a8b

Browse files
Merge pull request #15 from anapaulagomes/economia-regional-series
Adiciona busca das séries temporais de inadimplência das operações de crédito
2 parents 3aa1d72 + 5ae88db commit 8ad8a8b

12 files changed

Lines changed: 2182 additions & 135 deletions

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
21
# Changelog
32

3+
## Unpublished
4+
- Add Regional economy series support
5+
46
## [0.3.0] - 2024-06-12
57
- Dependencies updated
68

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pip install python-bcb
3131

3232
## SGS
3333
Utiliza o webservice do SGS
34-
(`Sistema Gerenciador de Séries Temporais <https://www3.bcb.gov.br/sgspub/>`_)
34+
([Sistema Gerenciador de Séries Temporais](https://www3.bcb.gov.br/sgspub/))
3535
para obter os dados.
3636

3737
## Conversor de Moedas
Lines changed: 134 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -1,131 +1,134 @@
1-
from io import StringIO
2-
3-
import requests
4-
import pandas as pd
5-
6-
from .utils import Date
7-
8-
"""
9-
Sistema Gerenciador de Séries Temporais (SGS)
10-
11-
O módulo ``sgs`` obtem os dados do webservice do Banco Central,
12-
interface json do serviço BCData/SGS -
13-
`Sistema Gerenciador de Séries Temporais (SGS)
14-
<https://www3.bcb.gov.br/sgspub/localizarseries/localizarSeries.do?method=prepararTelaLocalizarSeries>`_.
15-
"""
16-
17-
18-
class SGSCode:
19-
def __init__(self, code, name=None):
20-
if name is None:
21-
if isinstance(code, int) or isinstance(code, str):
22-
self.name = str(code)
23-
self.value = int(code)
24-
else:
25-
self.name = str(name)
26-
self.value = int(code)
27-
28-
29-
def _codes(codes):
30-
if isinstance(codes, int) or isinstance(codes, str):
31-
yield SGSCode(codes)
32-
elif isinstance(codes, tuple):
33-
yield SGSCode(codes[1], codes[0])
34-
elif isinstance(codes, list):
35-
for cd in codes:
36-
_ist = isinstance(cd, tuple)
37-
yield SGSCode(cd[1], cd[0]) if _ist else SGSCode(cd)
38-
elif isinstance(codes, dict):
39-
for cd in codes:
40-
yield SGSCode(codes[cd], cd)
41-
42-
43-
def _get_url_and_payload(code, start_date, end_date, last):
44-
payload = {"formato": "json"}
45-
if last == 0:
46-
if start_date is not None or end_date is not None:
47-
payload["dataInicial"] = Date(start_date).date.strftime("%d/%m/%Y")
48-
end_date = end_date if end_date else "today"
49-
payload["dataFinal"] = Date(end_date).date.strftime("%d/%m/%Y")
50-
url = "http://api.bcb.gov.br/dados/serie/bcdata.sgs.{}/dados".format(code)
51-
else:
52-
url = (
53-
"http://api.bcb.gov.br/dados/serie/bcdata.sgs.{}/dados" "/ultimos/{}"
54-
).format(code, last)
55-
56-
return {"payload": payload, "url": url}
57-
58-
59-
def _format_df(df, code, freq):
60-
cns = {"data": "Date", "valor": code.name, "datafim": "enddate"}
61-
df = df.rename(columns=cns)
62-
if "Date" in df:
63-
df["Date"] = pd.to_datetime(df["Date"], format="%d/%m/%Y")
64-
if "enddate" in df:
65-
df["enddate"] = pd.to_datetime(df["enddate"], format="%d/%m/%Y")
66-
df = df.set_index("Date")
67-
if freq:
68-
df.index = df.index.to_period(freq)
69-
return df
70-
71-
72-
def get(codes, start=None, end=None, last=0, multi=True, freq=None):
73-
"""
74-
Retorna um DataFrame pandas com séries temporais obtidas do SGS.
75-
76-
Parameters
77-
----------
78-
79-
codes : {int, List[int], List[str], Dict[str:int]}
80-
Este argumento pode ser uma das opções:
81-
82-
* ``int`` : código da série temporal
83-
* ``list`` ou ``tuple`` : lista ou tupla com códigos
84-
* ``list`` ou ``tuple`` : lista ou tupla com pares ``('nome', código)``
85-
* ``dict`` : dicionário com pares ``{'nome': código}``
86-
87-
Com códigos numéricos é interessante utilizar os nomes com os códigos
88-
para definir os nomes nas colunas das séries temporais.
89-
start : str, int, date, datetime, Timestamp
90-
Data de início da série.
91-
Interpreta diferentes tipos e formatos de datas.
92-
end : string, int, date, datetime, Timestamp
93-
Data de início da série.
94-
Interpreta diferentes tipos e formatos de datas.
95-
last : int
96-
Retorna os últimos ``last`` elementos disponíveis da série temporal
97-
solicitada. Se ``last`` for maior que 0 (zero) os argumentos ``start``
98-
e ``end`` são ignorados.
99-
multi : bool
100-
Define se, quando mais de 1 série for solicitada, a função retorna uma
101-
série multivariada ou uma lista com séries univariadas.
102-
freq : str
103-
Define a frequência a ser utilizada na série temporal
104-
105-
Returns
106-
-------
107-
108-
``DataFrame`` :
109-
série temporal univariada ou multivariada,
110-
quando solicitado mais de uma série (parâmetro ``multi=True``).
111-
112-
``list`` :
113-
lista com séries temporais univariadas,
114-
quando solicitado mais de uma série (parâmetro ``multi=False``).
115-
"""
116-
dfs = []
117-
for code in _codes(codes):
118-
urd = _get_url_and_payload(code.value, start, end, last)
119-
res = requests.get(urd["url"], params=urd["payload"])
120-
if res.status_code != 200:
121-
raise Exception("Download error: code = {}".format(code.value))
122-
df = pd.read_json(StringIO(res.text))
123-
df = _format_df(df, code, freq)
124-
dfs.append(df)
125-
if len(dfs) == 1:
126-
return dfs[0]
127-
else:
128-
if multi:
129-
return pd.concat(dfs, axis=1)
130-
else:
131-
return dfs
1+
from io import StringIO
2+
3+
import requests
4+
import pandas as pd
5+
6+
from bcb.utils import Date
7+
8+
"""
9+
Sistema Gerenciador de Séries Temporais (SGS)
10+
11+
O módulo ``sgs`` obtem os dados do webservice do Banco Central,
12+
interface json do serviço BCData/SGS -
13+
`Sistema Gerenciador de Séries Temporais (SGS)
14+
<https://www3.bcb.gov.br/sgspub/localizarseries/localizarSeries.do?method=prepararTelaLocalizarSeries>`_.
15+
"""
16+
17+
18+
class SGSCode:
19+
def __init__(self, code, name=None):
20+
if name is None:
21+
if isinstance(code, int) or isinstance(code, str):
22+
self.name = str(code)
23+
self.value = int(code)
24+
else:
25+
self.name = str(name)
26+
self.value = int(code)
27+
28+
def __repr__(self):
29+
return f"{self.code} - {self.name}" if self.name else f"{self.code}"
30+
31+
32+
def _codes(codes):
33+
if isinstance(codes, int) or isinstance(codes, str):
34+
yield SGSCode(codes)
35+
elif isinstance(codes, tuple):
36+
yield SGSCode(codes[1], codes[0])
37+
elif isinstance(codes, list):
38+
for cd in codes:
39+
_ist = isinstance(cd, tuple)
40+
yield SGSCode(cd[1], cd[0]) if _ist else SGSCode(cd)
41+
elif isinstance(codes, dict):
42+
for name, code in codes.items():
43+
yield SGSCode(code, name)
44+
45+
46+
def _get_url_and_payload(code, start_date, end_date, last):
47+
payload = {"formato": "json"}
48+
if last == 0:
49+
if start_date is not None or end_date is not None:
50+
payload["dataInicial"] = Date(start_date).date.strftime("%d/%m/%Y")
51+
end_date = end_date if end_date else "today"
52+
payload["dataFinal"] = Date(end_date).date.strftime("%d/%m/%Y")
53+
url = "http://api.bcb.gov.br/dados/serie/bcdata.sgs.{}/dados".format(code)
54+
else:
55+
url = (
56+
"http://api.bcb.gov.br/dados/serie/bcdata.sgs.{}/dados" "/ultimos/{}"
57+
).format(code, last)
58+
59+
return {"payload": payload, "url": url}
60+
61+
62+
def _format_df(df, code, freq):
63+
cns = {"data": "Date", "valor": code.name, "datafim": "enddate"}
64+
df = df.rename(columns=cns)
65+
if "Date" in df:
66+
df["Date"] = pd.to_datetime(df["Date"], format="%d/%m/%Y")
67+
if "enddate" in df:
68+
df["enddate"] = pd.to_datetime(df["enddate"], format="%d/%m/%Y")
69+
df = df.set_index("Date")
70+
if freq:
71+
df.index = df.index.to_period(freq)
72+
return df
73+
74+
75+
def get(codes, start=None, end=None, last=0, multi=True, freq=None):
76+
"""
77+
Retorna um DataFrame pandas com séries temporais obtidas do SGS.
78+
79+
Parameters
80+
----------
81+
82+
codes : {int, List[int], List[str], Dict[str:int]}
83+
Este argumento pode ser uma das opções:
84+
85+
* ``int`` : código da série temporal
86+
* ``list`` ou ``tuple`` : lista ou tupla com códigos
87+
* ``list`` ou ``tuple`` : lista ou tupla com pares ``('nome', código)``
88+
* ``dict`` : dicionário com pares ``{'nome': código}``
89+
90+
Com códigos numéricos é interessante utilizar os nomes com os códigos
91+
para definir os nomes nas colunas das séries temporais.
92+
start : str, int, date, datetime, Timestamp
93+
Data de início da série.
94+
Interpreta diferentes tipos e formatos de datas.
95+
end : string, int, date, datetime, Timestamp
96+
Data final da série.
97+
Interpreta diferentes tipos e formatos de datas.
98+
last : int
99+
Retorna os últimos ``last`` elementos disponíveis da série temporal
100+
solicitada. Se ``last`` for maior que 0 (zero) os argumentos ``start``
101+
e ``end`` são ignorados.
102+
multi : bool
103+
Define se, quando mais de 1 série for solicitada, a função retorna uma
104+
série multivariada ou uma lista com séries univariadas.
105+
freq : str
106+
Define a frequência a ser utilizada na série temporal
107+
108+
Returns
109+
-------
110+
111+
``DataFrame`` :
112+
série temporal univariada ou multivariada,
113+
quando solicitado mais de uma série (parâmetro ``multi=True``).
114+
115+
``list`` :
116+
lista com séries temporais univariadas,
117+
quando solicitado mais de uma série (parâmetro ``multi=False``).
118+
"""
119+
dfs = []
120+
for code in _codes(codes):
121+
urd = _get_url_and_payload(code.value, start, end, last)
122+
res = requests.get(urd["url"], params=urd["payload"])
123+
if res.status_code != 200:
124+
raise Exception("Download error: code = {}".format(code.value))
125+
df = pd.read_json(StringIO(res.text))
126+
df = _format_df(df, code, freq)
127+
dfs.append(df)
128+
if len(dfs) == 1:
129+
return dfs[0]
130+
else:
131+
if multi:
132+
return pd.concat(dfs, axis=1)
133+
else:
134+
return dfs

0 commit comments

Comments
 (0)