Será que é possível utilizar a linguagem Python dentro do Power BI para extrair e transformar dados e ainda gerar visualizações com eles?
Meu nome é Afonso Rios. Sou instrutor na Escola de Data Science na Alura.
Audiodescrição: Afonso Rios se identifica como um homem de pele morena, com olhos, cabelos e barba castanho-escuros. Usa headphones e uma camisa preta com alguns detalhes em verde que remetem à escola de dados. Ao fundo, uma parede na cor azul, cinza e branca, com alguns detalhes remetendo à Alura e ao futebol, e iluminação azul.
Neste curso, vamos atuar como analista de dados de uma consultoria financeira que trabalha com ativos da bolsa brasileira, denominada Bulltrend. Pretendemos construir um relatório para auxiliar o time de consultoria a analisar os ativos das carteiras da nossa clientela.
Para isso, vamos utilizar Python juntamente com o Power BI, de maneira a extrair, transformar e carregar estes dados para gerar um dashboard.
Em nossa jornada, vamos aprender a:
Tudo isso tem como objetivo gerar um dashboard para auxiliar nosso time de consultoria. É bastante conteúdo, não é mesmo?
Para que você tenha a melhor experiência possível, é recomendado que você já possua alguns conhecimentos na linguagem Python e em algumas bibliotecas de manipulação e visualização de dados, como Pandas, NumPy, Matplotlib e Seaborn.
Também é importante que já saiba construir seus primeiros dashboards utilizando o Power BI.
Com as expectativas alinhadas, vamos começar a construir nosso dashboard?
Observação: A versão da biblioteca Pandas utilizada no curso é a 1.4 (
!pip install pandas==1.4
)
Você é uma pessoa que trabalha como analista de dados de uma consultoria financeira chamada Bulltrend, que visualiza os diversos ativos de clientes, apresentando bons ativos e também verificando sua evolução.
Para isso, você precisará extrair dados de cotações e dados fundamentalistas, que fornecem um panorama sobre a saúde financeira de algumas empresas para que a clientela consiga estruturar as suas carteiras e você consiga acompanhar essa evolução.
Nesse ponto, vamos trabalhar com duas vertentes, que seriam as análises fundamentalistas e as análises gráficas
A análise fundamentalista refere-se à saúde financeira da empresa, portanto, iremos lidar bastante com patrimônios, receitas e despesas.
Já a análise gráfica, será baseada em cotações, que é o valor daquela determinada empresa naquele momento específico. Portanto, vamos observar essas flutuações e como esses valores se alteram de acordo com o tempo.
Para isso, precisamos identificar os melhores fundamentos, os melhores indicadores para incluir no nosso projeto e, claro, combiná-los com as ferramentas do Python e do Power BI.
Você vai analisar esses dados, desde a parte da extração até a carga e a geração de um dashboard, de um único relatório, apresentando os dados tanto das cotações quanto dos indicadores.
Para isso, será muito importante, primeiramente, construir esse código de extração usando as bibliotecas do Python. No nosso projeto, vamos trabalhar com duas bibliotecas. A biblioteca yfinance
da Yahoo Finance, que faz a obtenção dos dados por meio de uma API no site da Yahoo Finance.
Esse site fornece dados não só de cotações, como também de fundamentalistas, mas, para o nosso projeto, vamos trabalhar apenas com dados de cotações nessa biblioteca.
E a biblioteca fundamentus
, que oferece esses dados fundamentalistas a partir do site da Fundamentus, utilizando essa API para extrair esses dados para construção das nossas tabelas.
Sendo assim, vamos trabalhar com essas duas bases de dados, uma base separada com as cotações e outra base separada com os indicadores fundamentalistas e com as variáveis que indicam a saúde de uma empresa.
Vamos acessar o ambiente do Colab e realizar a importação dessas duas bibliotecas que serão utilizadas no nosso projeto. Vamos executar a célula com as bibliotecas fundamentus
e yfinance
que está abaixo do título "instalando as bibliotecas no ambiente do Colab":
!pip install fundamentus yfinance
Ao rodar esse código com "Ctrl + Enter", a instalação das bibliotecas será feita, sendo uma relacionada ao site Fundamentus e outra ao site da Yahoo Finance.
Essas duas bibliotecas são muito importantes para a análise de dados, além de que esses dados são abertos. Portanto, conseguimos acessá-los e fazer bom uso deles em nosso projeto.
Já instalamos as duas bibliotecas que vamos utilizar. No próximo vídeo, vamos começar a extrair os dados das cotações. Vamos lá?
Observação: Durante a aula, no tempo 07:19, o instrutor realizará uma alteração no nome da coluna, substituindo
level1
porAtivo
. No entanto, a coluna a ser renomeada deve serTicker
paraAtivo
. O código correto para essa modificação é :cotacoes = cotacoes.reset_index().rename(columns={"Ticker": "Ativo"})
.
Para construir nosso projeto, antes de gerar o dashboard, precisaremos extrair os dados e as cotações de uma carteira. Usaremos uma carteira hipotética, de um único cliente, com dez ativos que estarão dentro de uma lista.
No entanto, antes de importar essa lista, precisamos trazer a biblioteca que vamos utilizar, a yfinance
.
Para fazer isso, vamos importar da biblioteca yfinance
, escrevendo import yfinance
e o alias as yf
.
# Importando a biblioteca
import yfinance as yf
Após importar a biblioteca para o nosso projeto, vamos buscar a carteira de dez ativos. Todos os ativos estão finalizados com .SA
, que é a forma como ações brasileiras são lidas pela biblioteca yfinance
.
# Definindo a carteira de ações
carteira_yf = ['ABEV3.SA', 'B3SA3.SA', 'ELET3.SA', 'GGBR4.SA', 'ITSA4.SA',
'PETR4.SA', 'RENT3.SA', 'SUZB3.SA', 'VALE3.SA', 'WEGE3.SA']
Vamos rodar nossa carteira_yf
para defini-la e para extrair somente os valores dentro dela.
Agora vamos carregar esses dados para nosso DataFrame chamado df
. Mas para isso, precisamos selecionar um período.
Para que a sua reprodução seja a mesma da nossa, vamos fazer um alinhamento:
Vamos trabalhar com o período de 1º de agosto de 2022 até 1º de agosto de 2023. Se você se sentir confortável, pode aumentar ou modificar esse período, apenas levando em conta que o ativo precisa ter negociação na data que você escolher.
Para começar, vamos criar um df
que será igual à yf.download()
. Dentro de download()
, precisaremos trazer três parâmetros diferentes.
O primeiro parâmetro será a carteira ou o ticker que vamos utilizar.
Ticker se refere ao nome do papel. Portanto, como você encontrará essa empresa dentro da bolsa de valores? É a partir desse ticker, que seria este nome com quatro letras e um número ou dois números dentro da bolsa brasileira. Claro que em outras bolsas será um pouco diferente.
Por exemplo, usamos as quatro letras ABEV
e o número 3
. Será assim para todos os tipos de tickers. Mas no nosso caso, usaremos uma lista, pois queremos trazer todos os dez valores juntos.
Portanto, o primeiro parâmetro será carteira_yf
, que serão os tickers dos quais vamos extrair os dados.
Os outros dois parâmetros serão a data de início e fim. Para iniciar, usaremos start
e passaremos um texto entre aspas. Este texto estará no formato de ano, mês e dia (YYYY-MM-DD
), que é o período que queremos definir. Portanto, será 2022-08-01
entre aspas, referente a 1º de agosto de 2022.
Agora, passamos o período final que será end
igual à 2023-08-01
entre aspas. Assim, vamos fazer a carga do DataFrame
# Carregando os dados da carteira
df = yf.download(carteira_yf, start="2022-08-01", end="2023-08-01")
10 of 10 completed
Com isso, carregamos todos os dez ativos que possuem uma série de dados com os quais vamos trabalhar.
Para visualizar o nosso DataFrame, vamos utilizar o df.head(3)
, exibindo assim somente as três primeiras linhas.
df.head(3)
- | Adj Close | - | - | - | - | - | - | - | - | - | … | Volume | - | - | - | - | - | - | - | - | - |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Date | ABEV3.SA | B3SA3.SA | ELET3.SA | GGBR4.SA | ITSA4.SA | PETR4.SA | RENT3.SA | SUZB3.SA | VALE3.SA | WEGE3.SA | … | ABEV3.SA | B3SA3.SA | ELET3.SA | GGBR4.SA | ITSA4.SA | PETR4.SA | RENT3.SA | SUZB3.SA | VALE3.SA | WEGE3.SA |
2022-08-01 | 13.897732 | 10.545437 | 46.199085 | 19.448982 | 7.204308 | 19.308052 | 55.758350 | 45.813416 | 61.271076 | 27.456799 | … | 34565900 | 26237600 | 12239200 | 13879215 | 23302400 | 81365100 | 6737700 | 7127600 | 38874000 | 8202200 |
2022-08-02 | 13.973727 | 10.477528 | 46.556755 | 20.048803 | 7.271795 | 19.394045 | 56.021736 | 46.189804 | 63.224045 | 27.949211 | … | 12515800 | 29130100 | 7477600 | 13398945 | 14225860 | 69147100 | 4847800 | 4379000 | 32636900 | 7214800 |
2022-08-03 | 13.897732 | 10.826777 | 46.705784 | 19.235350 | 7.330847 | 19.405508 | 57.767841 | 45.678299 | 60.767082 | 27.693161 | … | 19576600 | 29172900 | 8281500 | 25537890 | 22885280 | 65544500 | 4904200 | 4451900 | 31934600 | 6627100 |
No DataFrame gerado, temos a coluna de índice chamada Date
que vem com as datas diárias.
No cabeçalho, temos duas colunas, ou seja, trabalhamos com multi-colunas, a Adj Close
(fechamento ajustado) e Volume
. A presença das reticências indica que temos muitas colunas dentro do DataFrame.
Abaixo deles, temos outra sequência de colunas que são todos os ativos com os quais trabalhamos. Note que eles são repetidos de 10 em 10 até concluir todas as 60 colunas.
Porém, o DataFrame ficou muito grande e não conseguimos entender muito bem o que esses dados significam. Mas, como podemos tratar esses dados para poder compreendê-los melhor?
Vamos utilizar uma função do Pandas utilizada pelo Yahoo Finance, chamada stack()
que significa pilha em inglês. Essa função transformar essas colunas que estão em formato de linhas em uma única coluna, colocando seus dados empilhados.
Para utilizá-lo, vamos criar outro DataFrame chamado cotacoes
que vai receber um df.stack()
. O stack()
recebe alguns parâmetros, dentre eles, o nível da coluna que queremos empilhar.
A primeira coluna, onde está o Adj Close
e Volume
é a coluna 0
, enquanto a coluna de baixo é a coluna 1
. Assim como no índice, começamos a contar a partir do zero. Por isso, nesse caso, vamos passar o parâmetro level
igual à 1
.
Por fim, vamos ler o resultado do DataFrame cotacoes
.
# Passando os ativos para o multindex do df
cotacoes = df.stack(level = 1)
cotacoes
Date | - | Adj Close | Close | High | Low | Open | Volume |
---|---|---|---|---|---|---|---|
2022-08-01 | ABEV3.SA | 13.897732 | 14.630000 | 14.890000 | 14.430000 | 14.860000 | 34565900 |
- | B3SA3.SA | 10.545437 | 10.870000 | 11.120000 | 10.710000 | 11.020000 | 26237600 |
- | ELET3.SA | 46.199085 | 46.500000 | 46.889999 | 45.660000 | 45.799999 | 12239200 |
- | GGBR4.SA | 19.448982 | 22.542856 | 23.457142 | 22.380953 | 23.457142 | 13879215 |
- | ITSA4.SA | 7.204308 | 7.763636 | 7.890909 | 7.681818 | 7.863636 | 23302400 |
… | … | … | … | … | … | … | … |
2023-07-31 | PETR4.SA | 29.967674 | 31.110001 | 31.150000 | 30.299999 | 30.299999 | 91290800 |
- | RENT3.SA | 67.220001 | 67.220001 | 67.660004 | 66.440002 | 67.040001 | 5966900 |
- | SUZB3.SA | 48.070000 | 48.070000 | 48.610001 | 47.340000 | 47.389999 | 4602700 |
- | VALE3.SA | 67.134636 | 69.160004 | 69.680000 | 67.839996 | 68.000000 | 26065700 |
- | WEGE3.SA | 39.919998 | 39.919998 | 40.290001 | 39.810001 | 40.290001 | 7141800 |
Com isso, já conseguimos notar uma grande diferença. Ao invés de várias colunas, o nosso DataFrame tem várias linhas. Por isso, são colocadas as reticências para indicar a omissão de algumas das 2500 linhas.
Foram criados dois índices, o índice que vai ter os dados agrupados da data e outro índice com os valores dos ativos. Para utilizar esses dados no Power BI, precisamos transformar os índices em colunas.
Para que todos os dados sejam colunas, precisamos resetar o índice, trazendo os dados de data e ativos para coluna.
Em uma célula vazia, vamos escrever cotacoes
igual à cotacoes.reset_index()
.
Além disso, vamos renomear a coluna de índice com os ativos que não tem um nome visível. Quando trabalhamos com stack()
, esse nome é transformado em level_numero
, sendo o número do nível em que estava. Por exemplo, se colocamos level
como 1
anteriormente, o nome será level_1
.
Para fazer essa troca pelo nome Ativo
, devemos usar a função rename()
. Dentro de rename()
, vamos passar o parâmetro columns
igual à, entre chaves, "level_1": "Ativo"
.
# Resetando os índices e renomenado a coluna dos ativos
cotacoes = cotacoes.reset_index().rename(columns={"level_1": "Ativo"})
Assim, vamos transformar os dois índices em colunas e renomear a coluna level_1
para Ativo
.
Finalmente, vamos organizar os dados removendo as colunas que não serão necessárias para o projeto como, por exemplo: Volume
e Adj Close
. Apenas os valores da data, OHLC (Open
, High
, Low
e Close
) e Ativo
serão utilizados.
Os valores OHLC são os valores de abertura, máximos, mínimos e de fechamento dos ativos. São essenciais para analisar as cotações de nossos ativos, pois representam as informações mais relevantes negociadas durante o dia.
Eles são importantes para analisar não apenas essa flutuação, mas também prever como uma ação pode se comportar nos próximos dias.
Assim, eles são muito relevantes dentro da análise gráfica, também conhecida como análise técnica, que usa essas variações como maneiras de entender como a ação está performando ao longo do tempo.
# Organizando o df
cotacoes = cotacoes[["Date", "Open", "High", "Low", "Close", "Ativo"]]
cotacoes.head(10)
Agora, vamos rodar o código para verificar os nossos valores.
Date | Open | High | Low | Close | Ativo |
---|---|---|---|---|---|
2022-08-01 | 14.860000 | 14.890000 | 14.430000 | 14.630000 | ABEV3.SA |
2022-08-01 | 11.020000 | 11.120000 | 10.710000 | 10.870000 | B3SA3.SA |
2022-08-01 | 45.799999 | 46.889999 | 45.660000 | 46.500000 | ELET3.SA |
2022-08-01 | 23.457142 | 23.457142 | 22.380953 | 22.542856 | GGBR4.SA |
2022-08-01 | 7.863636 | 7.890909 | 7.681818 | 7.763636 | ITSA4.SA |
2022-08-01 | 34.000000 | 34.150002 | 33.220001 | 33.680000 | PETR4.SA |
2022-08-01 | 57.400002 | 57.880001 | 56.799999 | 57.160000 | RENT3.SA |
2022-08-01 | 48.360001 | 48.360001 | 46.950001 | 47.470001 | SUZB3.SA |
2022-08-01 | 68.940002 | 69.849998 | 67.930000 | 68.080002 | VALE3.SA |
2022-08-01 | 28.040001 | 28.680000 | 27.770000 | 27.879999 | WEGE3.SA |
Os dados já estão ajustados no formato Date
, OHLC e Ativo
.
Agora, vamos também rodar cotacoes.info()
para verificar como esses dados estão sendo representados.
cotacoes.info()
# | Column | Non-Null Count | Dtype |
---|---|---|---|
0 | Date | 2500 non-null | datetime64[ns] |
1 | Open | 2500 non-null | float64 |
2 | High | 2500 non-null | float64 |
3 | Low | 2500 non-null | float64 |
4 | Close | 2500 non-null | float64 |
5 | Ativo | 2500 non-null | object |
O Date
tem o formato de tempo dateTime64
, enquanto os valores de Open
, High
, Low
e Close
estão no formato de número flutuante (decimal) e o Ativo
está no formato de objeto. Logo, está tudo certo.
Todos os processos que fizemos nesse mesmo vídeo estão sendo previstos dentro desse código completo:
# Código completo da obtenção dos dados históricos das cotações da carteira de 01/08/2022 à 01/08/2023
# Importando a biblioteca
import yfinance as yf
# Definindo a carteira de ações
carteira_yf = ['ABEV3.SA', 'B3SA3.SA', 'ELET3.SA', 'GGBR4.SA', 'ITSA4.SA',
'PETR4.SA', 'RENT3.SA', 'SUZB3.SA', 'VALE3.SA', 'WEGE3.SA']
# Carregando os dados da carteira
df = yf.download(carteira_yf, start="2022-08-01", end="2023-08-01")
# Passando os ativos para o multindex do df
cotacoes = df.stack(level=1)
# Resetando os índices e renomenado a coluna dos ativos
cotacoes = cotacoes.reset_index().rename(columns={'level_1': 'Ativo'})
# Organizando o df
cotacoes = cotacoes[["Date", "Open", "High", "Low", "Close", "Ativo"]]
del carteira_yf, df
Esse será o código que vamos utilizar para copiar e colar dentro do Power BI.
Como boa prática, estamos usando a função del
para deletar variáveis que são auxiliares, utilizadas apenas para construir aquele DataFrame. Pois o que nos importa é a tabela cotacoes
. Portanto, vamos excluir tanto carteira_yf
quanto o df
dos nossos valores, mantendo apenas o DataFrame de cotacoes
.
Já conseguimos extrair os dados das cotações dos ativos para análise gráfica. Agora, vamos trabalhar em extrair os dados fundamentalistas e os dados gerais de um ativo para também trabalhar com a análise fundamentalista. Porém, isso será abordado nos próximos vídeos.
O curso Python e Power BI: analisando dados do mercado financeiro possui 195 minutos de vídeos, em um total de 63 atividades. Gostou? Conheça nossos outros cursos de Business Intelligence em Data Science, ou leia nossos artigos de Data Science.
Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.