Source code for seriesbr.bcb.series
import pandas as pd
from seriesbr.utils import session, dates
from datetime import datetime
from typing import Tuple, TypedDict, Literal
DATE_FORMAT = "%d/%m/%Y"
[docs]def get_series(
code: int,
start: str = None,
end: str = None,
last_n: int = None,
) -> pd.DataFrame:
"""
Get multiple BCB time series.
Parameters
----------
code : int
Series identifier.
start : str, optional
Initial date.
end : str, optional
Final date.
last_n : int, optional
Number of last observations.
Returns
-------
pandas.DataFrame
"""
url, params = build_url(code, start, end, last_n)
response = session.get(url, params=params)
json = response.json()
return build_df(json, code)
BcbOptionalUrlParams = TypedDict(
"BcbOptionalUrlParams", {"dataInicial": str, "dataFinal": str}, total=False
)
BcbDefaultUrlParams = TypedDict(
"BcbDefaultUrlParams",
{"format": Literal["json"]},
)
class BcbUrlParams(BcbDefaultUrlParams, BcbOptionalUrlParams):
pass
def build_url(
code: int, start: str = None, end: str = None, last_n: int = None
) -> Tuple[str, BcbUrlParams]:
url = f"https://api.bcb.gov.br/dados/serie/bcdata.sgs.{code}/dados"
params: BcbUrlParams = {"format": "json"}
if last_n:
url += f"/ultimos/{last_n}"
return url, params
if not start and not end:
return url, params
start_date = dates.parse_start_date(start) if start else dates.UNIX_EPOCH
params["dataInicial"] = start_date.strftime(DATE_FORMAT)
end_date = dates.parse_end_date(end) if end else datetime.today()
params["dataFinal"] = end_date.strftime(DATE_FORMAT)
return url, params
def build_df(json: dict, code: int) -> pd.DataFrame:
df = pd.DataFrame(json)
df["valor"] = df["valor"].astype("float64")
df["data"] = pd.to_datetime(df["data"], format="%d/%m/%Y")
df = df.rename(columns={"data": "Date", "valor": str(code)})
df = df.set_index("Date")
return df