Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Gerar uma lista

Olá, pessoal! Eu consegui pegar esses dados do site da B3 e até consegui pegar apenas o conteúdo da tag.

<td class="text-center">114.355</td>
<td class="text-center">663.872.395</td>
<td class="text-center">13.281.572.347,49</td>
<td class="text-left">RRRP3T</td>
<td class="text-left">3R PETROLEUM ÓLEO E GÁS S.A</td>
<td class="text-left">ON      NM</td>
<td class="text-right">331</td>
<td class="text-right">402.750</td>
<td class="text-right">16.659.428,80</td>
<td class="text-left">AERI3T</td>
<td class="text-left">AERIS IND. E COM. DE EQUIP. GERACAO DE ENERGIA S/A</td>
<td class="text-left">ON      NM</td>
<td class="text-right">369</td>
<td class="text-right">1.320.200</td>
<td class="text-right">13.603.069,71</td>

Consegui também fazer um split:

['114.355']
['663.872.395']
['13.281.572.347,49']
['RRRP3T']
['3R', 'PETROLEUM', 'ÓLEO', 'E', 'GÁS', 'S.A']
['ON', 'NM']
['331']
['402.750']
['16.659.428,80']
['AERI3T']
['AERIS', 'IND.', 'E', 'COM.', 'DE', 'EQUIP.', 'GERACAO', 'DE', 'ENERGIA', 'S/A']
['ON', 'NM']
['369']
['1.320.200']
['13.603.069,71']

Mas quando tento transformar esses dados em uma lista,

dadosb3 = list(td.text.split())

o que obtenho é apenas 1 dado, que é o último deles. Ele não está no fragmento dos dados que mandei, pois são muitos dados.

['9.054.333,18']

Na verdade, eu precisaria transformar esses dados em um dataframe, mas como a aula é sobre listas, gostaria de aprender como fazer uma com esse tipo de dado. Será que alguém poderia me ajudar?

8 respostas

Oii Ubiratan, tudo bem?

Na verdade o método split() já faz o serviço de converter strings em listas, temos 2 tipos de conversão simples de strings para listas, que são: list() e o split() , que você já aprendeu em aula.

No caso do list(), uma string/palavra é transformada em lista, onde cada caracter da palavra vira um elemento individual da lista, como pode ver aqui:

teste="itens"
teste1 = list(teste)
teste1

A resposta obtida é

['i', 't', 'e', 'n', 's']

Já usando o método split(), que você já aprendeu em aula e utilizou, precisa passar um valor delimitador nele e caso isso não aconteça ele utiliza o espaço em branco como valor default. Fiz um exemplo também:

frase="Olá, como você está?"
frase1 = frase.split()
frase1

Como resposta temos:

['Olá,', 'como', 'você', 'está?']

Caso você queira concatenar listas, você pode literalmente somá-las, dessa forma aqui:

oi = teste1+frase1
oi

E o resultado é a junção das listas anteriores que te mostrei.

['i', 't', 'e', 'n', 's', 'Olá,', 'como', 'você', 'está?']

Depois de explicar como funcionam as listas, testei usar o método split() dentro do método list() como você fez e meu resultado não mudou, como pode ver no código abaixo:

frase="Olá, como você está?"
frase1 = list(frase.split())
frase1
['Olá,', 'como', 'você', 'está?']

O que me faz pensar que deve ter algum comando no resto do seu código que pode estar afetando seu resultado, você consegue me passar seu código completo? Se preferir compartilhar o notebook do Google Colab pode ser também!

Fico no seu aguardo :D

Muito obrigado pela aula, Sthefanie! Você tem uma ótima didática! O código que estou usando é o seguinte:

url = 'http://www.b3.com.br/pt_br/market-data-e-indices/servicos-de-dados/market-data/consultas/mercado-a-vista/termo/posicoes-em-aberto/posicoes-em-aberto-8AA8D0CC77D179750177DF167F150965.htm?data=16/04/2021&f=0#conteudo-principal'

html_page = requests.get(url)
html_source = html_page.text

soup = BeautifulSoup(html_source, 'html.parser')
td_tags = soup.find_all('td')
for td in td_tags:
    print(td)
for td in td_tags:
    print(td.text.split())
dadosb3 = list(td.text.split())
dadosb3

No final de tudo eu só preciso extrair essa tabela pra trabalhar no pandas com dataframe, mas não sei como fazê-lo. Já li muita coisa no stack e outros lugares, mas não consegui encontrar uma resposta. Obrigado!

solução!

Oii de novo! Como você está hoje?

Testei aqui e consegui fazer o que você queria, que era juntar a lista toda e mostrar ela, também deixei um começo de como transformar a sua lista em um dataframe Pandas, mas esse datraframe precisa melhorar e precisa fazer algumas limpezas, se você quiser, posso indicar cursos pra ti depois (ou até montar um plano de estudos) para te auxiliar na jornada de aprendizagem, só preciso saber qual suas metas aprendendo Python, ou qual projeto quer fazer.

Mas antes de você me responder isso, vou colocar o código que fiz e te explicar. Primeiro, os imports são os mesmos que você usou, apenas adicionei o Pandas e o Numpy para que fosse possível demonstrar sobre o dataframe.

import requests as requests
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np

Utilizei o código que você me mandou e substitui apenas a última parte, como pode ver aqui:

url = 'http://www.b3.com.br/pt_br/market-data-e-indices/servicos-de-dados/market-data/consultas/mercado-a-vista/termo/posicoes-em-aberto/posicoes-em-aberto-8AA8D0CC77D179750177DF167F150965.htm?data=16/04/2021&f=0#conteudo-principal'

html_page = requests.get(url)
html_source = html_page.text

soup = BeautifulSoup(html_source, 'html.parser')
td_tags = soup.find_all('td')
for td in td_tags:
    print(td)
for td in td_tags:
    print(td.text.split())
dadosb3 = []
for td in td_tags:
    dadosb3 += td
dadosb3

Nessa última parte note que foi feito um for pra concatenar todas as listas que estavam dentro de td_tags e armazenar numa lista nova e limpa chamada dadosb3, você lembra que falei que pra concatenar as listas era só usar o +? É isso mesmo que o for está fazendo, ele está juntando a lista vazia com todas as pequenas listas que temos em td_tags!

Agora com a lista pronta, da forma que você precisa, para transformar a lista em um dataframe, você precisa primeiro transformar ela num array Numpy, e depois em dataframe, mas você pode fazer assim:

dadosb = pd.DataFrame(np.array(dadosb3))
dadosb

Porém, quando você executar esse código, ele vai te retornar um dataframe com 2 colunas e 2109 linhas, a primeira coluna é um index que surge com a criação do dataframe (mas você pode retirar ela depois) e a outra coluna tem as informações de todas as 6 colunas que você pegou no site, sendo as 3 primeiras "lixo", que são as 3 colunas da tabela menor em cima da tabela que você queria pegar.

Aqui você pode ver como ficou o dataframe com aquelas linhas de código:

dataframe da lista que tinhamos anteriormente, ainda precisando de tratamentos

Para arrumar esse dataframe leva um pouco mais de tempo e conhecimentos, mas caso você queira saber como manipular melhor bancos de dados assim, recomendo fazer a formação Python para Data Science.

Caso você queira compartilhar suas motivações, metas e o que quer aprender, posso analisar e montar o plano de estudos como falei antes. Espero que dê tudo certo na sua jornada de aprendizagem conosco!!

Bons estudos ^^ e caso tenha mais alguma dúvida, pode chamar!

Boa tarde, estou ótimo e vc?

Sthefanie, você é demais!!!! Muitíssimo obrigado. Eu já vinha há meses tentando resolver isso. Já tinha buscado em tudo que é lugar, mas nunca encontrei algo tão direto e didático. Na verdade, até acho que devo ter encontrado, e não entendi.

O meu propósito aqui é exatamente me tornar um cientista de dados pra atuar na minha empresa, que está inserida no mercado financeiro.

Agora vou me esforçar pra conseguir renomear essas colunas pra poder manipular esses dados, pois, no final, preciso que cada coluna esteja acompanhada dos seus respectivos nomes como: código, empresa, tipo, quantidade de contratos, quantidade de ativos e valor de contratos, assim como está no site da B3.

Sem querer abusar, será que você pode me indicar algum documento onde eu ache isso? Mais uma vez, muitíssimo obrigado! Forte abraço!

Oii Ubiratan, como você está?

Fico feliz que consegui te ajudar, todos temos inícios e as vezes demoramos achar alguma coisa ou outra, já passei muito por isso também hehe

Tenho certeza que com a sua determinação se tornará um ótimo cientista de dados, e no que precisar estamos por aqui pra auxiliar!

Agora sobre a manipulação do banco de dados, a formação Python para Data Science que eu sugeri pra ti vai te ajudar a aprender tudo sobre essas manipulações com o Pandas e outras bibliotecas, recomendo fortemente fazer a formação.

Existe um curso de Python Pandas que tem muito sobre esse tratamento de banco de dados, mas ele tem pré-requisito de outro curso, então sugiro mesmo fazer a formação desde o início para ter uma boa base de Python. Uma base forte é essencial para tudo na nossa vida :D

Espero que tenha te ajudado mais uma vez, e caso ainda precise de mais alguma coisa, só me chamar ^^

Oi, Sthefanie! Você está coberta de razão! Eu tenho umas dúvidas que não consegui tirar estudando listas, nem tuplas ou dicionários. Por exemplo, se eu pego uma planilha com dados dos mesmos produtos e preços que vão sendo atualizados dia a dia, a partir de um tempo, eu consigo entender o histórico de preços de um dado produto, certo? Isso seria uma série, não seria? Mas como funcionaria essa entrada diária de planilhas ou tabelas no python?

Oii Ubiratan, tudo bem?

Desculpa não te responder nesse meio tempo, as vezes passam despercebidos perguntas dentro de outras aqui no fórum! Mas seria uma análise de série temporal sim, isso mesmo. Sua entrada de dados depende de como pensa em fazer o sistema, se você continuar fazendo suas análises com arquivos csv, você pode atualizar eles diariamente, por exemplo, ou se esses produtos você retira os valores da internet, consegue fazer um web scraping que salve num csv, todos os dias.

Temos o curso de séries temporais que você pode fazer, esse aqui, qualquer coisa é só me chamar, ok?

Olá, Sthefanie! Tudo bem?

Tive problemas pra pegar os dados na B3 com requests, pois eles colocam uma trava no número de acessos. Aí tive que parar tudo pra aprender um pouco de Selenium. Consigo chegar na lista com todos os dados, mas continuo tendo problema pra gerar um dataframe disso.

from selenium.webdriver import Firefox
import pandas as pd
import numpy as np

url = ('https://www2.bmf.com.br/pages/portal/bmfbovespa/lumis/lum-tipo-de-participante-ptBR.asp')


firefox = Firefox()
firefox.get(url)

x = firefox.find_elements_by_tag_name('tr')

for tr in x:
    y = tr.text

for tr in x:
    print(tr.text.split())

dados= []
for tr in x:
    dados += tr

dadosb3 = pd.DataFrame(np.array(dados))
print(dadosb3)

Então, recebo os dados como output normalmente, em forma de listas. Porém, na hora de gerar o dataframe, olha a mensagem:

ErrodfVocê poderia continuar me ajudando? Obrigado!