Skip to content

Commit 758c915

Browse files
committed
deploy: 1938280
1 parent f7d0c96 commit 758c915

10 files changed

Lines changed: 181 additions & 115 deletions

File tree

_images/sgs1.png

219 Bytes
Loading

_images/taxajuros1.png

-122 Bytes
Loading

_sources/odata.rst.txt

Lines changed: 55 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ OData
55
Diversas APIs disponíveis no `portal de dados abertos <https://dadosabertos.bcb.gov.br/>`_ do Banco Central
66
implementam o protocolo `OData <https://www.odata.org/>`_, são centenas de APIs.
77

8-
O ``python-bcb`` tem algumas classes que implementam algumas APIs OData:
8+
O ``python-bcb`` tem algumas classes que implementam APIs OData:
99

1010
- :py:class:`bcb.odata.api.Expectativas`: Expectativas de mercado para os indicadores macroeconômicos da Pesquisa Focus
1111
- :py:class:`bcb.odata.api.PTAX`: Dólar comercial
@@ -44,13 +44,15 @@ o nome do *endpoint*.
4444
4545
pix.describe('PixLiquidadosAtual')
4646
47-
Vemos que o *endpoint* ``PixLiquidadosAtual`` retorna uma tabela com 4 propriedades:
47+
Vemos que o *endpoint* ``PixLiquidadosAtual`` retorna 4 propriedades:
4848

4949
- ``Data<datetime>``: data das operações
5050
- ``Quantidade<int>``: quantidade de operações realizadas na data
5151
- ``Total<float>``: financeiro das operações realizdas na data
5252
- ``Media<float>``: média das operações realizadas na data
5353

54+
As propriedades são formatadas como colunas em um DataFrame.
55+
5456
Para acessar os dados deste *endpoint* é necessário obter um objeto com o *endpoint* e executar uma ``query`` nesse
5557
objeto.
5658
O método ``get_endpoint`` retorna um objeto da classe :py:class:`bcb.odata.api.Endpoint`.
@@ -67,45 +69,67 @@ A consulta retorna um DataFrame pandas onde as colunas são as propriedades do *
6769
Veremos abaixo, com mais detalhes, como realizar consultas nas APIs e quais os tipos de *endpoints* disponíveis
6870
(``EntitySets`` e ``FunctionImports``).
6971

70-
.. TODO: fazer uma sessão, Como Realizar Consultas
72+
Como Realizar Consultas em APIs OData
73+
-------------------------------------
74+
75+
As consultas são realizadas através do método ``query`` da classe :py:class:`bcb.odata.api.Endpoint`.
76+
Este método retorna um objeto :py:class:`bcb.odata.framework.ODataQuery` que abstrai a consulta e permite executar
77+
algumas firulas como: filtros e ordenação.
78+
A classe :py:class:`bcb.odata.framework.ODataQuery` tem os seguintes métodos:
79+
80+
- :py:meth:`bcb.odata.framework.ODataQuery.filter`: define filtros na consulta, com uma clausula ``where`` no SQL.
81+
- :py:meth:`bcb.odata.framework.ODataQuery.select`: seleciona as propriedades retornadas pela consulta.
82+
- :py:meth:`bcb.odata.framework.ODataQuery.orderby`: ordena a consulta pelas propriedades.
83+
- :py:meth:`bcb.odata.framework.ODataQuery.limit`: limita os resultados a ``n`` registros.
84+
- :py:meth:`bcb.odata.framework.ODataQuery.skip`: *pula* os ``n`` primeiros registros da consulta.
85+
- :py:meth:`bcb.odata.framework.ODataQuery.parameters`: *endpoints* do tipo ``FunctionImports`` possuem parâmetros que são definidos por este método.
86+
- :py:meth:`bcb.odata.framework.ODataQuery.collect`: o *framework* tem uma abordagem *lazy*, dessa forma, este método realiza a consulta trazendo os dados e retornando um DataFrame.
87+
- :py:meth:`bcb.odata.framework.ODataQuery.show`: imprime a estrutura da consulta.
7188

72-
Classe :py:class:`bcb.odata.api.BaseODataAPI`
73-
---------------------------------------------
89+
Os métodos ``filter``, ``select``, ``orderby``, ``limit``, ``skip`` e ``parameters`` retornam o objeto
90+
:py:class:`bcb.odata.framework.ODataQuery`, e isso permite a realização de chamadas aninhadas que compõem a consulta.
7491

75-
Todas as classes que implementam um API OData herdam de :py:class:`bcb.odata.api.BaseODataAPI`, que faz a integração
76-
com as APIs OData e realiza consultas na API retornando as propriedades em um ``DataFrame``.
92+
Por exemplo, na consulta do PIX, as datas não estão ordenadas, temos dias de 2021, 2022 e 2023 nos 10 registros
93+
retornados.
94+
Vamos ordernar pela propriedade ``Data`` de forma decrescente.
95+
96+
.. ipython:: python
7797
78-
A classe :py:class:`bcb.odata.api.BaseODataAPI` possui apenas 2 métodos:
98+
ep.query().orderby(ep.Data.desc()).limit(10).collect()
7999
80-
- :py:meth:`bcb.odata.api.BaseODataAPI.describe`: imprime informações da API, como
81-
quais *endpoints* estão disponíveis. Passando o nome do *endpoint*
82-
o método imprime as informações do que é retornado pelo *endpoint* e
83-
o se há algum parâmetro necessário, caso seja uma função.
84-
- :py:meth:`bcb.odata.api.BaseODataAPI.get_endpoint`: retorna um objeto
85-
:py:class:`bcb.odata.api.Endpoint` referente ao nome do *endpoint* fornecido.
100+
Veja que a consulta retorna as datas mais recentes primeiro.
86101

102+
Gosto de estruturar as consultas como uma *query* SQL.
103+
Sigamos com um exemplo:
87104

88-
Classe :py:class:`bcb.odata.api.Endpoint`
89-
-----------------------------------------
105+
.. code:: SQL
90106
91-
Os *endpoints* retornados herdam da classe :py:class:`bcb.odata.api.Endpoint`,
92-
que possui o método :py:meth:`bcb.odata.api.Endpoint.query`, através do qual são
93-
realizadas as consultas estruturadas na API OData.
107+
select Data, Media
108+
from PIX
109+
where Data >= '2023-01-01'
110+
order by Media desc
111+
limit 10
94112
95-
Classe :py:class:`bcb.odata.framework.ODataQuery`
96-
-------------------------------------------------
113+
Quero obter os 10 dias em 2023 que apresentam as maiores médias transacionadas no PIX.
97114

98-
:py:meth:`bcb.odata.api.Endpoints.query` retorna um objeto :py:class:`bcb.odata.framework.ODataQuery`
99-
que possui os seguintes métodos.
115+
Para executar essa query utilizo o método ``select`` passando as propriedades Data e Media,
116+
encadeio o método ``filter`` filtrando a propriedade Data maiores que 2023-01-01, e note
117+
que aqui utilizo um objeto ``datetime``, pois na descrição do *endpoint* ``PixLiquidadosAtual``
118+
a propriedade Data é do tipo ``datetime``.
119+
Sigo com o método ``orderby`` passando a propriedade média e indicando que a ordenação é decrescente e concluo com
120+
o método ``limit`` para obter os 10 primeiros registros.
121+
Na última linha executo o método ``collect`` que executa a consulta e retorna um DataFrame com os resultados.
122+
123+
.. ipython:: python
124+
125+
from datetime import datetime
126+
(ep.query()
127+
.select(ep.Data, ep.Media)
128+
.filter(ep.Data >= datetime(2023, 1, 1))
129+
.orderby(ep.Media.desc())
130+
.limit(10)
131+
.collect())
100132
101-
- :py:meth:`bcb.odata.framework.ODataQuery.filter`
102-
- :py:meth:`bcb.odata.framework.ODataQuery.select`
103-
- :py:meth:`bcb.odata.framework.ODataQuery.orderby`
104-
- :py:meth:`bcb.odata.framework.ODataQuery.limit`
105-
- :py:meth:`bcb.odata.framework.ODataQuery.skip`
106-
- :py:meth:`bcb.odata.framework.ODataQuery.parameters`
107-
- :py:meth:`bcb.odata.framework.ODataQuery.collect`
108-
- :py:meth:`bcb.odata.framework.ODataQuery.show`
109133
110134
Aplicações
111135
----------

_static/images/savefig/sgs1.png

219 Bytes
Loading
-122 Bytes
Loading

expectativas.html

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -322,16 +322,16 @@ <h1>Expectativas<a class="headerlink" href="#expectativas" title="Link permanent
322322
<span class="gp"> ...: </span>
323323
<span class="gh">Out[8]: </span>
324324
<span class="go"> Data Media Mediana</span>
325-
<span class="go">0 2023-06-30 4.7652 4.9135</span>
326-
<span class="go">1 2023-06-29 4.8611 4.9135</span>
327-
<span class="go">2 2023-06-28 4.8611 4.9135</span>
328-
<span class="go">3 2023-06-27 4.8611 4.9135</span>
329-
<span class="go">4 2023-06-26 4.8464 4.8400</span>
330-
<span class="go">5 2023-06-23 4.8464 4.8400</span>
331-
<span class="go">6 2023-06-22 4.9072 4.9972</span>
332-
<span class="go">7 2023-06-21 4.9072 4.9972</span>
333-
<span class="go">8 2023-06-20 4.9072 4.9972</span>
334-
<span class="go">9 2023-06-19 4.9072 4.9972</span>
325+
<span class="go">0 2023-07-07 4.7611 4.9135</span>
326+
<span class="go">1 2023-07-06 4.7652 4.9135</span>
327+
<span class="go">2 2023-07-05 4.7652 4.9135</span>
328+
<span class="go">3 2023-07-04 4.7652 4.9135</span>
329+
<span class="go">4 2023-07-03 4.7652 4.9135</span>
330+
<span class="go">5 2023-06-30 4.7652 4.9135</span>
331+
<span class="go">6 2023-06-29 4.8611 4.9135</span>
332+
<span class="go">7 2023-06-28 4.8611 4.9135</span>
333+
<span class="go">8 2023-06-27 4.8611 4.9135</span>
334+
<span class="go">9 2023-06-26 4.8464 4.8400</span>
335335
</pre></div>
336336
</div>
337337
</section>

index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,6 @@ <h1>Uso<a class="headerlink" href="#uso" title="Link permanente para este cabeç
290290
<span class="gh">Out[2]: </span>
291291
<span class="go"> IPCA</span>
292292
<span class="go">Date </span>
293-
<span class="go">2022-06-01 0.67</span>
294293
<span class="go">2022-07-01 -0.68</span>
295294
<span class="go">2022-08-01 -0.36</span>
296295
<span class="go">2022-09-01 -0.29</span>
@@ -302,6 +301,7 @@ <h1>Uso<a class="headerlink" href="#uso" title="Link permanente para este cabeç
302301
<span class="go">2023-03-01 0.71</span>
303302
<span class="go">2023-04-01 0.61</span>
304303
<span class="go">2023-05-01 0.23</span>
304+
<span class="go">2023-06-01 -0.08</span>
305305
</pre></div>
306306
</div>
307307
<div class="toctree-wrapper compound">

objects.inv

-31 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)