Ler e gravar dados no pandas: carregamento e armazenamento

Aprenda a importar dados para o pandas a partir dos formatos que analistas encontram todos os dias e a salvá-los novamente sem perder informações. Leia arquivos CSV e outros arquivos de texto com os delimitadores, formatos numéricos, marcadores de valores ausentes, datas e codificações corretos, incluindo relatórios com linhas de título e rodapés. Carregue pastas de trabalho do Excel, arquivos JSON e dados de APIs da web, armazene resultados em CSV, Excel e Parquet e leia e grave dados em bancos SQL com consultas parametrizadas seguras.

IntermediárioAula 3 de 8 do curso Curso de Análise de dados com Python

O que você vai aprender

  1. Leia arquivos CSV e outros arquivos de texto delimitado com pd.read_csv, controle como o pandas separa, rotula e define os tipos das colunas e confira o resultado antes de analisá-lo.
    • Ler um arquivo CSV e inspecionar o resultado criado pelo pandas
      Carregue um arquivo separado por vírgulas em um DataFrame, escolha o cabeçalho, os nomes das colunas, o índice e as colunas a manter e confira os tipos inferidos pelo pandas.
    • Tratar delimitadores e formatos numéricos regionais
      Reconheça o delimitador, o separador decimal e o separador de milhares usados em um arquivo e configure sep, decimal e thousands para que os números sejam carregados como números.
    • Controlar valores ausentes, tipos de colunas e datas durante a leitura
      Informe ao pandas quais marcadores significam “ausente”, mantenha identificadores como texto, escolha tipos numéricos e interprete datas com um formato explícito.
    • Ler arquivos com estruturas irregulares
      Ignore linhas de título, comentários e rodapés, leia cabeçalhos com várias linhas e colunas de largura fixa e decida o que fazer com linhas malformadas.
  2. Entenda como o texto é armazenado em bytes, corrija erros de codificação e caracteres corrompidos e leia arquivos grandes ou lentos demais para carregar de uma só vez.
    • Compreender como os caracteres são representados por bytes
      Explique o que é uma codificação e reconheça ASCII, UTF-8, Latin-1, Windows-1252, UTF-16 e a marca de ordem de bytes.
    • Diagnosticar e corrigir problemas de codificação
      Reconheça um erro de decodificação e texto corrompido por codificação incorreta, encontre a codificação certa e grave arquivos que outros programas leiam corretamente.
    • Ler arquivos de texto grandes e comprimidos com eficiência
      Reduza o uso de memória durante a leitura, processe um arquivo em blocos, combine resultados parciais corretamente e leia arquivos comprimidos diretamente.
  3. Leia dados de planilhas com títulos, células mescladas e fórmulas e grave um ou mais DataFrames em uma pasta de trabalho para outras pessoas.
    • Ler planilhas de pastas de trabalho do Excel
      Escolha a planilha, as linhas e as colunas a ler e saiba o que o pandas faz com datas, fórmulas, células mescladas e formatação.
    • Gravar DataFrames em pastas de trabalho do Excel
      Salve uma ou várias tabelas em uma pasta de trabalho que colegas possam abrir e evite sobrescrever ou rotular dados incorretamente.
  4. Leia e grave JSON, transforme registros aninhados em tabelas e requisite dados de APIs da web de forma confiável e segura.
    • Ler e gravar dados JSON
      Conheça a sintaxe de JSON e seu mapeamento para objetos Python e leia e grave JSON e JSON Lines com Python e pandas.
    • Transformar dados JSON aninhados em uma tabela
      Transforme objetos e listas aninhados em colunas e linhas com pd.json_normalize e decida o que cada linha representa.
    • Requisitar dados de uma API da web
      Chame uma API com a biblioteca requests, confira a resposta, trate chaves, páginas e limites de requisições por período e leia tabelas de páginas da web.
  5. Grave resultados limpos em CSV, compare formatos de texto e binários e use Parquet para manter os dados compactos e com os tipos corretos entre etapas de análise.
    • Gravar DataFrames em arquivos CSV e de texto
      Controle o índice, os valores ausentes, os formatos de números e datas e a codificação dos arquivos gravados e mantenha os dados brutos protegidos.
    • Comparar formatos de armazenamento de texto e binários
      Explique as diferenças entre formatos de texto e formatos binários orientados por linhas ou colunares e escolha CSV, Excel, JSON, Parquet, Feather, pickle ou um banco de dados para cada tarefa.
    • Ler e gravar arquivos Parquet
      Salve DataFrames em Parquet com seus tipos, leia colunas selecionadas e organize dados como um conjunto de dados particionado.
  6. Conecte o pandas a um banco de dados, carregue resultados de consultas com parâmetros e tipos corretos e grave DataFrames em tabelas com segurança.
    • Conectar-se a um banco de dados e carregar resultados de consultas
      Abra uma conexão com SQLite ou outro banco de dados, execute uma consulta SQL fornecida a partir do pandas e gerencie credenciais e conexões.
    • Passar parâmetros de consulta com segurança e controlar os tipos dos resultados
      Insira valores em consultas com parâmetros em vez de formatação de strings e obtenha datas, inteiros e tamanhos de blocos corretos no resultado.
    • Gravar DataFrames em tabelas de bancos de dados
      Crie tabelas, acrescente dados e substitua tabelas com to_sql, escolha tipos de colunas e verifique e repita gravações com segurança.

Guia de estudo de Ler e gravar dados no pandas

6 capítulos

1

Carregar arquivos de texto delimitado no pandas

Arquivos de texto podem parecer tabelas enquanto deixam escolhas importantes implícitas. Você lerá registros no pandas, verificará as linhas e colunas resultantes e escolherá opções para cabeçalhos, campos entre aspas, convenções numéricas, marcadores de valores ausentes e datas. Você também localizará as observações propriamente ditas em relatórios com títulos, comentários e totais, para que a importação concluída produza a tabela e os valores desejados.

Você usa o Excel em inglês? Então digite vírgulas em vez de pontos e vírgulas e estes nomes: SOMA é SUM.

1.1 De registros CSV a uma tabela verificada

Um arquivo CSV é texto simples organizado em registros e campos. Vírgulas geralmente separam os campos, e o primeiro registro costuma fornecer os nomes das colunas. O arquivo contém caracteres, não um esquema do pandas, por isso lê-lo também significa decidir o que esses caracteres representam.

Carregue e inspecione um arquivo pequeno

Suponha que um arquivo contenha:

order_id,date,region,units,price
1001,2026-03-02,North,3,4.50
1002,2026-03-02,South,1,12.00
1003,2026-03-03,North,2,7.25

Leia-o e inspecione o resultado:

import pandas as pd

df = pd.read_csv("sales.csv")
print(df.head())
print(df.shape)
print(df.dtypes)
df.info()

A forma é (3, 5): três linhas de dados e cinco colunas. O pandas infere int64 para order_id e units e float64 para price. A coluna date ainda contém texto. No pandas 3, colunas de texto inferidas normalmente mostram str; versões mais antigas do pandas frequentemente mostram object.

Cada inspeção responde a uma pergunta diferente. head() mostra se os campos estão alinhados aos rótulos. shape revela linhas ausentes ou uma coluna adicional inesperada. dtypes verifica a interpretação, e info() acrescenta contagens de valores não nulos. Uma coluna destinada a números que é carregada como texto merece uma análise dos valores brutos: uma unidade, um marcador ou uma convenção decimal diferente pode impedir a inferência numérica.

Associe rótulos aos registros

Para um arquivo sem cabeçalho cuja primeira linha é 1001,North,3, use:

df = pd.read_csv(
    "orders.txt",
    header=None,
    names=["id", "region", "units"]
)

Sem essa escolha, o pandas usa o primeiro registro como cabeçalho. Os valores desse registro tornam-se nomes de colunas e ele desaparece dos dados. Use index_col="order_id" quando uma coluna existente deve rotular as linhas. Use usecols=["region", "units"] para ler apenas essas colunas ou nrows=1000 para inspecionar as primeiras 1.000 linhas de dados antes de carregar um arquivo grande.

Deixe o leitor de CSV tratar as aspas

O registro "Smith, Jane",Boston,10 tem três campos. A vírgula dentro do nome entre aspas pertence ao nome. Duas aspas duplas dentro de um campo entre aspas representam uma aspa dupla literal: "O'Neil ""Red""" torna-se O'Neil "Red". Um campo entre aspas pode até conter uma quebra de linha, por isso registros e linhas físicas nem sempre correspondem.

Chamar line.split(",") divide o nome e não consegue tratar essas regras. read_csv as trata durante a análise sintática. pd.read_table usa tabulação como separador padrão; pd.read_fwf trata campos definidos por posições de caracteres.

Encontre o arquivo que o Python procura

Um caminho relativo é resolvido a partir do diretório de trabalho atual do programa. Se "data/sales.csv" não for encontrado, inspecione o diretório com Path.cwd() após from pathlib import Path. Um caminho absoluto, um objeto Path, uma URL ou um arquivo de texto em memória como StringIO também pode ser passado a read_csv. Verifique a localização antes de alterar opções de análise: um arquivo ausente e um arquivo interpretado incorretamente são problemas diferentes.

Principais conclusões

  • CSV armazena caracteres; o pandas infere os tipos das colunas durante a leitura.
  • Confira as primeiras linhas, a forma, os tipos e as contagens de valores não nulos após uma importação.
  • Use header=None e names quando o arquivo não tiver cabeçalho.
  • Delimitadores e quebras de linha entre aspas pertencem aos campos; use um analisador de CSV.
  • Caminhos relativos partem do diretório de trabalho atual.

1.2 Separadores e números carregados corretamente

Um delimitador separa campos; um separador decimal separa as partes inteira e fracionária de um número. Um separador de milhares agrupa algarismos. Essas três funções precisam de configurações distintas, mesmo quando o mesmo símbolo é usado para funções diferentes em arquivos diferentes.

Inspecione os caracteres antes de escolher as opções

Examine algumas linhas brutas em um editor. Uma extensão .csv não garante o uso de vírgulas, e .txt não identifica uma estrutura. Configurações comuns são:

Estrutura do arquivoOpção de leitura
Campos separados por tabulaçãosep="\t"
Campos separados por barra vertical`sep="
Campos separados por sequências de espaçossep=r"\s+"
Campos separados por ponto e vírgulasep=";"

Você pode inspecionar o início sem ler o arquivo inteiro:

with open("products.csv", encoding="utf-8") as f:
    print(f.readline())
    print(f.readline())
Analise uma exportação regional

Considere este texto:

product;price;qty
Tea;3,50;1.200
Coffee;12,90;850

Os pontos e vírgulas dividem os campos, a vírgula é o separador decimal e o ponto agrupa milhares. Informe explicitamente as três convenções na leitura:

df = pd.read_csv(
    "products.csv",
    sep=";",
    decimal=",",
    thousands="."
)

Os preços tornam-se 3,5 e 12,9. As quantidades tornam-se 1.200 e 850. Com o separador padrão por vírgula, esse cabeçalho não descreve três colunas separadas por vírgulas. Mesmo depois de escolher sep=";", o trabalho não está concluído: os preços permanecem como texto e "1.200" pode tornar-se o número decimal 1,2. Esse último resultado é um número válido com o significado errado, por isso um erro grave pode ocorrer sem uma exceção de análise.

Compare alguns valores carregados com o texto de origem e inspecione describe() para detectar intervalos pouco plausíveis. Uma quantidade esperada na casa dos milhares que aparece próxima de um indica um possível problema de convenção numérica. Alterar apenas o delimitador não corrigirá isso.

Distinga limites de campos de agrupamento de números

Em um arquivo delimitado por vírgulas, um número agrupado como "1,234.50" deve ficar entre aspas. A vírgula interna faz parte do número. Com thousands=",", o pandas pode ler o campo entre aspas como 1.234,5. Sem aspas, a vírgula também cria um limite de campo; thousands não consegue restaurar a estrutura perdida do registro.

Escolha um mecanismo de análise compatível

O mecanismo C padrão trata estruturas comuns rapidamente. O mecanismo Python oferece detecção de separador com sep=None, separadores expressos como expressões regulares e skipfooter. A detecção examina uma amostra e pode escolher incorretamente em um relatório irregular, por isso informe diretamente um separador conhecido.

Um separador com mais de um caractere geralmente é tratado como expressão regular e exige o mecanismo Python; r"\s+" é um caso especial também aceito pelo mecanismo C. O mecanismo PyArrow pode ler com threads paralelas, mas oferece suporte a um conjunto diferente de opções. Por exemplo, chunksize não é aceito com engine="pyarrow". Escolha o mecanismo conforme as opções necessárias ao arquivo e depois confira a estrutura e os valores do resultado.

Principais conclusões

  • Escolha sep, decimal e thousands para suas funções distintas.
  • Um resultado que parece numérico ainda pode estar errado por um fator de 1.000.
  • Coloque um campo entre aspas quando seu conteúdo incluir o delimitador.
  • O mecanismo Python oferece detecção e skipfooter; as opções diferem entre mecanismos.

1.3 Valores ausentes, identificadores e datas

A inferência de tipo não pode saber se 999 é uma medida ou um código para um valor desconhecido. Ela também não pode saber se zeros à esquerda têm significado. Use as definições dos dados para configurar as opções de leitura antes que a inferência altere esses valores.

Declare marcadores de valores ausentes onde se aplicam

O pandas reconhece campos vazios e marcadores internos como "NA", "N/A", "n/a", "NULL", "NaN" e "None". Uma fonte pode usar marcadores adicionais. Suponha que score contenha 88, "n/a", "-" e 999, com 999 definido como desconhecido:

df = pd.read_csv(
    "scores.csv",
    na_values={"score": ["-", "999"]}
)

A coluna de pontuação agora contém 88,0 e três valores ausentes. Sem declarar os marcadores, "-" pode fazer a coluna permanecer como texto; um valor sentinela numérico não declarado pode entrar nos cálculos. A média de 88 e 999 é 543,5, embora a única pontuação conhecida seja 88.

Um dicionário restringe um marcador à coluna indicada. Uma opção na_values=["999"] para o arquivo inteiro também removeria um código de produto real 999. Se "NA" for um rótulo real, use keep_default_na=False para desativar a lista interna de marcadores e liste explicitamente os marcadores que de fato significam ausência. Com essa configuração, inclua "" se campos vazios ainda precisarem ser considerados ausentes.

Preserve valores de acordo com sua função

Leia identificadores como texto:

df = pd.read_csv(
    "visits.csv",
    dtype={"site_code": str, "visits": "Int64"}
)

Um código como "00501" deve continuar com cinco caracteres. Lê-lo como inteiro produz 501; converter esse inteiro para texto depois produz "501", não o código original. Use um tipo numérico para valores usados em cálculos.

Colunas comuns de inteiros do NumPy não podem conter NaN, por isso uma coluna de contagem com uma lacuna frequentemente se torna float64. O tipo "Int64" do pandas, com I maiúsculo e suporte a valores ausentes, mantém valores inteiros e representa uma lacuna com <NA>. dtype_backend="numpy_nullable" solicita tipos com suporte a valores ausentes em todo o resultado. Para um pequeno conjunto de rótulos repetidos, dtype={"region": "category"} armazena os rótulos como categorias e pode reduzir o uso de memória.

Especifique como as datas são escritas

Texto que parece uma data permanece como texto até ser interpretado. Para datas com dia primeiro, como "03/04/2026" e "13/04/2026", use:

df = pd.read_csv(
    "events.csv",
    parse_dates=["day"],
    date_format="%d/%m/%Y"
)

Esses valores tornam-se 3 de abril e 13 de abril. Sem um formato, uma inferência com mês primeiro pode trocar dias e meses válidos ou deixar de converter a coluna. dayfirst=True expressa uma preferência; um formato explícito declara a estrutura esperada. Datas ISO como "2026-04-03" evitam a ambiguidade entre dia e mês.

Após a leitura, inspecione dtypes, isna().sum() e a contagem de linhas. Verifique uma data cuja interpretação diferencie as convenções. Uma coluna que ainda aparece como texto indica que a interpretação não produziu os valores de data e hora desejados; uma contagem de ausentes que aumenta inesperadamente pode revelar um rótulo real confundido com um marcador.

Principais conclusões

  • Declare marcadores de valores ausentes específicos da fonte, de preferência por coluna.
  • Use keep_default_na=False quando um marcador interno for um dado real.
  • Leia identificadores compostos apenas por algarismos como texto para preservar zeros à esquerda.
  • Use Int64 com suporte a valores ausentes para contagens inteiras com valores ausentes.
  • Forneça um formato explícito para datas ambíguas e verifique o tipo de dados.
  • Confira as contagens de valores ausentes em relação à fonte.

1.4 Tabelas em relatórios e arquivos de largura fixa

Um relatório pode misturar uma tabela com títulos, linhas em branco, comentários, totais e notas sobre a fonte. Primeiro localize o cabeçalho e os limites dos dados. Caso contrário, um leitor pode confundir um título com nomes de colunas ou incluir um total como observação comum.

Leia apenas a tabela

Um relatório contém estas nove linhas físicas:

Monthly sales report
Exported 2026-04-01

region,jan,feb
North,120,135
# test row below
South,98,101
Total,218,236
Source: internal system

As três primeiras linhas precedem o cabeçalho. As duas últimas não são observações. Leia o relatório com:

df = pd.read_csv(
    "report.csv",
    skiprows=3,
    comment="#",
    skipfooter=2,
    engine="python"
)

O resultado tem duas linhas. Janeiro totaliza 218 a partir de North e South. Manter a linha de total acrescentaria outros 218 e resultaria em 436. Com as opções padrão, o título de um campo pode, em vez disso, tornar-se o cabeçalho e causar um erro de análise quando chegarem registros de três campos.

skiprows=3 conta as três primeiras linhas físicas, incluindo a linha em branco. Uma lista como skiprows=[0, 2] remove posições específicas de linhas contadas a partir de zero. Linhas em branco são ignoradas por padrão, e comment="#" remove o texto de comentários. skipfooter precisa do mecanismo Python. Ajuste essas configurações à estrutura real; uma contagem fixa de linhas a ignorar pode deixar de estar correta quando um programa de exportação adiciona uma linha de título.

Investigue registros malformados

Um registro com campos demais pode acionar on_bad_lines="error", a opção padrão. "warn" o ignora com um aviso, enquanto "skip" o remove sem aviso. Antes de escolher qualquer uma das duas opções, inspecione o registro bruto. Uma vírgula sem aspas dentro de um nome ou um delimitador incorreto pode criar campos adicionais; ignorar o registro nesse caso causa a perda de uma observação válida em vez de corrigir a causa.

Poucos campos têm um comportamento diferente. Sob id,name,score, o registro 2,Ben é carregado com uma pontuação ausente. Isso pode não gerar erro. Confira as contagens de valores ausentes e de linhas e compare os registros mantidos com a fonte ao excluir linhas malformadas.

Leia cabeçalhos em várias linhas ou posições de caracteres

Duas linhas de rótulos de colunas podem formar um índice hierárquico (MultiIndex). Com os rótulos de grupos region,sales,sales acima de ,2025,2026, header=[0, 1] produz rótulos como ("sales", "2025"). Se rótulos sem hierarquia forem mais adequados à análise, ignore as duas linhas de cabeçalho e forneça names=["region", "sales_2025", "sales_2026"].

Texto de largura fixa não tem delimitador. Os limites das colunas são posições de caracteres:

df = pd.read_fwf(
    "readings.txt",
    colspecs=[(0, 4), (4, 11), (11, 16)]
)

Esses intervalos semiabertos incluem cada início e excluem cada fim. O primeiro campo ocupa as posições de 0 a 3, e o próximo começa em 4. widths=[4, 7, 5] descreve a mesma estrutura. A inferência é conveniente para amostras regulares; limites explícitos impedem que um valor curto no início defina uma largura incorreta.

Principais conclusões

  • Localize o cabeçalho, as observações e o rodapé antes de escolher opções para ignorar linhas.
  • Linhas de total incluídas como observações podem dobrar uma soma.
  • Ignorar linhas malformadas causa perda de registros; investigue primeiro os campos adicionais.
  • Registros curtos podem ser carregados com valores ausentes no final.
  • Use cabeçalhos com várias linhas ou limites explícitos de largura fixa para essas estruturas.
2

Ler texto corretamente e com eficiência

A correção do texto depende da regra usada para decodificar os bytes, e a eficiência da leitura depende do que o programa mantém na memória. Você distinguirá falhas de codificação de texto corrompido, usará evidências para selecionar uma codificação e preservará caracteres durante a troca de dados. Depois, reduzirá o uso de memória em arquivos grandes por meio da seleção de colunas, de tipos adequados e do processamento em blocos, incluindo a combinação correta de resultados parciais.

2.1 Como o texto é armazenado em bytes

Um arquivo armazena bytes, cada um com um valor de 0 a 255. Uma codificação define como os caracteres são representados por esses bytes. A codificação converte texto Python em bytes; a decodificação converte bytes novamente em texto. Os mesmos bytes podem representar caracteres diferentes segundo regras de decodificação diferentes.

Conte caracteres e bytes separadamente
text = "café"
raw = text.encode("utf-8")
print(len(text))  # 4 characters
print(len(raw))   # 5 bytes
print(raw.decode("utf-8"))  # café

O acento não forma um segundo caractere visível aqui. A letra "é" precisa de dois bytes em UTF-8, por isso quatro caracteres ocupam cinco bytes. Uma contagem de bytes e uma contagem de caracteres respondem a perguntas diferentes.

ASCII define 128 caracteres, incluindo letras básicas do alfabeto inglês, algarismos, pontuação e códigos de controle. Os valores de byte desses caracteres coincidem em ASCII, UTF-8, Latin-1 e Windows-1252. Essa parte inicial compartilhada explica por que uma amostra contendo apenas texto em inglês pode parecer correta mesmo quando a configuração de codificação está errada.

Reconheça as principais famílias de codificação
CodificaçãoComo representa o textoPista útil
UTF-8Um a quatro bytes por caractere UnicodeLetras ASCII usam um byte; "é" usa dois
Latin-1Um byte por caractere de seu repertório limitadoTodo valor de byte pode ser decodificado
Windows-1252Um byte por caractere aceitoInclui símbolos imprimíveis adicionais como "€"
UTF-16Geralmente dois bytes por caractere, quatro para outrosA ordem dos bytes importa

UTF-8 representa todos os caracteres Unicode e é a escolha habitual para troca de texto. Latin-1 e Windows-1252 representam um conjunto menor de caracteres. Elas coincidem em muitas letras acentuadas, mas diferem em parte da faixa de bytes: Windows-1252 usa o byte 0x80 para "€", onde Latin-1 tem um caractere de controle. Não são nomes intercambiáveis para uma mesma codificação.

Leia corretamente as marcas de ordem de bytes

Uma marca de ordem de bytes, ou BOM, é um marcador no início de alguns arquivos. UTF-16 pode começar com FF FE para a ordem little-endian ou FE FF para a ordem big-endian. encoding="utf-16" usa a BOM para selecionar a ordem. Sem uma BOM, especifique "utf-16-le" ou "utf-16-be" de acordo com a fonte.

Uma BOM UTF-8 é EF BB BF. open(..., encoding="utf-8-sig") do Python a remove durante a decodificação. O simples "utf-8" em open() a mantém como \ufeff, que pode inesperadamente tornar-se parte do nome do primeiro cabeçalho. O leitor de CSV do pandas também trata uma BOM UTF-8 inicial, mas escolher utf-8-sig deixa clara a convenção esperada do arquivo.

Informe a codificação explicitamente
with open("notes.txt", encoding="utf-8") as f:
    text = f.read()

O padrão de open() depende da versão do Python e do modo UTF-8. Python 3.11 a 3.14 pode usar a codificação das configurações regionais; Python 3.15 ativa o modo UTF-8 por padrão, com a opção de desativá-lo. Uma codificação explícita mantém o script vinculado ao formato real do arquivo em diferentes computadores. Ela também impede que o padrão de uma plataforma altere sem aviso a forma como os mesmos bytes são lidos.

Principais conclusões

  • A codificação transforma texto em bytes; a decodificação transforma bytes em texto.
  • Contagens de caracteres e de bytes podem ser diferentes.
  • Amostras que contêm apenas caracteres ASCII podem ocultar uma escolha incorreta de codificação.
  • Latin-1 e Windows-1252 são diferentes, embora compartilhem muitos caracteres.
  • Use informações sobre a BOM e a ordem dos bytes ao ler UTF-16.
  • Passe a codificação desejada explicitamente a open().

2.2 Encontre a causa do texto corrompido

Uma codificação errada pode falhar de forma explícita com UnicodeDecodeError ou produzir silenciosamente um texto aparentemente legível, mas sem sentido, chamado mojibake. Ambos os problemas começam com a interpretação dos bytes pela regra errada. Guarde o arquivo original para poder decodificá-lo novamente.

Diagnostique um erro a partir da fonte

Um CSV salvo em Windows-1252 contém nomes de cidades, incluindo "Zürich" e "Málaga". Lê-lo como UTF-8 pode falhar no byte 0xfc, usado para "ü" em Windows-1252. Quando as configurações de exportação da fonte confirmarem a codificação, leia-o com:

df = pd.read_csv("cities.csv", encoding="cp1252")
print(df["city"].head())

Inspecione nomes que contenham acentos ou símbolos. Uma amostra composta inteiramente de caracteres ASCII não consegue distinguir essas codificações. Um byte específico inválido em UTF-8 sugere uma possível codificação antiga; ele não identifica de forma única qual codificação antiga produziu o arquivo.

Reconheça um problema que não gerou erro

Bytes UTF-8 decodificados como Windows-1252 podem transformar "café" em "café" e "São Paulo" em "São Paulo". O leitor produziu caracteres sem falhar, mas são os caracteres errados. Leia os bytes originais novamente usando UTF-8:

df = pd.read_csv("cities.csv", encoding="utf-8")

A busca e substituição corrige um sintoma visível por vez e pode deixar passar outras letras danificadas. Ela também corre o risco de alterar uma ocorrência legítima de um caractere. A decodificação correta trata a causa em todo o arquivo.

Reúna evidências sobre a codificação

Comece pela documentação do fornecedor ou pelas configurações de exportação. Se necessário, inspecione uma pequena amostra de bytes:

with open("cities.csv", "rb") as f:
    sample = f.read(200)
print(sample)

O modo binário preserva os bytes sem decodificá-los. Uma BOM pode dar uma pista direta. Um detector como charset-normalizer estima uma codificação provável, mas uma amostra curta pode ser compatível com várias candidatas. Teste o resultado comparando nomes acentuados e símbolos conhecidos.

Latin-1 atribui um caractere a cada byte, por isso pode decodificar qualquer sequência de bytes sem erro. Esse sucesso, por si só, não indica se os caracteres estão corretos. Windows-1252 também usa caracteres de um byte, mas deixa alguns valores de byte indefinidos e pode gerar um erro de decodificação.

Evite descartar as evidências

encoding_errors="replace" substitui bytes que o decodificador não consegue ler por "�". encoding_errors="ignore" os remove. Essas opções podem ajudar a inspecionar uma entrada danificada, mas causam perda de informação e não devem substituir a busca pela codificação correta. Um nome alterado para "Zrich" pode impedir uma correspondência tanto quanto um texto visivelmente corrompido.

Na saída, UTF-8 lida com a maior variedade de caracteres. Alguns programas de planilha o identificam com mais confiabilidade quando há uma BOM:

df.to_csv("cities_export.csv", index=False, encoding="utf-8-sig")

Abra novamente o arquivo exportado no programa que o receberá e inspecione os mesmos valores acentuados. O objetivo é ter o texto correto nas duas pontas da troca.

Principais conclusões

  • Verifique tanto erros de decodificação quanto caracteres visivelmente corrompidos.
  • Leia novamente os bytes originais com a codificação correta para corrigir mojibake.
  • O sucesso da decodificação em Latin-1 não comprova que o texto está correto.
  • Os modos de substituição e de ignorar descartam informações sobre caracteres.
  • Use UTF-8 com BOM quando o programa de planilha que receberá o arquivo precisar dela.

2.3 Leia arquivos grandes sem manter todas as linhas

O tamanho de um arquivo no disco não corresponde à memória necessária para carregá-lo. O pandas constrói arrays, índices e valores de texto na memória, e os tipos desses objetos afetam o espaço necessário. Meça com df.memory_usage(deep=True) ou df.info(memory_usage="deep") antes de decidir como carregar mais dados.

Reduza os dados carregados na memória

Leia colunas selecionadas com usecols, inspecione uma amostra inicial com nrows e escolha tipos adequados com dtype. Uma categoria pode armazenar nomes de regiões repetidos de forma compacta. float32 usa menos espaço que float64, mas oferece cerca de sete algarismos significativos, por isso escolha-o apenas quando essa precisão for adequada às medidas. Uma pequena prévia ajuda a identificar tipos; ela não comprova que todas as linhas posteriores seguem o mesmo padrão.

Processe blocos e mantenha um resultado pequeno

chunksize altera o valor retornado de um DataFrame para um iterador de DataFrames. Para obter um total e uma média:

total = 0.0
count = 0
with pd.read_csv(
    "measurements.csv",
    usecols=["amount"],
    chunksize=100_000
) as reader:
    for chunk in reader:
        total += chunk["amount"].sum()
        count += chunk["amount"].count()
mean = total / count if count else float("nan")

O laço mantém uma soma acumulada e uma contagem dos valores não ausentes. Cada bloco pode ser liberado após o uso. Reunir todos os blocos em uma lista e concatená-los depois recria a necessidade de memória para o conjunto inteiro; a leitura em blocos só economiza memória quando o processamento mantém um resultado reduzido ou grava as partes processadas.

Um arquivo de dez linhas lido com chunksize=4 produz partes de 4, 4 e 2 linhas. Para valores de 1 a 10 com regiões que se repetem na ordem N, S, E, some os totais regionais parciais para obter N 22, S 15 e E 18. O total combinado é 55.

Combine as quantidades corretas

Somas e contagens são adicionadas. Mínimos são combinados tomando-se o menor mínimo parcial; máximos são combinados tomando-se o maior máximo parcial. Médias precisam de pesos porque os blocos podem conter números diferentes de observações válidas.

Para os valores 1, 2 e 3 em um bloco e 10 em outro, as médias dos blocos são 2 e 10. A média dessas médias é 6, atribuindo ao bloco de um valor o mesmo peso do bloco de três valores. Some as somas e as contagens: o total 16 em quatro observações dá média 4. As medianas dos blocos não contêm informações suficientes para reconstruir uma mediana geral.

Leia arquivos comprimidos diretamente

read_csv normalmente infere a compressão a partir de extensões reconhecidas como .gz, .bz2, .zip, .xz e .zst. Ele descomprime durante a leitura:

with pd.read_csv("measurements.csv.gz", chunksize=100_000) as reader:
    for chunk in reader:
        print(len(chunk))

Um arquivo ZIP usado dessa forma deve conter exatamente um arquivo de dados. df.to_csv("out.csv.gz", index=False) grava CSV comprimido com gzip. A compressão reduz o espaço em disco e o tamanho da transferência; ela não elimina a memória usada pela tabela decodificada. Para análises repetidas, converter um conjunto de dados verificado para Parquet também evita reinterpretar o texto e restaura os tipos de colunas armazenados.

Principais conclusões

  • Meça o uso de memória com contabilização do conteúdo dos objetos e leia apenas as colunas necessárias.
  • Leitores em blocos fornecem DataFrames; mantenha resultados reduzidos para economizar memória.
  • Combine somas e contagens de valores não ausentes antes de calcular uma média geral.
  • Medianas de blocos não podem ser combinadas para obter a mediana geral.
  • Texto comprimido é descomprimido durante a leitura; um ZIP precisa conter um arquivo de dados.
  • Parquet é adequado para conjuntos de dados carregados repetidamente.
3

Trabalhar com pastas de trabalho do Excel

Pastas de trabalho misturam dados com uma apresentação feita para pessoas: várias planilhas, títulos, fórmulas, rótulos mesclados e formatos de exibição. Você localizará uma tabela nessa estrutura e distinguirá os valores armazenados do que uma célula exibe. Depois, gravará relatórios com uma ou várias planilhas, controlará atualizações em uma pasta de trabalho existente e verificará se as planilhas salvas contêm as linhas e os valores desejados.

3.1 Encontre e leia a tabela em uma planilha

Uma pasta de trabalho do Excel pode conter várias planilhas, títulos e totais calculados. As células têm valores e tipos armazenados, além de formatação de exibição. Ler uma planilha significa localizar a tabela de dados e entender quais partes da pasta de trabalho se tornam valores do DataFrame.

Escolha a planilha e seus limites
df = pd.read_excel(
    "quarterly.xlsx",
    sheet_name="Q1",
    skiprows=2,
    usecols="A:C",
    nrows=2
)

Suponha que a linha 1 seja um título mesclado, a linha 2 esteja vazia, a linha 3 contenha region, date e sales, e as linhas 4 a 5 contenham as observações. skiprows=2 faz da linha 3 o cabeçalho; nrows=2 interrompe a leitura antes do total na linha 6. Para North 1.200 e South 950, as duas observações somam 2.150. Incluir um total armazenado em cache de 2.150 como terceira observação dobraria esse valor.

O Excel exibe números de linha a partir de 1; as posições de linha do pandas começam em 0. header=2 também seleciona a linha 3 do Excel como cabeçalho. usecols="A,C,E:F" seleciona colunas separadas e um intervalo. O padrão sheet_name=0 lê a primeira planilha; um nome seleciona uma planilha específica, e sheet_name=1 seleciona a segunda.

sheet_name=None retorna um dicionário que associa nomes de planilhas a DataFrames. Selecione uma chave ou percorra .items() em um laço; o próprio dicionário não é um DataFrame. Para várias leituras de uma pasta de trabalho:

with pd.ExcelFile("quarterly.xlsx") as xf:
    print(xf.sheet_names)
    q1 = pd.read_excel(xf, sheet_name="Q1")
Saiba o que a célula realmente armazena

Uma porcentagem exibida como "15%" armazena 0,15. Um número exibido com cinco algarismos pode armazenar 2.139, mesmo que a tela mostre "02139". Nenhuma opção de leitura pode recuperar um zero que existe apenas na formatação. Armazene identificadores como texto na pasta de trabalho e passe também dtype={"zip": str} durante a leitura; caso contrário, o pandas pode inferir inteiros mesmo em células de texto compostas apenas de algarismos.

A precisão numérica do Excel é limitada a 15 algarismos significativos. Um identificador de 16 algarismos inserido como número já pode estar danificado antes de o Python lê-lo. Armazene esses valores como texto. Uma planilha tem no máximo 1.048.576 linhas e 16.384 colunas, por isso um conjunto de dados muito grande precisa de outro formato.

Trate fórmulas e células mescladas com cuidado

O pandas não calcula fórmulas. Ele lê resultados armazenados em cache na pasta de trabalho. Um aplicativo de planilha pode salvar resultados atuais; um arquivo gerado por script pode ter resultados em cache ausentes, provisórios ou desatualizados. O openpyxl não calcula um resultado, e o XlsxWriter normalmente grava zero como valor provisório, a menos que outro seja fornecido. Recalcule valores importantes no pandas ou abra e salve a pasta de trabalho em um programa de planilha antes de confiar nos totais armazenados em cache.

Apenas a célula superior esquerda de um intervalo mesclado armazena o rótulo. Um rótulo de país mesclado pode, portanto, deixar células vazias nas linhas abaixo. Quando a estrutura confirmar que o rótulo se aplica a essas linhas, df["country"] = df["country"].ffill() o propaga para baixo. Inspecione o limite da tabela antes de preencher.

A leitura exige uma biblioteca de mecanismo. O openpyxl trata .xlsx e .xlsm; xlrd trata .xls, pyxlsb trata .xlsb, odf trata .ods e calamine oferece suporte a vários formatos de planilha. Um mecanismo ausente gera um ImportError que informa a dependência necessária. Cores, comentários e outros estilos da estrutura não são carregados como dados do DataFrame.

Principais conclusões

  • Selecione explicitamente a planilha, o cabeçalho, as colunas e as linhas de observações.
  • sheet_name=None retorna um dicionário de DataFrames.
  • Valores armazenados podem diferir de porcentagens ou identificadores com preenchimento exibidos.
  • O pandas não calcula fórmulas; os resultados em cache podem estar desatualizados ou ausentes.
  • Rótulos mesclados ficam na célula superior esquerda.
  • Armazene identificadores longos como texto antes que o Excel possa arredondá-los.
  • Instale um mecanismo de leitura compatível com o formato da pasta de trabalho.

3.2 Grave uma pasta de trabalho com várias planilhas

O Excel é útil quando pessoas precisam abrir e inspecionar um relatório em um programa de planilha. Um DataFrame pode tornar-se uma planilha, ou vários DataFrames podem compartilhar uma pasta de trabalho. Escolha o caminho de destino e os nomes das planilhas antes de gravar, para que cada tabela vá para o lugar desejado.

Grave uma ou várias tabelas
weather.to_excel(
    "weather.xlsx",
    sheet_name="Weather",
    index=False
)

index=False mantém os números de linha padrão fora da planilha. Sem essa opção, eles aparecem como uma primeira coluna adicional e podem retornar como "Unnamed: 0" em uma leitura posterior. Mantenha um índice apenas quando ele contiver rótulos significativos que devam fazer parte do relatório.

Uma chamada de to_excel com caminho grava uma pasta de trabalho nesse caminho, substituindo um arquivo existente. Chamá-la uma vez para Weather e outra para Counts no mesmo caminho pode deixar apenas a segunda tabela. Use um único objeto de gravação para ambas:

with pd.ExcelWriter("report.xlsx") as writer:
    weather.to_excel(writer, sheet_name="Weather", index=False)
    counts.to_excel(writer, sheet_name="Counts", index=False)

O gerenciador de contexto fecha e finaliza a pasta de trabalho quando o bloco termina. Lê-la com pd.read_excel("report.xlsx", sheet_name=None) retorna um dicionário que contém os nomes das duas planilhas. Gravar .xlsx exige openpyxl ou XlsxWriter.

Atualize uma planilha em uma pasta de trabalho existente

Para preservar outras planilhas enquanto substitui uma delas, use um objeto de gravação em modo de acréscimo:

with pd.ExcelWriter(
    "report.xlsx",
    mode="a",
    engine="openpyxl",
    if_sheet_exists="replace"
) as writer:
    counts.to_excel(writer, sheet_name="Counts", index=False)

if_sheet_exists controla um conflito de nomes. "error" interrompe a operação, "new" cria outra planilha, "replace" substitui a planilha e "overlay" grava nas células existentes. A sobreposição não limpa células antigas fora da nova tabela, por isso uma atualização menor pode deixar linhas antigas para trás. Decida se o relatório precisa de uma substituição completa da planilha ou de uma sobreposição posicionada com cuidado.

Facilite a reabertura da saída

Nomes de planilhas têm limite de 31 caracteres e não podem conter :, \, /, ?, *, [ ou ]. Um nome curto como "Q1 Summary" funciona; "Q1/Q2" contém uma barra proibida. Alguns mecanismos emitem um aviso em vez de interromper a operação quando o nome é longo demais, por isso escolha nomes compatíveis.

startrow e startcol posicionam uma tabela usando deslocamentos contados a partir de zero. na_rep fornece um marcador visível para valores ausentes. float_format="%.2f" arredonda os números gravados, e autofilter=True adiciona botões de filtro ao cabeçalho no pandas 3. Colunas de data e hora são gravadas como datas do Excel.

Arredondar na saída altera os números armazenados, não apenas sua exibição. Mantenha separadamente um arquivo de análise com precisão completa quando um relatório arredondado for necessário. Abra novamente a pasta de trabalho e confira a lista de planilhas, as dimensões das tabelas e valores representativos. A leitura do Excel é relativamente lenta e um ciclo de gravação e leitura pode alterar os tipos de dados do pandas, por isso use Parquet para tabelas intermediárias de análise quando preservar os tipos for importante.

Principais conclusões

  • Use um único ExcelWriter para colocar várias tabelas em uma nova pasta de trabalho.
  • Uma gravação com caminho substitui uma pasta de trabalho existente.
  • O modo de acréscimo e if_sheet_exists controlam atualizações em planilhas existentes.
  • Escolha nomes válidos para as planilhas e verifique a pasta de trabalho reaberta.
4

Obter dados de arquivos JSON e APIs da web

JSON e APIs da web trazem registros em estruturas que nem sempre correspondem a uma tabela. Você interpretará e gravará JSON, escolherá uma estrutura de tabela adequada e transformará objetos ou listas aninhados em tabelas, acompanhando o que cada linha representa. Você também verificará respostas HTTP, percorrerá páginas e tratará credenciais e limites de requisições por período, para que o conjunto de dados resultante contenha os registros que pretendia coletar.

4.1 Objetos JSON, tabelas e registros linha por linha

JSON armazena dados aninhados como texto. Objetos contêm pares de nome e valor, arrays contêm valores ordenados e strings usam aspas duplas. Seus outros valores são números, true, false e null. O módulo json do Python converte essa sintaxe em objetos Python antes de você construir uma tabela.

Interprete e grave JSON válido
import json

text = '{"station":"Oslo","active":true,"temp_c":[3.5,null,4.0]}'
data = json.loads(text)
print(data["active"])   # True
print(data["temp_c"])   # [3.5, None, 4.0]

Objetos tornam-se dicionários, arrays tornam-se listas e null torna-se None. json.loads interpreta uma string; json.load lê um arquivo aberto. As funções de gravação fazem o caminho inverso: json.dumps retorna texto e json.dump grava em um arquivo.

with open("station.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

ensure_ascii=False mantém legíveis caracteres como "ü". O padrão pode gravar o mesmo caractere como \u00fc; ambas as formas representam a mesma string. Um dicionário Python impresso não é JSON: aspas simples, True, None e vírgulas finais são inválidos na sintaxe JSON. O JSON padrão também não tem NaN. O codificador do Python o permite por padrão, mas allow_nan=False o rejeita; o pandas grava valores ausentes como null.

Use a organização adequada da tabela

Uma tabela JSON precisa de uma orientação, isto é, a disposição de linhas, rótulos e valores. orient="records" fornece um objeto por linha:

[{"city":"Lyon","temp_c":21.5},{"city":"Osaka","temp_c":null}]

A orientação padrão de DataFrame, "columns", agrupa valores sob nomes de colunas e depois sob rótulos de linhas. "split" armazena colunas, índice e dados separadamente. Especifique uma orientação compatível com o programa que receberá os dados, em vez de presumir que toda tabela JSON tem a mesma estrutura.

from io import StringIO
import pandas as pd

df = pd.read_json(
    StringIO('[{"code":"0042","amount":9.5}]'),
    orient="records",
    dtype={"code": str}
)

No pandas 3, uma string simples passada a read_json é um caminho, por isso envolva o texto JSON propriamente dito em StringIO. Mesmo strings JSON compostas apenas por algarismos podem ser inferidas como números; o tipo de dados explícito preserva "0042".

Use JSON Lines para registros sequenciais

JSON Lines tem um objeto JSON completo por linha, sem um array ao redor ou vírgulas entre registros:

{"id":1,"amount":9.5}
{"id":2,"amount":12.0}

Leia com pd.read_json(path, lines=True) e grave com df.to_json(path, orient="records", lines=True). As opções chunksize e nrows do leitor exigem lines=True, que disponibiliza os registros individuais sequencialmente.

Ao exportar datas, defina date_format="iso" para obter marcas temporais ISO legíveis. O pandas 3.1 ainda usa milissegundos desde a época Unix como padrão para a saída JSON comum de DataFrames, mas esse padrão está mudando. Uma saída explícita de datas evita depender de quem lê os dados para adivinhar o que um inteiro grande representa.

Principais conclusões

  • A sintaxe JSON difere de um dicionário Python impresso.
  • load e dump usam arquivos; loads e dumps usam strings.
  • Escolha uma orientação compatível com a estrutura da tabela.
  • Envolva texto JSON em StringIO para read_json e preserve os tipos dos identificadores.
  • JSON Lines usa um objeto por linha e permite leitura em blocos.
  • Use saída de datas ISO para trocar marcas temporais legíveis.

4.2 Escolha o que uma linha de dados aninhados representa

JSON aninhado pode descrever um pedido, o cliente desse pedido e vários itens em um único objeto. Antes de transformá-lo em tabela, decida a granularidade: o que uma linha representa. A granularidade determina quais valores podem ser somados.

Transforme primeiro os objetos aninhados

Considere dois pedidos. O pedido 501 pertence a Ana e tem os itens A1 (quantidade 2, preço 3,5) e B7 (quantidade 1, preço 10,0). O pedido 502 pertence a Ben e tem A1 (quantidade 4, preço 3,5). Os dados dos clientes são objetos aninhados e os itens são listas.

orders = [
    {"order_id": 501,
     "customer": {"name": "Ana", "country": "PT"},
     "items": [{"sku": "A1", "qty": 2, "price": 3.5},
               {"sku": "B7", "qty": 1, "price": 10.0}]},
    {"order_id": 502,
     "customer": {"name": "Ben", "country": "CA"},
     "items": [{"sku": "A1", "qty": 4, "price": 3.5}]}
]
order_rows = pd.json_normalize(orders)

Isso produz duas linhas e quatro colunas: order_id, items, customer.name e customer.country. Os campos aninhados de cliente tornam-se colunas com nomes separados por pontos. As listas de itens permanecem nas células; a normalização não transforma automaticamente toda lista em linhas.

Expanda uma lista com informações do objeto pai
items = pd.json_normalize(
    orders,
    record_path="items",
    meta=["order_id", ["customer", "name"]]
)

record_path escolhe a lista cujas entradas se tornam linhas. meta copia valores do objeto pai para cada linha, com uma lista de chaves para um caminho aninhado. O resultado tem três linhas de itens: duas para o pedido de Ana e uma para o de Ben. A receita é a quantidade multiplicada pelo preço: 7,0, 10,0 e 14,0, totalizando 31,0.

Se uma cobrança de frete no nível do pedido for 4,00, ela se repete nas duas linhas de itens do pedido 501. Somar essas cobranças repetidas resulta em 8,00 para um único pedido. Mantenha os valores relativos ao pedido em uma tabela separada de pedidos quando também precisar de uma tabela de itens; preserve order_id para conectá-las.

Controle nomes e campos ausentes

sep="_" cria nomes como customer_name. record_prefix="item_" distingue campos de itens de campos do objeto pai com o mesmo nome. max_level=0 mantém intactos os dicionários aninhados.

Um campo aninhado comum ausente de um registro torna-se ausente na coluna de saída correspondente. Um campo ausente solicitado por meta gera KeyError por padrão; errors="ignore" permite metadados ausentes e os preenche com NaN. Uma lista ausente indicada por record_path ainda precisa ser corrigida.

Retire os registros do objeto envoltório antes de transformá-los em tabela

Uma API pode retornar um objeto envoltório contendo count, next e results. Passe data["results"] a pd.json_normalize para transformar os registros em tabela. Passar o próprio objeto envoltório normaliza um único objeto, deixando a lista de resultados dentro de uma célula. Mantenha os metadados de paginação disponíveis para buscar páginas posteriores, mas construa a tabela de análise a partir da lista de registros propriamente dita.

Principais conclusões

  • Decida se cada linha representa um objeto pai ou uma entrada de lista.
  • json_normalize expande objetos aninhados; record_path expande uma lista escolhida.
  • meta repete campos do objeto pai em cada linha filha.
  • Valores do nível do objeto pai podem ser contados duas vezes após a expansão de uma lista.
  • Transforme em tabela os registros dentro de um objeto envoltório da API, não o objeto envoltório.

4.3 Requisite um resultado completo e verificado de uma API

Uma API da web aceita uma requisição HTTP em um ponto de acesso e retorna um código de status, cabeçalhos e um corpo. Muitas APIs usam corpos JSON, mas o recebimento de uma resposta não significa que ela contenha os dados ou todos os registros necessários.

Envie parâmetros e confira a resposta
import requests

resp = requests.get(
    url,
    params={"city": "Lima", "units": "metric"},
    timeout=10
)
resp.raise_for_status()
data = resp.json()
df = pd.json_normalize(data["results"])

Aqui, url é o ponto de acesso documentado da API. params codifica a string de consulta, de modo que espaços e caracteres especiais nos valores sejam tratados corretamente. A biblioteca requests não define tempo limite por padrão. Um único valor de tempo limite controla a espera pela conexão e pela leitura; ele não é um prazo para o download completo da resposta.

Chame raise_for_status() antes de usar o corpo. Esse método gera um erro HTTP para respostas 4xx e 5xx. Uma mensagem de erro em JSON pode ser interpretada sem falhas e ainda assim descrever uma requisição malsucedida; por outro lado, uma resposta 200 pode conter texto que não é JSON, fazendo resp.json() falhar. Inspecione resp.text quando o formato da resposta for inesperado.

StatusSignificado a investigar
200Requisição bem-sucedida
400Detalhes da requisição são inválidos
401Credenciais ausentes ou inválidas
403Acesso proibido
404Recurso solicitado não encontrado
429Frequência de requisições alta demais
5xxFalha no servidor
Mantenha as credenciais separadas

Use o método de autenticação documentado pela API. Para um token de portador, leia uma chave de uma variável de ambiente e envie-a em um cabeçalho:

import os

key = os.environ["WEATHER_API_KEY"]
headers = {"Authorization": "Bearer " + key}

Mantenha chaves fora do código salvo e dos cadernos computacionais. Se uma chave tiver sido compartilhada ou registrada em um repositório, revogue-a e substitua-a. Uma chave concede acesso; ocultar um valor exibido posteriormente não desfaz sua exposição.

Continue até ler todas as páginas

Siga o mecanismo de próxima página documentado pela API, seja por números de página, deslocamentos ou uma URL para a próxima página. Reúna os registros de cada página e pare na condição final indicada. Um total de 230 registros com 100 por página exige páginas de 100, 100 e 30. A primeira página pode ser perfeitamente válida enquanto o conjunto de dados está incompleto.

Compare a contagem coletada com o total informado, quando disponível. Respeite os limites de requisições por período: 429 exige esperar antes de outra requisição, e Retry-After pode especificar a espera. Esse cabeçalho pode conter segundos ou uma data HTTP. Salve respostas brutas para obter uma análise reproduzível e evitar baixar os mesmos dados a cada nova execução.

Reconheça outros formatos de tabelas da web

pd.read_html(url) retorna uma lista de DataFrames, um para cada tabela HTML correspondente. match="Population" restringe as tabelas pelo texto que contêm. A função exige uma dependência de análise HTML, como lxml ou BeautifulSoup com html5lib. pd.read_xml lê elementos XML repetidos como linhas, usando lxml ou parser="etree". Consulte os termos de um site antes de extrair dados e prefira um download oficial ou uma API quando disponível.

Principais conclusões

  • Envie valores de consulta com params e defina um tempo limite explícito.
  • Confira o status HTTP antes de interpretar o corpo esperado da resposta.
  • Mantenha chaves em variáveis de ambiente e substitua chaves expostas.
  • Siga a paginação até o fim e verifique a contagem coletada.
  • Respeite os limites de requisições e salve respostas brutas para garantir a reprodutibilidade.
  • read_html retorna uma lista de tabelas; XML tem um leitor separado.
5

Armazenar dados no formato de arquivo adequado

Salvar uma tabela é uma escolha sobre seu próximo uso. Um colega pode precisar de um CSV ou de uma pasta de trabalho legível, enquanto sua próxima análise precisa de tipos exatos e precisão completa. Você controlará a saída CSV, comparará formatos comuns de troca e formatos binários e usará Parquet para tabelas tipadas. Você também selecionará colunas e partições durante a leitura e manterá consistentes os arquivos do conjunto de dados à medida que novos dados forem adicionados.

5.1 Grave CSV sem dados adicionais acidentais

Uma exportação CSV deve preservar os valores necessários ao destinatário e deixar claras suas convenções. Escolha se o índice das linhas é dado, como os valores ausentes aparecem e se a saída se destina a uma análise precisa ou a uma exibição arredondada.

Escolha o que se torna uma coluna
df.to_csv("weather_processed.csv", index=False)

O padrão é gravar o índice. Para uma tabela com índice numerado comum, isso adiciona um primeiro campo sem nome; uma chamada posterior de read_csv pode mostrá-lo como "Unnamed: 0". index=False deixa esses números de linha de fora. Quando o índice contiver rótulos significativos, mantenha-o e leia-o novamente com index_col=0.

Valores ausentes normalmente tornam-se campos vazios. na_rep="NA" torna-os visíveis, mas o leitor que receber o arquivo deve interpretar esse marcador corretamente. Em uma tabela de cidades com Lyon a 21,5 °C e Osaka a 18,25 °C, um valor ausente de chuva para Osaka deve permanecer distinto de chuva zero.

Adapte-se à convenção de texto do destinatário
df.to_csv(
    "weather_export.csv",
    index=False,
    sep=";",
    decimal=",",
    na_rep="NA",
    date_format="%Y-%m-%d",
    encoding="utf-8"
)

As opções de separador e decimal produzem valores como Lyon;21,5;0,0. A saída de datas ISO mantém dia e mês inequívocos. Use encoding="utf-8-sig" quando um programa de planilha que receberá o arquivo precisar de uma BOM para reconhecer UTF-8.

float_format="%.1f" grava uma casa decimal. O valor 18,25 torna-se "18.2" com essa formatação, e a precisão descartada não pode ser recuperada do CSV. Mantenha precisão completa para dados de análise; crie um relatório arredondado separado quando necessário.

Confira o que sobrevive a um ciclo de gravação e leitura

CSV armazena caracteres sem metadados dos tipos de dados do pandas. Considere quatro colunas: um identificador "02139", uma data e hora, uma categoria ordenada A < B < C e inteiros com suporte a valores ausentes e uma lacuna. Uma leitura CSV padrão pode retornar o inteiro 2139, texto de data, rótulos de categoria simples sem sua ordem e números de ponto flutuante para as contagens.

Uma leitura concluída sem erro, portanto, não necessariamente restaurou o DataFrame original. Guarde as opções necessárias para reconstruir os dados, incluindo identificadores de texto, interpretação de datas e marcadores de valores ausentes. A ordem das categorias também precisa ser definida novamente. Para análises repetidas em que esses tipos são importantes, Parquet pode preservá-los diretamente.

Acrescente registros e proteja a entrada bruta
df.to_csv(
    "daily_results.csv",
    mode="a",
    header=False,
    index=False
)

Isso adiciona linhas a um arquivo existente. Mantenha a ordem das colunas e as convenções consistentes com esse arquivo. Com header=True, um acréscimo grava outro cabeçalho no meio, e o próximo leitor pode tratá-lo como um registro. Para um arquivo novo, grave o cabeçalho uma vez antes dos acréscimos posteriores.

Mantenha arquivos recebidos ou baixados inalterados em um local de dados brutos. Grave resultados derivados separadamente com nomes descritivos. Ao abrir novamente uma exportação processada, confira a contagem de linhas, as colunas, os valores ausentes e valores representativos, incluindo zeros à esquerda e datas.

Principais conclusões

  • Omita um índice de linhas padrão com index=False.
  • Escolha marcadores de valores ausentes, codificação e convenções numéricas adequados ao destinatário.
  • O arredondamento na saída remove precisão permanentemente.
  • Ciclos de gravação e leitura em CSV precisam de opções de leitura explícitas para restaurar tipos.
  • Acrescente linhas sem repetir cabeçalhos e mantenha arquivos brutos inalterados.

5.2 Escolha um formato para o próximo uso

O melhor formato de armazenamento depende de quem lerá os dados em seguida e do que deve ser preservado na troca. Uma tabela enviada a um colega, uma resposta aninhada de API e um conjunto de dados tipado para análise têm necessidades diferentes.

Compare armazenamento de texto e binário

Formatos de texto codificam caracteres visíveis. CSV é fácil de inspecionar e amplamente aceito; JSON representa naturalmente objetos e arrays aninhados. CSV não tem um esquema de tipos de colunas, e os tipos comuns de valores JSON não preservam todos os tipos de dados do pandas. Relê-los exige interpretação e pode exigir escolhas explícitas de tipos.

Formatos binários codificam dados para leitura direta por programas. Formatos como Parquet e Feather armazenam um esquema que descreve colunas e tipos, reduzindo a necessidade de inferir tipos novamente. O suporte a tipos ainda depende do formato e do leitor: objetos Python arbitrários não se tornam portáveis apenas porque o arquivo é binário.

Uma estrutura orientada por linhas mantém juntos os campos de um registro. Uma estrutura colunar mantém juntos os valores da mesma coluna. Análises frequentemente precisam de poucas colunas de muitas linhas, por isso leitores colunares podem ignorar colunas desnecessárias. Valores adjacentes semelhantes também são bem comprimidos. O tamanho e a velocidade dependem dos dados; um resultado de compressão para uma tabela não é uma proporção fixa para todas as tabelas.

Associe cada formato a uma tarefa
FormatoUso adequadoPrincipal consideração
CSVTroca de tabelas simplesReconstruir tipos na leitura
ExcelRelatórios usados em planilhasA estrutura e os limites da planilha importam
JSONRegistros aninhados e serviços da webEscolher a estrutura dos objetos e da tabela
ParquetConjuntos de dados de análise armazenadosTipado, colunar, comprimido e amplamente aceito
FeatherTroca rápida de DataFramesArmazenamento baseado em Arrow para ferramentas compatíveis
pickleObjetos Python temporários de uso pessoalConfiança e compatibilidade de versões importam
HDF5Vários conjuntos de dados científicos grandesOrganização hierárquica; PyTables para pandas
Banco de dadosConsultas e atualizações compartilhadasConexões, permissões e transações

Parquet é um formato aberto usado por pandas, R, Spark e DuckDB. Feather usa Arrow IPC e é útil para troca rápida entre Python e R ou entre etapas locais. to_feather e read_feather permitem essa troca. HDF5 agrupa vários conjuntos de dados em um arquivo; to_hdf do pandas exige PyTables.

Entenda o limite de confiança do pickle

pickle pode salvar objetos Python além de tabelas comuns, mas carregá-lo pode executar código. Nunca carregue um pickle de uma fonte não confiável. Use-o para seus próprios objetos de curta duração e espere limites de compatibilidade à medida que Python e as bibliotecas mudam. Por exemplo, o pandas 3 não oferece mais suporte à leitura de pickles criados com versões do pandas anteriores à 1.0.

Decida com base no resultado necessário

Se um destinatário precisar inspecionar uma tabela pequena sem ferramentas especiais, CSV é prático. Se precisar de planilhas nomeadas em uma pasta de trabalho, use Excel. Se você precisar preservar identificadores, categorias e tipos com suporte a valores ausentes entre sessões de análise, escolha Parquet. Se vários programas precisarem consultar e atualizar registros compartilhados, um banco de dados é mais adequado à tarefa que passar cópias de um arquivo. A escolha do formato depende do próximo uso, não da extensão da entrada original.

Principais conclusões

  • Escolha um formato considerando o destinatário, a estrutura dos dados e a fidelidade necessária aos tipos.
  • Formatos colunares permitem ler colunas selecionadas e obter boa compressão.
  • Parquet é adequado para tabelas de análise armazenadas; Excel é adequado para relatórios em planilhas.
  • Feather permite troca rápida; HDF5 agrupa conjuntos de dados científicos.
  • Pickles não confiáveis podem executar código quando carregados.
  • Bancos de dados permitem consultas e atualizações compartilhadas.

5.3 Mantenha tabelas tipadas em Parquet

Parquet armazena uma tabela com os tipos das colunas em um formato aberto e colunar. É útil quando um DataFrame verificado será carregado repetidamente ou passado a outras ferramentas de análise. O pandas usa PyArrow nos exemplos abaixo.

Grave e verifique um ciclo de gravação e leitura com tipos preservados
df.to_parquet("sales.parquet", engine="pyarrow")
restored = pd.read_parquet("sales.parquet", engine="pyarrow")
print(restored.dtypes)

Um identificador de texto "02139", uma coluna de data e hora, uma categoria ordenada e inteiros com suporte a valores ausentes podem preservar seus tipos nesse ciclo do pandas para o PyArrow e de volta ao pandas. Diferentemente de uma leitura de CSV, não é necessário inferir a função do identificador nem recriar a ordem das categorias. Inspecione os tipos e valores representativos ao introduzir um novo leitor ou programa de gravação.

O padrão index=None armazena um RangeIndex de forma compacta como metadado. Outro índice é gravado como colunas e restaurado na leitura. Use index=False quando o índice não for necessário. Essa escolha diz respeito aos rótulos das linhas, independentemente das colunas comuns da tabela.

Leia menos dados e escolha a compressão
small = pd.read_parquet(
    "sales.parquet",
    columns=["zip", "amount"]
)

O leitor pode recuperar do armazenamento apenas essas colunas. Isso é diferente de carregar a tabela inteira e selecionar depois, pois nesse caso o custo da leitura completa já foi pago. A seleção de colunas é especialmente útil para tabelas com muitas colunas.

Snappy é o codec de compressão padrão. compression="zstd" ou "gzip" frequentemente exige mais trabalho de gravação em troca de menor espaço de armazenamento, enquanto compression=None grava dados sem compressão. Meça essa relação com dados representativos; rótulos repetidos e medidas aleatórias não são comprimidos da mesma forma. Instale PyArrow; o mecanismo alternativo fastparquet está obsoleto no pandas 3.1.

Organize um conjunto de dados em partições
df.to_parquet(
    "sales_dataset",
    engine="pyarrow",
    partition_cols=["year"],
    index=False
)
recent = pd.read_parquet(
    "sales_dataset",
    filters=[("year", "==", 2026)]
)

O destino é um diretório com subdiretórios como year=2025 e year=2026. Ler o diretório carrega o conjunto de dados; um filtro pode evitar partições não relacionadas. Nessa estrutura, o PyArrow obtém os valores de year dos nomes dos diretórios, e o pandas geralmente recebe uma coluna categórica de partição.

Escolha uma coluna de partição com um pequeno conjunto de valores úteis usados frequentemente em filtros. Um ID exclusivo de registro cria milhares de partições minúsculas, aumentando o trabalho com arquivos e diretórios. Ano ou um pequeno conjunto de regiões costuma oferecer uma divisão mais prática.

Adicione dados sem corromper o conjunto

Um único arquivo Parquet não permite acrescentar linhas pelo pandas como em CSV. Grave novos arquivos ou partições no diretório do conjunto de dados ou leia, combine e regrave um único arquivo. Arquivos que compõem um conjunto de dados precisam de esquemas compatíveis. Se um armazenar um código como texto e outro como inteiro, o carregamento poderá falhar ou converter valores. Defina tipos de dados consistentes antes de gravar cada parte e confira se uma partição adicionada não cria cópias sobrepostas dos mesmos registros.

Principais conclusões

  • Parquet preserva os tipos de colunas aceitos por leitores compatíveis.
  • columns lê apenas as colunas necessárias; filters limita os dados aos que correspondem ao filtro.
  • O armazenamento do índice é controlado separadamente das colunas comuns.
  • Particione por poucos valores usados frequentemente em filtros, evitando arquivos minúsculos.
  • Adicione arquivos ao conjunto de dados com esquemas compatíveis; não acrescente bytes a um único arquivo.
6

Ler e gravar dados em bancos de dados SQL

O trabalho com bancos de dados reúne duas decisões: qual resultado requisitar e qual alteração armazenar. Você abrirá e fechará conexões, lerá consultas SQL fornecidas no pandas e vinculará valores variáveis sem alterar a estrutura da consulta. Depois, controlará os tipos dos resultados e a divisão em blocos, escolherá um modo de gravação em tabela e verificará seu efeito, incluindo a diferença entre uma carga completa e um acréscimo repetido.

6.1 Abra uma conexão com um banco de dados e leia um resultado

Um banco de dados relacional armazena registros em tabelas com colunas nomeadas. Um programa envia uma consulta SQL por uma conexão e recebe um resultado que o pandas pode transformar em DataFrame. O banco de dados pode selecionar apenas os dados necessários antes de enviá-los ao Python.

Comece com um arquivo SQLite
import sqlite3
import pandas as pd

con = sqlite3.connect("shop.db")
try:
    df = pd.read_sql_query(
        "SELECT region, amount FROM sales", con
    )
finally:
    con.close()

SQLite funciona sem um servidor separado e armazena um banco de dados em um arquivo. A conexão cria o arquivo se ele não existir, por isso um caminho digitado incorretamente pode abrir um banco novo e vazio em vez do desejado. ":memory:" cria um banco de dados temporário na memória. A consulta acima retorna as colunas region e amount de uma tabela sales existente; os nomes das colunas do resultado tornam-se rótulos do DataFrame.

O bloco with de uma conexão SQLite gerencia uma transação, não o fechamento da conexão. Chame close() explicitamente ao terminar. Um bloco try/finally fecha a conexão mesmo se a leitura gerar um erro.

Use um mecanismo para um banco de dados de servidor

O SQLAlchemy fornece mecanismos para sistemas como PostgreSQL, MySQL e SQL Server, com um driver correspondente instalado. Uma URL de conexão identifica o dialeto, o driver, o servidor e o banco de dados. Mantenha-a em uma variável de ambiente:

import os
from sqlalchemy import create_engine

engine = create_engine(os.environ["ANALYSIS_DB_URL"])
try:
    with engine.connect() as conn:
        df = pd.read_sql_query(
            "SELECT region, amount FROM sales", conn
        )
finally:
    engine.dispose()

O contexto da conexão devolve a conexão ao conjunto de conexões do mecanismo. dispose() libera os recursos desse conjunto quando o mecanismo não é mais necessário. Use uma conta somente de leitura para análise e mantenha credenciais fora de cadernos computacionais e do controle de versão. Uma URL de mecanismo para um arquivo SQLite local pode ser "sqlite:///shop.db".

Escolha o leitor compatível com a entrada
LeitorEntrada
read_sql_queryUma consulta SQL e uma conexão
read_sql_tableUm nome de tabela e uma conexão ou mecanismo SQLAlchemy
read_sqlUma consulta ou, com conectividade compatível, um nome de tabela

Com uma conexão sqlite3 direta, passe uma consulta completa. pd.read_sql("sales", con) envia sales como SQL e falha; use pd.read_sql_query("SELECT * FROM sales", con). O pandas oferece suporte a conexões SQLAlchemy, ADBC e SQLite; uma conexão direta de driver arbitrário não é uma alternativa compatível apenas porque o driver consegue executar SQL.

Transfira o resultado necessário

Uma consulta que retorna linhas e colunas selecionadas transfere menos dados que ler uma tabela inteira e descartar a maior parte no pandas. A consulta fornecida SELECT SUM(amount) AS total FROM sales retorna um valor agregado, com o rótulo total. Ler o resultado de uma consulta não altera a tabela armazenada. Após o carregamento, confira a contagem de linhas e os tipos como faria com um arquivo; os tipos declarados no banco de dados e os tipos retornados pelo pandas estão relacionados, mas não são idênticos.

Principais conclusões

  • SQLite é um banco de dados em arquivo local; bancos de servidor precisam de conexão e driver.
  • Use consultas completas com uma conexão SQLite direta.
  • Deixe a consulta reduzir as linhas e colunas transferidas ao pandas.
  • Mantenha as credenciais separadas e use acesso somente de leitura para análise.
  • Feche conexões SQLite e libere recursos do SQLAlchemy.

6.2 Mantenha os valores da consulta separados do SQL

Valores variáveis devem ficar em parâmetros de consulta. A instrução SQL define a operação; os parâmetros vinculados fornecem a região, o limite ou outro valor usado nessa execução. Isso preserva a estrutura da consulta mesmo quando um valor contém uma aspa.

Vincule valores com a sintaxe da conexão

Para SQLite:

query = "SELECT region, amount, sold_on FROM sales WHERE amount > ? ORDER BY amount DESC"
df = pd.read_sql_query(query, con, params=(70,))

Para os valores de vendas 120,0, 75,5, 60,0 e 210,0, isso retorna 210,0, 120,0 e 75,5 em ordem decrescente. A tupla (70,) tem um elemento; (70) é apenas o número 70. SQLite também aceita marcadores de parâmetro nomeados, por exemplo, WHERE region = :r com params={"r": "North"}.

As regras dos marcadores dependem da interface. psycopg usa %s ou %(name)s. Com SQLAlchemy, envolva uma instrução em text e use parâmetros nomeados:

from sqlalchemy import text

query = text("SELECT region, amount FROM sales WHERE amount >= :m")
with engine.connect() as conn:
    df = pd.read_sql_query(query, conn, params={"m": 100})

Passe valores por params; não use formatação Python para inseri-los na instrução.

Entenda o que a parametrização protege

Suponha que um código construa uma condição usando uma f-string e uma entrada "x' OR '1'='1". Colá-la entre aspas altera a condição para region = 'x' OR '1'='1', que corresponde a todas as linhas. Isso é injeção de SQL: um valor tornou-se parte executável da estrutura da consulta.

Um parâmetro vinculado é comparado como um único valor, por isso essa mesma string corresponde apenas a uma região que tenha literalmente esse texto. A vinculação também trata nomes comuns que contêm apóstrofos sem necessidade de escapar aspas manualmente. A regra se aplica tanto a entradas de arquivos quanto de formulários de usuários.

Parâmetros representam valores, não nomes de tabelas ou colunas. Um parâmetro no lugar de um nome de tabela não seleciona essa tabela. Quando um programa precisar de um identificador variável, escolha-o em uma lista fixa controlada pelo código.

Controle os tipos no resultado

SQLite geralmente armazena datas como texto. Peça ao pandas que as interprete:

df = pd.read_sql_query(
    "SELECT sold_on, visits FROM observations", con,
    parse_dates=["sold_on"],
    dtype={"visits": "Int64"}
)

A coluna de data torna-se uma coluna de valores de data e hora, e uma contagem com NULL do SQL usa inteiros com suporte a valores ausentes em vez de se tornar ponto flutuante apenas para conter lacunas. Inspecione o resultado para conferir a conversão.

Diferencie blocos do armazenamento temporário pelo driver

chunksize=1000 retorna um iterador de DataFrames com no máximo 1.000 linhas cada. Um resultado de quatro linhas com chunksize=3 produz partes de três e uma linha. Mantenha a conexão aberta enquanto as processa. Alguns drivers de banco de dados ainda armazenam temporariamente o resultado inteiro antes de o pandas fornecer os blocos; um cursor no servidor ou uma configuração de leitura em fluxo também pode ser necessário para limitar a memória em todo o caminho da conexão.

Principais conclusões

  • Vincule valores variáveis por params usando o estilo de marcador de parâmetro da interface.
  • Uma tupla posicional de um valor precisa de uma vírgula final.
  • Parâmetros impedem que um valor altere a estrutura da consulta.
  • Escolha nomes variáveis de tabelas e colunas em uma lista fixa aprovada.
  • Interprete datas e solicite explicitamente tipos inteiros com suporte a valores ausentes para os resultados.
  • O tamanho dos blocos do pandas não determina como o driver armazena dados temporariamente.

6.3 Grave tabelas e verifique a alteração desejada

to_sql cria uma tabela de banco de dados a partir de um DataFrame ou grava linhas em uma tabela existente. Suas opções determinam se os dados existentes são preservados, se o índice se torna uma coluna e como um grupo de gravações é confirmado.

Escolha o comportamento para uma tabela existente
df.to_sql("sales", con, index=False)

O padrão if_exists="fail" interrompe a operação quando sales já existe. Escolha outro modo apenas quando seu efeito corresponder à carga desejada:

ModoComportamento para tabela existente
failInterrompe sem carregar dados nessa tabela
appendAcrescenta linhas ao conteúdo existente
replaceRemove a tabela e a cria novamente
delete_rowsRemove todas as linhas, mantém a tabela e depois insere

delete_rows está disponível no pandas 3. Substituir uma tabela remove sua definição antiga, incluindo chaves, índices e restrições; permissões específicas do banco de dados também podem ser afetadas. Excluir linhas preserva a definição, mas ainda apaga todos os registros existentes. Use essa opção para uma recarga completa pretendida, não quando o DataFrame contiver apenas um novo lote.

Defina as colunas e grave em uma transação

O padrão grava o índice do DataFrame como coluna. Um índice sem nome torna-se index; um índice nomeado mantém o nome. index_label fornece um nome explícito, e index=False o exclui. Se um ID já for uma coluna comum, gravar os números de linha padrão geralmente não acrescenta informação útil.

Com SQLAlchemy, dtype pode escolher tipos do banco de dados:

from sqlalchemy import types

with engine.begin() as conn:
    df.to_sql(
        "sales", conn,
        if_exists="append",
        index=False,
        dtype={"sold_on": types.Date()},
        chunksize=1000
    )

engine.begin() confirma a transação quando o bloco termina sem erro e a reverte em caso de exceção. Para uma tabela existente, o esquema armazenado ainda determina quais valores podem ser inseridos; dtype não é um comando para redesenhar as colunas. As garantias da transação também dependem do suporte do banco de dados às operações usadas. Acrescentar dados dentro de uma transação SQLAlchemy mantém unida a carga de inserção do exemplo.

chunksize agrupa linhas em lotes. method="multi" coloca várias linhas em uma instrução INSERT onde houver suporte. Isso pode melhorar ou reduzir o desempenho dependendo do banco de dados e do tamanho do lote, por isso meça com dados representativos.

Verifique o crescimento, não apenas a conclusão
check = pd.read_sql_query("SELECT COUNT(*) AS n FROM sales", con)
print(check["n"].iloc[0])

Para uma tabela nova ou totalmente recarregada, compare a contagem com len(df). Para um acréscimo, compare o aumento: uma tabela com quatro linhas que recebe duas deve conter seis. A contagem de linhas retornada por to_sql vem do que o driver informa; verifique os dados armazenados diretamente.

Executar um acréscimo duas vezes repete os registros, a menos que o banco de dados rejeite duplicatas ou o programa selecione apenas registros novos. Decida se a operação é uma recarga completa ou um acréscimo de novos registros antes de executá-la novamente. Uma transação impede uma carga parcial em caso de falha; ela não torna únicos acréscimos bem-sucedidos repetidos.

Principais conclusões

  • append adiciona linhas; replace remove a tabela; delete_rows mantém sua definição.
  • Use index=False, a menos que o índice faça parte dos dados armazenados.
  • Use uma transação SQLAlchemy para confirmar ou reverter uma carga como um todo.
  • Verifique um acréscimo pelo aumento esperado de linhas armazenadas.
  • Repetir um acréscimo bem-sucedido pode duplicar registros.
  • O desempenho do tamanho de lote e de INSERT com várias linhas depende do banco de dados.

Exercícios resolvidos de Ler e gravar dados no pandas

6 Lições Interativas

1

Construa uma tabela confiável a partir de texto

17 passos
Parta de registros brutos até chegar a um DataFrame verificado, escolhendo cabeçalhos, formatos numéricos, tipos e limites do relatório.
  1. 1
    IntroduçãoLeia a estrutura antes dos valores

    Uma exportação de texto deixa escolhas importantes para quem a lê. Uma vírgula pode dividir campos ou ocorrer dentro de um nome entre aspas; um número pode ser uma medida ou um identificador.

    Primeiro você definirá os registros e as colunas, depois interpretará os valores e, por fim, removerá o material do relatório que está fora da tabela. Inspecione o resultado após cada decisão para que uma leitura bem-sucedida não oculte dados alterados.

  2. 2
    ExemploCarregue três registros de vendas

    O arquivo de vendas tem um cabeçalho e três observações:

    order_id,date,region,units,price
    1001,2026-03-02,North,3,4.50
    1002,2026-03-02,South,1,12.00
    1003,2026-03-03,North,2,7.25
    

    df = pd.read_csv("sales.csv") produz a forma (3, 5). units é uma coluna de inteiros e price é de ponto flutuante. As strings que parecem datas ainda precisam ser interpretadas como datas.

  3. 3
    ExplicaçãoDê uma finalidade a cada inspeção

    Use head() para verificar se os campos estão sob os nomes desejados, shape para comparar dimensões e dtypes para inspecionar a interpretação. info() acrescenta contagens de valores não nulos.

    Se uma coluna numérica for texto, inspecione os valores brutos em busca de marcadores ou convenções numéricas. Se um arquivo não for encontrado, confira o diretório de trabalho atual: alterar opções de colunas não corrige um caminho relativo que aponta para o local errado.

  4. 4
    DesafioMantenha a primeira observação

    Um arquivo sem cabeçalho começa com V12,South,6 e tem 40 observações. Uma leitura padrão produz 39 linhas com esses três valores como rótulos. Qual alteração na leitura mantém todas as observações e fornece nomes úteis?

    ---reveal---

    Use header=None, names=["site", "region", "units"]. O primeiro registro permanece como dado, por isso a forma esperada é (40, 3). Fornecer nomes substitutos com header=0 ainda consumiria esse primeiro registro.

  5. 5
    Ideia-chaveAs aspas definem o limite do campo

    O registro "Smith, Jane",Boston,10 tem três campos. A vírgula dentro das aspas faz parte do nome. Uma aspa duplicada dentro de um campo entre aspas representa uma aspa literal.

    Campos entre aspas também podem conter uma quebra de linha. Deixe read_csv interpretar os registros: dividir cada linha física por vírgulas pode criar tanto colunas falsas quanto registros falsos.

  6. 6
    ExemploIdentifique três símbolos diferentes

    A exportação de produtos contém Tea;3,50;1.200. Um ponto e vírgula separa os campos, uma vírgula marca a parte fracionária do preço e um ponto agrupa os algarismos da quantidade.

    df = pd.read_csv(
        "products.csv", sep=";",
        decimal=",", thousands="."
    )
    

    Os valores tornam-se preço 3,5 e quantidade 1.200. A opção de separador, por si só, não define a convenção numérica.

  7. 7
    DesafioDetecte um erro de escala silencioso

    Uma exportação com ponto e vírgula documenta as quantidades como unidades inteiras. A quantidade bruta é "6.400", mas uma leitura que usa apenas sep=";" produz 6,4. Qual opção numérica e qual valor esperado corrigem a interpretação?

    ---reveal---

    Use thousands="." para interpretar o ponto como separador de milhares, produzindo 6.400. O valor 6,4 é numericamente válido quando o ponto é interpretado como separador decimal, por isso esse erro pode ocorrer sem uma exceção. Compare os valores carregados com a fonte.

  8. 8
    DicaEscolha o mecanismo adequado às opções necessárias

    O mecanismo C habitual trata arquivos comuns rapidamente. O mecanismo Python oferece detecção de separador, separadores gerais expressos como expressões regulares e opção para ignorar o rodapé. sep=None pode detectar um separador, mas pode inferi-lo incorretamente em relatórios irregulares.

    Informe um separador que você já conhece. Selecione engine="python" ao usar skipfooter; o mecanismo PyArrow tem seus próprios limites de opções, incluindo a ausência de suporte a chunksize.

  9. 9
    ExemploDefina marcadores de valores ausentes por coluna

    Os valores de pontuação são 88, "n/a", "-" e 999. Os dois últimos são marcadores de valores ausentes documentados.

    df = pd.read_csv(
        "scores.csv",
        na_values={"score": ["-", "999"]}
    )
    

    A coluna de pontuação passa a conter 88,0 seguido de três valores ausentes. Restrinja a regra a score para que um 999 legítimo em outra coluna permaneça como dado. Um valor sentinela não declarado pode distorcer totais e médias.

  10. 10
    ExplicaçãoPreserve códigos e interprete datas

    Um identificador como "00501" precisa ser armazenado como texto, enquanto contagens com lacunas podem usar "Int64" com suporte a valores ausentes. Datas também precisam de interpretação própria.

    df = pd.read_csv(
        "visits.csv",
        dtype={"code": str, "visits": "Int64"},
        parse_dates=["day"], date_format="%d/%m/%Y"
    )
    

    O padrão explícito faz "03/04/2026" ser interpretado como 3 de abril. Inspecione os tipos de dados depois para confirmar que a conversão solicitada realmente ocorreu.

  11. 11
    DesafioRespeite um rótulo real e uma lacuna

    Em um CSV, a zona "NA" é um rótulo real. Um campo visits vazio significa valor ausente e as contagens conhecidas são inteiras. Quais escolhas de valores ausentes e tipos preservam esses significados?

    ---reveal---

    Use keep_default_na=False, na_values={"visits": [""]}, dtype={"visits": "Int64"}. O rótulo da zona é preservado, enquanto campos de visitas vazios tornam-se valores inteiros ausentes. Deixar os marcadores padrão ativados também removeria o rótulo real "NA".

  12. 12
    ExemploLocalize a tabela do relatório

    Um relatório tem três linhas antes do cabeçalho, um comentário iniciado por # no corpo e observações seguidas por um total e uma nota sobre a fonte.

    df = pd.read_csv(
        "report.csv", skiprows=3, comment="#",
        skipfooter=2, engine="python"
    )
    

    As linhas de título, o comentário e o rodapé são excluídos. Se as observações de janeiro somarem 218, manter uma linha de total de 218 faria a soma da coluna chegar incorretamente a 436.

  13. 13
    Ideia-chaveNem todo registro com problema gera erro

    Campos adicionais podem provocar um erro de linha malformada. Poucos campos podem, em vez disso, produzir valores ausentes no final: sob id,name,score, o registro 2,Ben é carregado sem pontuação.

    Ignorar registros malformados também descarta suas observações. Confira separadamente as contagens de linhas e de valores ausentes e investigue um separador incorreto ou um campo sem aspas antes de decidir que registros devem ser removidos.

  14. 14
    DesafioMantenha as posições corretas

    Uma exportação de largura fixa atribui as posições de 0 a 2 a um código, de 3 a 9 a um nome e de 10 a 14 a um valor. Quais colspecs correspondem a esses campos?

    ---reveal---

    Use [(0, 3), (3, 10), (10, 15)]. Cada intervalo inclui seu início e exclui seu fim, resultando em larguras 3, 7 e 5. Usar 2, 9 e 14 como extremos finais eliminaria o último caractere de cada campo, pois esses extremos são excluídos.

  15. 15
    ExplicaçãoEscolha rótulos em níveis ou sem hierarquia

    Quando duas linhas de cabeçalho descrevem grupos e anos, header=[0, 1] cria rótulos de colunas com dois níveis. Uma coluna de vendas pode então ser identificada por ("sales", "2026").

    Se a análise precisar de nomes comuns sem hierarquia, ignore as duas linhas de cabeçalho e forneça nomes como "region", "sales_2025" e "sales_2026". Confira se nenhuma das linhas de cabeçalho permaneceu entre as observações.

  16. 16
    DesafioCombine escolhas de estrutura e de valores

    Uma exportação tem uma linha de título e depois o cabeçalho code;amount;day. Um registro é 00018;2.100,50;11/12/2026. Os valores usam ponto para agrupar milhares e vírgula decimal; as datas têm o dia primeiro. Informe as escolhas essenciais de leitura.

    ---reveal---

    Use skiprows=1, sep=";", thousands=".", decimal=",", dtype={"code": str}, parse_dates=["day"], date_format="%d/%m/%Y". O registro mantém o código "00018", o valor 2.100,5 e a data de 11 de dezembro.

  17. 17
    RecapitulaçãoConfira o significado dos dados importados

    Primeiro ajuste os limites dos registros, os cabeçalhos e os limites da tabela. Depois defina convenções numéricas, marcadores de valores ausentes, tipos de identificadores e datas.

    Inspecione dimensões e tipos, compare valores brutos selecionados e confira lacunas e totais. Um analisador pode terminar sem erro e ainda perder um zero à esquerda, trocar uma data ou contar um total do relatório como observação. Essas verificações mostram se a tabela importada tem o mesmo significado que o arquivo.

2

Decodifique texto e processe-o em partes

13 passos
Diagnostique caracteres danificados e depois processe entradas grandes ou comprimidas sem manter o conjunto de dados inteiro.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoDois problemas de leitura distintos
  2. 2
    ExemploAcompanhe a transformação de um caractere em bytes
  3. 3
    ExplicaçãoUse marcadores e documentação
  4. 4
    DesafioInterprete a assinatura
  5. 5
    ExemploCorrija a interpretação original
  6. 6
    DicaNão apague caracteres ilegíveis
  7. 7
    DesafioEscolha as evidências, não apenas a ausência de erro
  8. 8
    ExplicaçãoMeça a tabela carregada
  9. 9
    ExemploMantenha uma soma e uma contagem acumuladas
  10. 10
    DesafioDê o mesmo peso às observações
  11. 11
    Ideia-chaveCompressão e divisão em blocos tratam custos diferentes
  12. 12
    DesafioPreserve a economia de memória
  13. 13
    RecapitulaçãoMantenha confiáveis os bytes e os resultados parciais
3

Leia uma pasta de trabalho e construa um relatório claro

11 passos
Localize observações em planilhas, entenda as células armazenadas e salve várias tabelas sem perder planilhas.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoSepare a tabela de sua apresentação
  2. 2
    ExemploSelecione as observações em Q1
  3. 3
    ExplicaçãoLeia o valor armazenado
  4. 4
    Ideia-chaveUma fórmula não é uma solicitação de cálculo
  5. 5
    DesafioExplique duas células suspeitas
  6. 6
    DicaConfira o conjunto de planilhas
  7. 7
    ExemploGrave duas planilhas com um único objeto de gravação
  8. 8
    ExplicaçãoEscolha como uma planilha existente será alterada
  9. 9
    DesafioEvite deixar linhas antigas
  10. 10
    DesafioConstrua um relatório a partir de várias planilhas de origem
  11. 11
    RecapitulaçãoVerifique a pasta de trabalho nas duas pontas
4

Transforme registros de API em uma tabela com a granularidade correta

16 passos
Interprete JSON, expanda registros aninhados e colete resultados completos de APIs com verificações em cada etapa.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoDo texto da resposta às observações
  2. 2
    ExemploConverta valores JSON para Python
  3. 3
    ExplicaçãoEscolha explicitamente uma estrutura de tabela
  4. 4
    DesafioPreserve um identificador JSON
  5. 5
    DicaTorne o JSON trocado legível e válido
  6. 6
    ExemploComece com uma linha por pedido
  7. 7
    ExemploExpanda a lista escolhida
  8. 8
    Ideia-chaveAjuste os totais à granularidade da linha
  9. 9
    DesafioMantenha visível um objeto pai sem itens
  10. 10
    ExemploConfira o status antes de construir uma tabela
  11. 11
    DicaProteja o acesso e respeite os tempos de espera
  12. 12
    DesafioConsidere todas as páginas
  13. 13
    ExplicaçãoRetire os registros do objeto envoltório e inspecione lacunas
  14. 14
    ConexãoReconheça outro formato da web
  15. 15
    DesafioSepare a coleta da normalização
  16. 16
    RecapitulaçãoConfira cada etapa na ordem
5

Escolha o que o arquivo salvo preserva

13 passos
Controle exportações CSV, compare opções de armazenamento e leia partes úteis de um conjunto de dados Parquet tipado.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoSalve para quem lerá em seguida
  2. 2
    ExemploGrave os campos CSV desejados
  3. 3
    Ideia-chaveUma exportação pode descartar precisão e tipos
  4. 4
    DesafioAcrescente apenas registros
  5. 5
    ExplicaçãoLeia colunas sem ler todos os campos
  6. 6
    ConexãoAssocie formatos a atividades
  7. 7
    DesafioEscolha portabilidade e confiança
  8. 8
    ExemploGrave e leia uma tabela tipada
  9. 9
    ExemploUse uma divisão útil em diretórios
  10. 10
    DesafioEvite milhares de partes minúsculas
  11. 11
    DicaAdicione arquivos com tipos compatíveis
  12. 12
    DesafioMantenha um relatório e um conjunto de dados para análise
  13. 13
    RecapitulaçãoVerifique as propriedades necessárias depois
6

Leia resultados de consultas e verifique gravações em tabelas

14 passos
Gerencie conexões, vincule valores, controle os tipos dos resultados e armazene um lote verificando o efeito no banco de dados.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoUma leitura retorna dados; uma gravação os altera
  2. 2
    ExemploLeia um banco de dados SQLite local
  3. 3
    ExplicaçãoGerencie a duração do mecanismo e das conexões
  4. 4
    DesafioEnvie uma consulta em vez de um nome de tabela
  5. 5
    ExemploVincule um limite variável
  6. 6
    Ideia-chaveUm valor não pode se tornar sintaxe de consulta
  7. 7
    DesafioPreserve os tipos e os limites dos parâmetros
  8. 8
    DicaProcesse os blocos enquanto a conexão estiver aberta
  9. 9
    ExplicaçãoDecida o que acontece com os registros existentes
  10. 10
    ExemploAcrescente dados dentro de uma transação
  11. 11
    DesafioVerifique a alteração e a nova execução
  12. 12
    DicaConfira diretamente os resultados armazenados
  13. 13
    DesafioMantenha a definição e substitua um retrato completo dos dados
  14. 14
    RecapitulaçãoAjuste a chamada ao efeito no banco de dados

Questões de Ler e gravar dados no pandas

50 Questões de Prática em 5 conjuntos

Conjunto 1: Leia os dados e confira seu significado10 Questões de Prática

Questão 1 de 10

Um arquivo sem cabeçalho começa com S14,East,8. Como ele deve ser lido para que esse registro permaneça como dado?
  1. header=0, names=["site", "zone", "count"]
  2. header=None, names=["site", "zone", "count"]
  3. header=1, names=["site", "zone", "count"]
  4. skiprows=1, names=["site", "zone", "count"]
Mostrar respostaOcultar resposta
Resposta: B
header=None informa que não há linha de rótulos, enquanto names fornece os rótulos separadamente. Usar header=0 consumiria o primeiro registro como cabeçalho, mesmo com nomes substitutos fornecidos. A linha que começa com S14 deve permanecer entre as observações.

Questão 2 de 10

Um arquivo separado por ponto e vírgula contém sensor;distance_m seguido de R8;2.450,75. Como fazer a distância ser interpretada como 2.450,75?
  1. sep=";", decimal=".", thousands=","
  2. sep=",", decimal=",", thousands="."
  3. sep=";", decimal=",", thousands=" "
  4. sep=";", decimal=",", thousands="."
Mostrar respostaOcultar resposta
Resposta: D
O ponto e vírgula divide os campos, a vírgula marca a parte fracionária e o ponto agrupa milhares. Essas configurações convertem a distância para 2.450,75. Inverter as configurações decimal e de agrupamento não corresponde ao número de origem, mesmo que o separador de campos esteja correto.

Questão 3 de 10

Em UTF-8, cada letra ASCII usa um byte e "é" usa dois. Quantos bytes codificam "été"?
  1. 5 bytes
  2. 3 bytes
  3. 4 bytes
  4. 6 bytes
Mostrar respostaOcultar resposta
Resposta: A
Cada uma das duas letras acentuadas usa dois bytes, e a letra ASCII "t" usa um, totalizando cinco bytes. Contar três mede os caracteres, não o tamanho codificado. A distinção importa ao examinar bytes armazenados ou diagnosticar um problema de codificação.

Questão 4 de 10

Uma planilha tem um título na linha 1, a linha 2 vazia, rótulos na linha 3, três observações nas linhas 4 a 6 e um total na linha 7. Quais opções de leitura isolam as observações?
  1. skiprows=3, nrows=3
  2. skiprows=2, nrows=4
  3. skiprows=2, nrows=3
  4. skiprows=1, nrows=3
Mostrar respostaOcultar resposta
Resposta: C
Ignorar duas linhas coloca a terceira linha da planilha como cabeçalho; depois, nrows=3 lê as três observações. Ignorar três consumiria a primeira observação como rótulos, com o comportamento padrão de cabeçalho. Ler quatro linhas de dados também incluiria o total como observação.

Questão 5 de 10

Um log tem um objeto JSON completo em cada linha e nenhum array ao redor. Qual opção de leitura do pandas corresponde a essa estrutura?
  1. orient="split"
  2. lines=False
  3. lines=True
  4. orient="index"
Mostrar respostaOcultar resposta
Resposta: C
lines=True informa ao pandas que interprete registros JSON separados linha por linha. Alterar apenas a orientação não transforma objetos sucessivos em um único documento JSON comum. O formato por linhas também permite leitura em blocos quando um log grande deve ser processado por partes.

Questão 6 de 10

Uma resposta tem as chaves count, next e results; cada entrada em results é um registro aninhado de equipamento. O que deve ser passado a json_normalize para obter uma tabela de equipamentos?
  1. data["results"]
  2. data
  3. data["count"]
  4. data["next"]
Mostrar respostaOcultar resposta
Resposta: A
O valor results contém os registros das observações, por isso normalizar essa lista produz linhas de equipamentos e expande campos de objetos aninhados. Normalizar o objeto envoltório inteiro produz uma linha para ele e deixa a lista de registros dentro de uma célula. Mantenha os outros campos para verificações da coleta e paginação.

Questão 7 de 10

Uma reimportação CSV contém uma nova coluna "Unnamed: 0" com apenas os antigos números de linha padrão. Qual alteração na exportação evita isso?
  1. Use header=False.
  2. Use na_rep="0".
  3. Use mode="a".
  4. Use index=False.
Mostrar respostaOcultar resposta
Resposta: D
O gravador CSV padrão inclui o índice do DataFrame, por isso os números de linha sem nome retornam como uma coluna adicional. index=False omite esses rótulos. Desativar o cabeçalho remove os nomes reais das colunas e não resolve o campo de índice indesejado.

Questão 8 de 10

Uma equipe precisa de um arquivo amplamente aceito para análises repetidas que preserve uma categoria ordenada e contagens com suporte a valores ausentes. Qual formato é mais adequado?
  1. Texto CSV
  2. Parquet
  3. Registros JSON
  4. Pasta de trabalho Excel
Mostrar respostaOcultar resposta
Resposta: B
Parquet armazena tipos de colunas e metadados aceitos, permitindo que esses tipos do pandas sobrevivam a um ciclo compatível de gravação e leitura. CSV preserva valores visíveis, mas perde a ordem das categorias e os metadados de inteiros com suporte a valores ausentes. Excel é útil para relatórios em planilhas, mas também pode alterar tipos do pandas na releitura.

Questão 9 de 10

Um banco de dados tem uma tabela readings existente, e con é uma conexão SQLite direta. Qual chamada a recupera como DataFrame?
  1. pd.read_sql("readings", con)
  2. pd.read_sql_table("readings", con)
  3. pd.read_sql_query("readings", con)
  4. pd.read_sql_query("SELECT * FROM readings", con)
Mostrar respostaOcultar resposta
Resposta: D
Uma consulta SQL completa pode ser executada pela conexão SQLite, e seu resultado torna-se um DataFrame. Um nome de tabela isolado não é uma consulta nesse tipo de conexão. read_sql_table precisa de conectividade SQLAlchemy em vez de uma conexão sqlite3 direta.

Questão 10 de 10

Uma consulta SQLite contém WHERE site = ?. Como o único valor "West" deve ser passado?
  1. params=("West",)
  2. params=("West")
  3. params={"site": "West"}
  4. params="West"
Mostrar respostaOcultar resposta
Resposta: A
Um marcador SQLite posicional precisa de uma sequência de valores; a vírgula final faz desta uma tupla de um elemento. Parênteses sem essa vírgula deixam uma string comum. Um dicionário nomeado é usado com um marcador nomeado correspondente, como :site, em vez do ponto de interrogação usado aqui.
Conjunto 2: Preserve valores entre arquivos e conexões10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Em um CSV, "NA" é um rótulo de zona válido e uma contagem vazia significa valor ausente. Qual configuração preserva os dois significados?
  1. keep_default_na=True, na_values={"count": [""]}
  2. keep_default_na=False, na_values={"zone": ["NA"]}
  3. keep_default_na=False, na_values={"count": [""]}
  4. keep_default_na=True, na_values={"zone": ["NA"]}
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Um cabeçalho CSV tem quatro campos. Um registro posterior fornece apenas três e é carregado sem erro. O que você deve verificar?
  1. A contagem de ausentes da última coluna e o registro bruto.
  2. Apenas a contagem de ausentes, ignorando a estrutura da fonte.
  3. Apenas avisos de linhas rejeitadas para o registro curto.
  4. A contagem total de linhas, para verificar a completude.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Um nome em uma fonte UTF-8 aparece como "André" após uma leitura em Windows-1252. Qual é a correção adequada?
  1. Ler novamente a tabela alterada com Latin-1.
  2. Substituir cada caractere não ASCII por um espaço.
  3. Salvar a tabela corrompida com uma BOM UTF-8.
  4. Ler novamente o arquivo original com UTF-8.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Um bloco tem os valores não ausentes 2, 6 e 10; um segundo tem 18. Qual é a média geral?
  1. 12
  2. 9
  3. 6
  4. 18
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Duas tabelas devem ser salvas em planilhas separadas de uma nova pasta de trabalho. Qual abordagem de gravação mantém as duas?
  1. Chamar to_excel duas vezes com o mesmo caminho de arquivo.
  2. Gravar ambas em um único contexto ExcelWriter.
  3. Gravar a segunda tabela com header=False nesse caminho.
  4. Abrir um novo objeto de gravação em modo de escrita para cada tabela.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma API informa 275 registros correspondentes e retorna páginas de no máximo 80 registros. Quantas requisições são necessárias para coletar o resultado completo?
  1. 4 requisições
  2. 3 requisições
  3. 5 requisições
  4. 275 requisições
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Um conjunto de dados Parquet é particionado em diretórios por ano. Uma análise precisa apenas de registros de 2024 e de duas colunas. Qual leitura usa esses dois recursos?
  1. pd.read_parquet(path, columns=["year"], filters=[("site", "==", 2024)])
  2. pd.read_parquet(path, columns=["site", "value", "year"])
  3. pd.read_parquet(path, filters=[("year", "!=", 2024)])
  4. pd.read_parquet(path, columns=["site", "value"], filters=[("year", "==", 2024)])
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Uma conexão SQLite é usada dentro de with con:. O que ainda precisa ser feito após o trabalho com o banco de dados terminar?
  1. Recriar a conexão para confirmar a transação.
  2. Liberar o conjunto de conexões.
  3. Fechar explicitamente a conexão.
  4. Abrir novamente para liberar a transação.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Um resultado SQLite contém texto de data ISO em day e contagens inteiras com NULL em n. Um script deve selecionar um local fornecido durante a execução sem alterar a estrutura da consulta. Qual combinação é adequada?
  1. Inserir o local no SQL por formatação, interpretar day e definir n como Int64.
  2. Vincular o local com params, manter day como texto e forçar n para int64.
  3. Vincular o local com params, interpretar day e definir n como Int64.
  4. Vincular um nome de tabela com params, interpretar day e definir n como Int64.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Uma tabela tem 32 linhas. Um lote de cinco linhas é acrescentado e depois acrescentado novamente após uma primeira execução bem-sucedida. Nenhuma restrição de unicidade o rejeita. Qual contagem e conclusão são adequadas?
  1. 42 linhas; novas execuções bem-sucedidas podem duplicar o lote.
  2. 37 linhas; o segundo acréscimo substitui o primeiro lote.
  3. 42 linhas; uma transação sempre detecta registros duplicados.
  4. 32 linhas; o acréscimo exige remover a tabela antes.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 3: Diagnostique importações antes de confiar na tabela10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Um registro CSV é "Field ""A,B""",7. Quais valores um analisador CSV padrão deve produzir?
  1. Field "A e B" e 7
  2. Field A e B e 7
  3. Field ""A,B"" e 7
  4. Field "A,B" e 7
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Um arquivo separado por ponto e vírgula contém code;score;day e 00064;999;07/08/2026. O código é um identificador, 999 significa ausente apenas para a pontuação e as datas têm o dia primeiro. Qual importação preserva os três significados?
  1. sep=";", dtype={"code": int}, na_values={"score": ["999"]}, parse_dates=["day"], date_format="%d/%m/%Y"
  2. sep=";", dtype={"code": str}, na_values={"score": ["999"]}, parse_dates=["day"], date_format="%d/%m/%Y"
  3. sep=";", dtype={"code": str}, na_values={"score": ["999"]}, parse_dates=["day"], date_format="%m/%d/%Y"
  4. sep=";", dtype={"code": str}, na_values={"code": ["999"]}, parse_dates=["day"], date_format="%d/%m/%Y"
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

A função open() do Python mantém uma BOM UTF-8 inicial no primeiro cabeçalho quando usa a decodificação UTF-8 simples. Qual configuração de codificação remove esse marcador?
  1. encoding="utf-8-sig"
  2. encoding="utf-16-le"
  3. encoding="cp1252"
  4. encoding="ascii"
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Um CSV enorme tem uma coluna numérica amount com algumas lacunas. O programa precisa calcular a média geral com memória limitada. Qual solução continua correta quando os blocos têm contagens diferentes de valores válidos?
  1. Acumular as médias dos blocos e dividir pelo número de blocos.
  2. Acumular as somas e dividir pelo tamanho de bloco solicitado.
  3. Acumular a soma e a contagem de valores não ausentes de cada bloco e dividir uma vez.
  4. Manter todos os blocos e concatená-los antes de calcular a média.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Uma pasta de trabalho armazena um código como o número 537 com formato de exibição 00000. Uma célula com fórmula não tem resultado em cache. O que você deve esperar de uma leitura do pandas que solicita um tipo de texto para o código?
  1. O código não terá os zeros exibidos, e o pandas não calculará a fórmula.
  2. O código terá os zeros exibidos, e o pandas calculará a fórmula.
  3. O código não terá os zeros exibidos, e o pandas calculará a fórmula.
  4. O código terá os zeros exibidos, e a fórmula será lida a partir do texto.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma string JSON contém [{"device":"00091","active":true}]. Como o pandas deve lê-la sem tratar a string como caminho nem eliminar os zeros do identificador?
  1. Usar text diretamente e dtype={"device": str}.
  2. Usar StringIO(text) e dtype={"device": int}.
  3. Usar json.dumps(text) e dtype={"device": str}.
  4. Usar StringIO(text) e dtype={"device": str}.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Uma API retorna HTTP 200 com JSON válido e uma URL next não vazia. A contagem de linhas coletadas é menor que count. Um colega informa que a tabela atual está completa. Qual é o problema?
  1. O total deveria ser substituído pela contagem da primeira página.
  2. A URL da próxima página deve apontar para os registros coletados.
  3. O sucesso HTTP foi confundido com a conclusão de todas as páginas.
  4. O campo de contagem do servidor mostra que os registros estão completos.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Um valor preciso de análise é 6,347. Ele é exportado com float_format="%.2f" e depois lido como número. Qual valor esse CSV pode restaurar?
  1. 6,347
  2. 6,35
  3. 6,34
  4. 6,3
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Um conjunto de dados particionado por ano armazena code como texto em 2025 e como inteiros em um arquivo proposto para 2026. Os novos dados também contêm apenas uma linha por código quase exclusivo. Qual preparação melhor favorece uma leitura confiável?
  1. Manter tipos mistos para os códigos e substituir anos por partições de código.
  2. Alinhar os tipos dos códigos e criar uma partição para cada código.
  3. Manter tipos mistos para os códigos e confiar na projeção de colunas para corrigi-los.
  4. Alinhar os tipos dos códigos e manter a partição útil por ano.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Uma tabela existente tem restrições importantes e contém um retrato completo antigo dos dados. Um novo DataFrame é o retrato completo que deve substituí-lo. Qual modo mantém a definição da tabela ao carregar o novo conteúdo?
  1. if_exists="append"
  2. if_exists="delete_rows"
  3. if_exists="replace"
  4. if_exists="fail"
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 4: Relacione escolhas de interpretação aos resultados armazenados10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Uma tabela separada por barras verticais armazena um campo numérico entre aspas "7,680.25". O delimitador é lido corretamente, mas o valor permanece como texto. Qual opção de leitura adicional corresponde ao número?
  1. thousands=","
  2. decimal=","
  3. thousands="."
  4. quotechar="|"
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Um relatório começa com duas linhas de título, seguidas de site,jan,feb. O corpo contém uma linha # note e termina com um total e uma nota sobre a fonte. Qual configuração lê apenas as observações sem tratar notas como registros?
  1. skiprows=3, comment="#", skipfooter=2, engine="python"
  2. skiprows=2, comment="#", skipfooter=1, engine="python"
  3. skiprows=2, comment="#", skipfooter=2, engine="python"
  4. skiprows=2, comment="#", skipfooter=2, engine="c"
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Um CSV documentado como UTF-8 foi lido como Windows-1252, produzindo nomes corrompidos. Essa tabela foi então salva corretamente como UTF-8. O download original ainda existe. Qual recuperação restaura os nomes pretendidos?
  1. Ler novamente a exportação derivada como UTF-8 e salvá-la sem alterações.
  2. Ler novamente o original como Windows-1252 e adicionar uma BOM UTF-8.
  3. Ler novamente a exportação derivada como Latin-1 e substituir bytes inválidos.
  4. Ler novamente o original como UTF-8 e reconstruir a exportação derivada.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Uma pasta de trabalho contém History e Current. Apenas Current deve ser substituída, mantendo History. Qual configuração de gravação é adequada?
  1. Modo de gravação, mecanismo openpyxl e nome de planilha Current.
  2. Modo de acréscimo, mecanismo openpyxl e if_sheet_exists="replace".
  3. Modo de acréscimo, mecanismo openpyxl e if_sheet_exists="overlay".
  4. Modo de gravação, mecanismo XlsxWriter e index=False para Current.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Uma tabela normalizada de peças tem as linhas (visit_id, visit_fee, part_cost): (51, 12, 3), (51, 12, 5) e (52, 7, 4). Qual é o total das taxas de visita mais as peças para essas duas visitas?
  1. 43
  2. 31
  3. 27
  4. 35
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Um script de coleta salvou a página 1 de um resultado de API. A requisição da página 2 recebe HTTP 429 com Retry-After: 45. Qual continuação preserva a coleta e respeita a resposta?
  1. Esperar 45 segundos, tentar novamente a página 2 e seguir pelas páginas restantes.
  2. Esperar 45 segundos, reiniciar na página 1 e acrescentar todas as páginas aos registros salvos.
  3. Requisitar imediatamente a página 3 e tratar a página 2 como resultado vazio.
  4. Salvar o corpo da resposta 429 como página 2 e requisitar a página seguinte.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Por que carregar um pickle não verificado de um colega exige uma decisão de confiança diferente de ler um CSV comum?
  1. Carregar o pickle comprova que o arquivo veio do remetente indicado.
  2. Um tipo de dados preservado torna seguro carregar um pickle não verificado.
  3. Carregar o pickle pode executar código durante o carregamento do objeto.
  4. A compatibilidade de versões de bibliotecas impede a execução de código em um pickle.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Uma tabela tem 2 milhões de linhas, 60 colunas e quatro anos. Uma análise recorrente precisa de duas colunas para um ano. Qual solução de armazenamento e leitura evita colunas e grupos de anos desnecessários?
  1. Parquet particionado por ID de registro, seguido da leitura completa do conjunto.
  2. Um CSV por ano, seguido da leitura de todas as colunas de todos os arquivos.
  3. Um arquivo Parquet por ano, seguido do carregamento de todos antes da filtragem.
  4. Parquet particionado por ano, com uma lista de colunas e um filtro de ano.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Um programa permite que usuários escolham uma tabela e um limite. A consulta usa um marcador para o nome da tabela e insere o limite no SQL por formatação. Qual reformulação permite as escolhas desejadas com segurança?
  1. Escolher a tabela em uma lista fixa e vincular o valor do limite.
  2. Vincular o nome da tabela e o limite como valores comuns.
  3. Formatar as duas entradas após remover espaços dos textos.
  4. Vincular o nome da tabela, mas formatar um limite que pareça numérico.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Um lote diário deve ser acrescentado a uma tabela existente com restrições. Um lote malsucedido não deve deixar inserções parciais, e um lote bem-sucedido deve aumentar a contagem armazenada pelo número de linhas do lote. Qual solução é adequada?
  1. Substituir em uma transação SQLAlchemy e comparar a contagem ao tamanho do lote.
  2. Acrescentar sem transação e comparar o total ao tamanho do lote.
  3. Excluir todas as linhas em uma transação e verificar o aumento em relação ao total antigo.
  4. Acrescentar em uma transação SQLAlchemy e verificar o aumento da contagem.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 5: Resolva vários riscos de carregamento e armazenamento10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Um CSV tem os códigos "0072" e "0073", contagens inteiras com suporte a valores ausentes e as datas "12/01/2026", "26/01/2026". A fonte define datas com dia primeiro. Qual combinação preserva esses significados?
  1. Código como texto, contagem como int32, datas interpretadas com %d/%m/%Y.
  2. Código como inteiro, contagem como Int64, datas interpretadas com %d/%m/%Y.
  3. Código como texto, contagem como Int64, datas interpretadas com %d/%m/%Y.
  4. Código como texto, contagem como Int64, datas interpretadas com %m/%d/%Y.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Uma rotina de carregamento usa on_bad_lines="skip". De 1.000 observações da fonte, 995 são carregadas; duas delas têm campos ausentes no final. O que decorre desses resultados?
  1. Sete observações foram perdidas; cada campo ausente indica um registro ignorado.
  2. Cinco observações foram perdidas; registros curtos carregados ainda precisam ser inspecionados.
  3. Cinco observações foram perdidas; os registros carregados devem estar todos completos.
  4. Duas observações foram perdidas; a diferença na contagem reflete apenas campos vazios.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Um arquivo curto é decodificado sem erro como Latin-1, mas a codificação da fonte é desconhecida. Qual evidência fortaleceria essa escolha?
  1. A ausência de uma exceção de decodificação na leitura em Latin-1.
  2. Um editor de texto abrir o arquivo sem mostrar a codificação.
  3. Um cabeçalho apenas com ASCII parecer correto nesse decodificador.
  4. Documentação de exportação e valores acentuados decodificados corretamente.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Um CSV gzip é processado em blocos. Um colega soma os valores, mas divide pelo número de linhas, incluindo valores ausentes, e mantém todos os blocos em uma lista. Qual par de correções atende a uma tarefa que exige apenas a média com memória limitada?
  1. Contar valores não ausentes e manter apenas somas e contagens.
  2. Contar todas as linhas e manter apenas a média das médias dos blocos.
  3. Contar valores não ausentes e concatenar todos os blocos mantidos.
  4. Contar os blocos e manter suas somas sem contagens de observações.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

O total de uma fórmula em uma planilha exibe 90, mas o último resultado salvo em cache é 74. Um ID de dispositivo de 16 algarismos foi inserido como número. Quais dois limites devem ser tratados antes de confiar na importação?
  1. Resultados de fórmulas em cache precisam ser atualizados; ler como texto restaura o ID completo.
  2. O resultado exibido da fórmula está atualizado; o ID original completo precisa ser armazenado como texto.
  3. Resultados de fórmulas em cache precisam ser atualizados; o ID original completo precisa ser armazenado como texto.
  4. O resultado exibido da fórmula está atualizado; ler como texto restaura o ID completo.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Um objeto envoltório contém três pedidos com 2, 1 e 0 itens. A tabela de itens repete a taxa de entrega de cada pedido. A pessoa analista precisa tanto da contagem de pedidos quanto do total das taxas de entrega. Qual solução evita perder ou repetir pedidos?
  1. Contar linhas de itens e somar cada taxa repetida na tabela de itens.
  2. Manter apenas pedidos da tabela de itens e usar a maior taxa.
  3. Usar a contagem de linhas de itens como contagem de pedidos e dividir as taxas por três.
  4. Manter uma tabela de pedidos para contagens e taxas, vinculada a uma tabela de itens separada.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Um CSV processado tem um cabeçalho duplicado entre os registros, medidas arredondadas e IDs com zeros à esquerda danificados após a releitura. Qual conjunto de alterações trata as três causas?
  1. Acrescentar com cabeçalhos, exportar com precisão completa e ler IDs como texto.
  2. Acrescentar sem cabeçalhos, exportar com precisão completa e ler IDs como texto.
  3. Acrescentar sem cabeçalhos, ampliar o tipo de ponto flutuante na leitura e ler IDs como inteiros.
  4. Acrescentar sem cabeçalhos, exportar valores arredondados e converter IDs para texto depois.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Um colega precisa de um relatório de planilha com planilhas nomeadas para medidas e contagens. Qual formato de saída atende diretamente a esse uso?
  1. Pasta de trabalho Excel
  2. Arquivo JSON Lines
  3. Arquivo Feather
  4. Conjunto de dados Parquet
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma tabela armazenada tem 140 linhas. Um lote de sete linhas contém apenas registros novos e deve manter as linhas e restrições existentes. Após o carregamento, qual modo e qual verificação de contagem são adequados?
  1. Usar replace e verificar se a contagem armazenada é sete.
  2. Usar append e verificar se a contagem armazenada é 147.
  3. Usar append e verificar se a contagem armazenada é sete.
  4. Usar delete_rows e verificar se a contagem armazenada é 147.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Uma tabela com restrições tem 80 linhas. Um acréscimo de 12 linhas dentro de uma transação compatível falha após inserir cinco linhas, e a exceção sai do bloco da transação. Qual contagem deve permanecer e qual seria o resultado de uma nova tentativa bem-sucedida?
  1. 80 após a reversão; 92 após uma nova tentativa bem-sucedida.
  2. 85 após a falha; 97 após uma nova tentativa bem-sucedida.
  3. 80 após a reversão; 80 após uma nova tentativa bem-sucedida.
  4. 92 após a falha; 104 após uma nova tentativa bem-sucedida.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Travou em uma questão sua? Ajuda com Tarefas

Termos-Chave

91 Termos-Chave, cada um com sua definição

A

Acréscimo de linhas
Um acréscimo de linhas adiciona novas linhas a uma tabela existente sem apagar os registros anteriores, por isso repetir um lote pode adicionar registros duplicados.
Uma tabela com 11 linhas tem 15 após quatro inserções bem-sucedidas e pode ter 19 após repetir esse acréscimo.
Agregado parcial
Um agregado parcial é um resultado reduzido de uma parte dos dados que pode ser combinado por uma regra adequada com resultados de outras partes.
As somas dos blocos são adicionadas diretamente, mas uma média geral precisa da soma combinada e da contagem de valores não ausentes.
Armazenamento colunar
O armazenamento colunar mantém juntos os valores de uma coluna, permitindo a leitura de colunas selecionadas e a compressão de valores adjacentes semelhantes.
Uma análise que precisa de dois campos pode evitar a leitura das outras colunas de um conjunto de dados Parquet com muitas colunas.
Arquivo de largura fixa
Um arquivo de largura fixa armazena campos em posições de caracteres especificadas em vez de separá-los com um caractere delimitador.
Use larguras explícitas quando uma exportação de equipamentos reservar quatro caracteres para um código e sete para um nome.
Array JSON
Um array JSON é uma sequência ordenada de valores entre colchetes, convertida em uma lista Python durante a interpretação.
Um array de temperaturas pode misturar observações numéricas com null para uma medida ausente.
ASCII
ASCII define 128 caracteres básicos cujos valores de byte são compartilhados por UTF-8 e várias codificações ocidentais comuns de um byte.
Um cabeçalho apenas em inglês pode parecer correto mesmo quando a codificação usada para nomes acentuados posteriores está errada.

B

Banco de dados relacional
Um banco de dados relacional armazena registros em tabelas com colunas nomeadas e permite que programas recuperem ou alterem dados por operações SQL.
Uma consulta pode retornar apenas as linhas e colunas necessárias antes que o pandas construa uma tabela de análise.
Bloco de dados (chunk)
Um bloco de dados é um grupo limitado de registros fornecido por um leitor iterativo, permitindo que um programa trabalhe com uma parte do arquivo por vez.
Uma entrada de 13 linhas lida em blocos de cinco produz DataFrames de cinco, cinco e três linhas.
Byte
Um byte é uma unidade de dados armazenados com 256 valores possíveis, de 0 a 255, usada como parte da representação de texto.
Quatro caracteres visíveis em um nome podem exigir cinco bytes quando um caractere usa dois bytes em UTF-8.

C

Cabeçalho
Um cabeçalho é uma linha de rótulos de campos que um leitor usa como nomes de colunas em vez de tratar esses rótulos como uma observação.
Para um arquivo sem cabeçalho, forneça nomes de colunas para que a primeira medida permaneça na tabela.
Caminho dos registros
Um caminho dos registros seleciona a lista aninhada cujas entradas se tornam linhas de saída quando o pandas normaliza uma coleção de objetos JSON.
Definir record_path="items" cria uma linha de item para cada elemento da lista de itens de um pedido.
Caractere de substituição
O caractere de substituição, "�", marca conteúdo que um decodificador não conseguiu interpretar quando foi instruído a substituir bytes inválidos.
Um nome carregado como "Ren�" perdeu informações sobre caracteres; mantenha os bytes originais para uma leitura corrigida.
Chave de API
Uma chave de API é uma credencial enviada por um cliente usando o método de autenticação documentado da API para obter acesso autorizado.
Leia uma chave privada de uma variável de ambiente em vez de salvá-la dentro de uma célula de caderno computacional.
Ciclo de gravação e leitura em CSV
Um ciclo de gravação e leitura em CSV grava uma tabela como texto e a lê novamente, exigindo a reconstrução de tipos que CSV não armazena como metadados.
Uma categoria ordenada pode retornar como texto comum mesmo quando todos os rótulos visíveis permanecem inalterados.
Codec de compressão
Um codec de compressão é um algoritmo usado para comprimir e descomprimir dados armazenados, com uma relação entre tamanho do arquivo e custos de processamento.
Snappy é o padrão do pandas para Parquet; outro codec pode produzir arquivos menores com um custo de gravação diferente.
Codificação de caracteres
Uma codificação de caracteres é uma regra para representar caracteres como bytes e interpretar esses bytes como caracteres durante a leitura.
O mesmo nome pode ocupar sequências de bytes diferentes quando salvo em UTF-8 e em Windows-1252.
Código de status HTTP
Um código de status HTTP é um número de resposta que informa o resultado da requisição, com códigos 4xx e 5xx indicando classes de erro.
Verifique se o status indica falha antes de converter uma mensagem de erro JSON em algo que pareça uma tabela de dados.
Coluna categórica
Uma coluna categórica armazena valores por meio de um conjunto definido de rótulos, muitas vezes economizando memória quando muitas linhas repetem poucos rótulos.
Quatro rótulos regionais repetidos em milhares de registros são bons candidatos ao armazenamento categórico.
Colunas com índice hierárquico (MultiIndex)
Colunas com índice hierárquico têm rótulos com vários níveis, que o pandas pode construir a partir de mais de uma linha de cabeçalho.
Uma tabela de vendas pode rotular uma coluna com a medida e o ano, como em ("sales", "2026").
Compressão
Compressão codifica dados em menos bytes armazenados, reduzindo o tamanho do arquivo e exigindo descompressão antes que os valores possam ser usados.
O pandas pode descomprimir um arquivo .csv.gz durante a leitura sem primeiro criar uma cópia descomprimida.
Conexão
Uma conexão é uma interface ativa pela qual um programa envia operações de banco de dados e recebe seus resultados.
Mantenha a conexão aberta até que um resultado de consulta em blocos tenha sido totalmente consumido e depois feche-a.
Conjunto de dados particionado
Um conjunto de dados particionado divide arquivos de tabela entre diretórios por valores de campos selecionados, permitindo que leitores ignorem grupos não relacionados.
Diretórios chamados year=2025 e year=2026 permitem que um filtro de ano se concentre na parte necessária.
Cursor no servidor
Um cursor no servidor permite que uma interface de banco de dados recupere um resultado progressivamente em vez de armazenar temporariamente o resultado inteiro de uma só vez.
A divisão em blocos pelo pandas ainda pode precisar de suporte à leitura em fluxo para evitar que o driver de banco de dados armazene temporariamente o resultado completo.

D

Dados brutos
Dados brutos são a entrada inalterada recebida ou baixada para uma análise, mantida separadamente dos arquivos de saída derivados e limpos.
Mantenha o arquivo de medidas recebido para que uma correção posterior de decodificação ou interpretação possa partir dos bytes originais.
Decodificação
Decodificação converte bytes armazenados em texto segundo uma codificação especificada, determinando quais caracteres aparecem no resultado.
Abrir um arquivo UTF-8 com um decodificador antigo pode produzir acentos corrompidos sem gerar erro.
Delimitação de campos com aspas
A delimitação de campos com aspas envolve um campo de texto em aspas para que delimitadores ou quebras de linha dentro dele sejam tratados como conteúdo, não como estrutura do registro.
O campo "Harbor, West" mantém a vírgula dentro de um único nome de local durante uma importação CSV.
Delimitador
Um delimitador é um caractere ou padrão que marca o limite entre campos, como vírgula, tabulação, barra vertical ou ponto e vírgula.
Um arquivo separado por ponto e vírgula precisa de sep=";" mesmo que sua extensão seja .csv.
Driver de banco de dados
Um driver de banco de dados é a biblioteca que implementa a comunicação entre a interface de banco de dados do Python e um sistema de banco de dados específico.
Uma URL PostgreSQL do SQLAlchemy pode selecionar psycopg, que também precisa estar instalado para a conexão.

E

Erro UnicodeDecodeError
Um UnicodeDecodeError ocorre quando um decodificador encontra uma sequência de bytes que não consegue interpretar segundo a codificação de texto escolhida.
Um caractere acentuado em Windows-1252 pode provocar esse erro quando o arquivo é aberto como UTF-8.
Esquema de dados
Um esquema de dados descreve a estrutura de um conjunto de dados, incluindo nomes e tipos de colunas que leitores compatíveis usam para interpretar valores armazenados.
Um conjunto de dados compartilhado precisa de tipos compatíveis para a coluna de códigos em todos os arquivos para evitar falhas ou alterações na leitura.
Exportação do índice
Uma exportação do índice grava rótulos de linhas de um DataFrame em uma coluna de saída, o que só é útil quando esses rótulos fazem parte dos dados trocados.
Exclua um índice numerado comum para evitar uma nova coluna "Unnamed: 0" após a releitura do CSV.

F

Feather
Feather é um formato binário baseado em Arrow IPC para troca rápida de DataFrames tipados entre ferramentas de análise compatíveis.
Uma etapa local em Python pode salvar uma tabela Feather para uma etapa posterior ou um fluxo de trabalho R compatível.
Formato de data
Um formato de data é um padrão que informa a um analisador como os componentes da data estão dispostos, como dia, mês e ano com quatro algarismos.
O padrão %d/%m/%Y interpreta "09/10/2026" como 9 de outubro em vez de 10 de setembro.
Formato de exibição
Um formato de exibição altera a aparência de um valor armazenado em uma célula, como uma porcentagem ou um código com preenchimento, sem alterar o valor subjacente.
Uma célula exibida como "15%" armazena 0,15, por isso o valor carregado é uma proporção, não o número 15.
Formato de valores separados por vírgulas (CSV)
Um arquivo CSV é um arquivo de texto com registros cujos campos são separados por um delimitador, com aspas protegendo delimitadores dentro dos campos.
Um endereço que contém uma vírgula permanece em um único campo quando está corretamente entre aspas no CSV.

G

Granularidade da linha
A granularidade da linha indica o que uma linha da tabela representa, determinando como rótulos e valores repetidos devem ser interpretados.
Uma linha para cada item de pedido tem uma unidade de contagem diferente de uma linha para cada pedido completo.

H

HDF5
HDF5 é um formato binário hierárquico que pode organizar vários conjuntos de dados em um arquivo, frequentemente usado para grandes volumes de dados científicos.
O pandas exige PyTables para gravar vários conjuntos de dados de análise usando sua interface HDF5.

I

Identificador
Um identificador é um rótulo de um registro ou entidade cujos algarismos podem ter significado sem representar uma quantidade usada em operações aritméticas.
Ler um código de equipamento como "00028" em texto preserva os zeros necessários para relacioná-lo ao mesmo código em uma lista de origem.
Inferência de tipo
Inferência de tipo é a escolha do tipo de uma coluna pelo leitor com base nos valores de entrada, quando o programa não especificou esse tipo.
Um código de equipamento composto apenas por algarismos pode tornar-se um inteiro, a menos que o leitor seja instruído a preservá-lo como texto.
Injeção de SQL
Injeção de SQL ocorre quando um texto inserido altera a estrutura de uma operação SQL em vez de permanecer um valor de dado comum.
Uma entrada que contém aspas e uma condição verdadeira pode ampliar uma consulta construída por formatação de strings.
Intervalo de células mescladas
Um intervalo de células mescladas combina visualmente várias células de planilha enquanto mantém o valor armazenado na célula superior esquerda.
Um rótulo regional mesclado pode deixar entradas vazias nas linhas seguintes quando a tabela é lida no pandas.
Intervalo semiaberto
Um intervalo semiaberto inclui a posição inicial e exclui a posição final, como nos limites de colunas de largura fixa.
O intervalo (2, 7) seleciona cinco posições de caracteres, terminando imediatamente antes da posição 7.

J

JSON
JSON é um formato de texto para objetos, arrays, strings entre aspas duplas, números, booleanos e null, frequentemente usado para trocar registros aninhados.
Uma API JSON pode retornar uma lista de objetos de estações, cada um contendo um nome e uma série de temperaturas.
JSON Lines
JSON Lines é uma estrutura de texto com um objeto JSON completo em cada linha, sem um array externo que envolva todos os registros.
Grandes exportações de logs podem ser lidas em blocos quando o pandas é informado de que a entrada usa JSON Lines.

L

Latin-1
Latin-1 é uma codificação de um byte que mapeia cada valor de byte para um caractere, incluindo caracteres de controle em parte de sua faixa.
Uma leitura em Latin-1 pode terminar sem erros e ainda transformar um símbolo pretendido no caractere errado.
Limite de requisições por período
Um limite de requisições por período restringe o número de requisições que um cliente pode enviar em um período, frequentemente sinalizando excesso com HTTP 429.
Aguarde conforme indicado por Retry-After antes de tentar novamente uma requisição rejeitada por exceder o limite permitido.
Linha malformada
Uma linha malformada é um registro que o analisador não consegue ajustar à estrutura esperada, como um registro com mais campos que os descritos pelo cabeçalho.
Um delimitador sem aspas dentro de um nome pode fazer uma observação válida parecer conter um campo adicional.

M

Marca de ordem de bytes (BOM)
Uma marca de ordem de bytes, ou BOM, é um marcador inicial usado por alguns arquivos de texto para identificar informações de codificação, como a ordem dos bytes em UTF-16.
Usar utf-8-sig na leitura de texto em Python remove uma BOM UTF-8 inicial do primeiro cabeçalho.
Marcador de parâmetro (placeholder)
Um marcador de parâmetro indica a posição de um valor vinculado em SQL, usando a sintaxe exigida pelo driver ou pela interface de consulta.
SQLite aceita ? para valores posicionais e :name para valores fornecidos em um dicionário.
Marcador de valor ausente
Um marcador de valor ausente é um valor da fonte que representa uma observação ausente e é convertido em valor ausente durante a leitura.
Se "-" significa ausência de pontuação, declará-lo como ausente impede que ele mantenha a coluna de pontuação como texto.
Mecanismo de acesso do SQLAlchemy (Engine)
Um mecanismo de acesso do SQLAlchemy configura o acesso ao banco de dados por meio de um driver e gerencia um conjunto de conexões obtidas durante as operações.
Um contexto de conexão devolve a conexão ao conjunto; liberar o mecanismo libera os recursos desse conjunto.
Mecanismo de análise sintática
Um mecanismo de análise sintática é a implementação que lê uma estrutura de texto e a transforma em valores, com velocidade e conjunto de opções aceitas próprios.
Um relatório que precisa de skipfooter usa o mecanismo Python porque o mecanismo C não oferece suporte a essa opção.
Mecanismo de leitura e escrita de arquivos Excel
Um mecanismo de leitura e escrita de arquivos Excel é uma biblioteca que o pandas usa para ler ou gravar um formato de planilha, com suporte que depende do tipo de arquivo.
A ausência de uma instalação do openpyxl pode impedir a leitura de um arquivo .xlsx mesmo quando o próprio pandas está instalado.
Média ponderada
Uma média ponderada atribui a cada média parcial uma influência proporcional à contagem de observações válidas ao combinar grupos de dados desiguais.
Um bloco de um registro não deve ter o mesmo peso que um bloco de cem registros no cálculo da média geral.
Metadados do objeto pai
Os metadados do objeto pai são campos copiados de um objeto JSON que contém uma lista de registros aninhados para cada linha criada a partir dessa lista.
Um ID de pedido copiado para cada linha de item permite vincular os itens ao pedido original.
Modo de acréscimo
O modo de acréscimo abre uma pasta de trabalho existente para atualizações, permitindo adicionar planilhas ou tratá-las segundo uma política de conflito de nomes.
Um objeto de gravação openpyxl em modo de acréscimo pode substituir uma planilha existente em uma pasta de trabalho mantendo as demais.

N

Normalização de dados JSON aninhados
A normalização de dados JSON aninhados expande campos de objetos selecionados e registros de listas em uma tabela com granularidade de linha escolhida explicitamente.
Normalizar objetos de clientes que contêm pedidos pode criar colunas com nomes separados por pontos sem expandir a lista de itens de cada pedido.

O

Objeto envoltório da resposta da API
Um objeto envoltório da resposta da API contém dados de registros junto com informações como a contagem de resultados e a localização da próxima página.
Transforme em tabela a lista de resultados do objeto envoltório, mantendo o valor da próxima página para outra requisição.
Objeto ExcelWriter
Um objeto ExcelWriter gerencia uma sessão de gravação de pasta de trabalho para que vários DataFrames possam ser colocados em planilhas diferentes antes de o arquivo ser fechado.
Gravar duas tabelas por meio de um único objeto de gravação mantém as duas planilhas na mesma pasta de trabalho de relatório concluída.
Objeto JSON
Um objeto JSON é uma coleção de valores identificados por nomes em strings e delimitada por chaves, que o analisador JSON do Python converte em um dicionário.
Um objeto pode associar "active" a true e "name" ao rótulo de texto de uma estação.
Orientação JSON
Uma orientação JSON especifica como linhas, colunas, rótulos e valores de uma tabela são organizados em uma representação JSON.
A orientação records grava cada observação como um objeto, enquanto split mantém rótulos e dados separadamente.

P

Paginação
Paginação divide um resultado de API em páginas requisitadas separadamente, com um mecanismo documentado para alcançar os registros restantes.
Uma coleção de 260 registros retornada em páginas de 100 precisa de três requisições para recuperar todos os registros.
Parâmetro vinculado
Um parâmetro vinculado fornece um valor de dado separadamente da sintaxe SQL, impedindo que caracteres desse valor redefinam a consulta.
Um nome de região que contém um apóstrofo permanece um único valor de comparação quando passado como parâmetro.
Parquet
Parquet é um formato de arquivo colunar aberto e tipado, com compressão e amplo suporte para leitura e armazenamento de tabelas de análise.
Um identificador e uma contagem com suporte a valores ausentes podem manter seus tipos em um ciclo compatível de gravação e leitura Parquet no pandas.
Pasta de trabalho
Uma pasta de trabalho é um arquivo de planilha que contém uma ou mais planilhas, além de valores, tipos, fórmulas e detalhes de apresentação das células.
Uma única pasta de trabalho .xlsx pode conter planilhas separadas para observações, totais e um resumo do relatório.
Pickle
Um pickle é uma representação serializada de objeto Python que pode executar código durante o carregamento e depende de bibliotecas compatíveis.
Use um pickle pessoal confiável para um objeto temporário e escolha um formato de tabela portável para troca de dados.
Planilha
Uma planilha é uma grade nomeada de células dentro de uma pasta de trabalho, selecionada no pandas pelo nome ou pela posição contada a partir de zero.
Usar sheet_name=1 lê a segunda planilha, que pode ser diferente da planilha aberta na tela.
Ponto de acesso (endpoint)
Um ponto de acesso é uma URL documentada na qual uma API aceita uma requisição HTTP para um recurso ou operação específica.
Um ponto de acesso pode aceitar um parâmetro de cidade e retornar registros de medidas correspondentes em uma resposta JSON.
Precisão de saída
Precisão de saída é o número de algarismos mantidos nos valores gravados, que pode ser reduzido permanentemente pela formatação numérica de exportação.
Um relatório arredondado durante a gravação precisa de um arquivo de análise separado com precisão completa se os algarismos descartados forem importantes.
Projeção
Projeção seleciona as colunas a ler de uma tabela armazenada, permitindo que um leitor colunar deixe no disco as colunas não relacionadas.
Passe uma lista de colunas a read_parquet quando uma análise precisar apenas de região e valor.

R

Registro
Um registro é uma entrada completa em um arquivo delimitado, composta de campos; conteúdo entre aspas pode fazê-la ocupar mais de uma linha física.
Um comentário com uma quebra de linha incorporada pode ocupar duas linhas físicas e ainda pertencer a um único registro.
Representação de valor ausente
Uma representação de valor ausente é o texto gravado para um valor ausente, como um campo vazio ou um marcador de exportação escolhido.
Gravar chuva ausente como "NA" mantém esse valor distinto de um zero registrado quando o destinatário o lê corretamente.
Resultado de fórmula armazenado em cache
Um resultado de fórmula armazenado em cache é o valor guardado junto a uma fórmula de planilha para que um leitor o use sem calculá-la novamente.
Uma pasta de trabalho gerada por script pode mostrar dados de fórmula ausentes porque nenhum resultado atual foi salvo.
Reversão de transação (rollback)
Uma reversão de transação cancela alterações não confirmadas em uma transação quando ela não pode ser concluída com sucesso, restaurando o estado confirmado anterior.
Se uma carga de inserção compatível falhar dentro de uma transação do mecanismo, as inserções anteriores dessa transação podem ser revertidas.
Rodapé
Um rodapé é material de relatório no final, fora da tabela de observações, como totais, notas sobre a fonte ou explicações da exportação.
Ignore as duas linhas finais do relatório quando contiverem um total e uma nota sobre a fonte em vez de observações.

S

Separador de milhares
Um separador de milhares agrupa algarismos dentro de um campo numérico e deve ser distinguido do separador decimal e do delimitador de campos.
Um valor agrupado escrito como "4.200,50" usa ponto para milhares e vírgula para a parte fracionária.
Separador decimal
Um separador decimal separa as partes inteira e fracionária de um número; o pandas pode interpretar um separador escolhido durante a análise do texto.
Com vírgula decimal, "8,75" representa o mesmo valor que 8.75 na saída do Python.
Serialização
Serialização converte objetos em memória em uma representação para armazenamento ou troca, como ao gravar valores Python em texto JSON.
Use json.dump para serializar registros em um arquivo UTF-8 aberto em vez de gravar a representação repr de um dicionário Python.
Sobreposição de dados em planilha
Uma sobreposição de dados em planilha grava valores em uma planilha existente sem limpar todas as células antigas fora da área recém-gravada.
Sobrepor uma tabela menor pode deixar linhas anteriores abaixo dela, por isso inspecione o conteúdo restante da planilha.
SQLite
SQLite é um mecanismo de banco de dados que funciona sem servidor separado e geralmente armazena um banco de dados inteiro em um único arquivo local.
Um novo arquivo pode ser criado ao conectar-se a um caminho de banco de dados digitado incorretamente, deixando ausentes as tabelas esperadas.
Substituição de tabela
Uma substituição de tabela remove uma tabela de banco de dados existente e a cria novamente, removendo sua definição anterior e seus registros.
Substituir uma tabela compartilhada pode remover chaves e índices que faziam parte de sua estrutura original.

T

Tempo limite da requisição
Um tempo limite da requisição limita a espera pela conexão ou pela leitura durante uma requisição HTTP, sem impor um prazo para o download inteiro.
Defina um tempo limite para que uma conexão sem resposta não mantenha um script de coleta de API esperando indefinidamente.
Texto corrompido por codificação incorreta (mojibake)
Texto corrompido por codificação incorreta é texto danificado pela interpretação de bytes codificados segundo a regra errada, mesmo quando o decodificador não informa erro.
Um nome que contém "Ã" no lugar de um acento sugere verificar se bytes UTF-8 foram lidos como Windows-1252.
Tipo inteiro com suporte a valores ausentes
Um tipo inteiro com suporte a valores ausentes é um tipo inteiro do pandas que pode conter entradas ausentes além de números inteiros, como o tipo de dados Int64.
Uma coluna de contagem de visitas pode manter 3 e 8 como inteiros e representar qualquer observação vazia como <NA>.
Transação
Uma transação agrupa alterações no banco de dados para confirmação em caso de sucesso ou reversão em caso de falha, dentro das operações aceitas pelo banco.
Uma transação SQLAlchemy pode impedir que um acréscimo deixe armazenados apenas alguns dos registros pretendidos.

U

Uso de memória com contabilização do conteúdo dos objetos
O uso de memória com contabilização do conteúdo dos objetos conta a memória dos valores armazenados, incluindo o conteúdo de objetos de texto, além do tamanho superficial dos arrays que os contêm.
Use um relatório de memória que contabilize o conteúdo dos objetos para comparar nomes de regiões repetidos armazenados como texto e como categorias.
UTF-8
UTF-8 representa caracteres Unicode usando um a quatro bytes, mantendo caracteres ASCII em um byte e oferecendo suporte a todos os caracteres Unicode.
A letra "é" usa dois bytes em UTF-8, por isso uma contagem de caracteres não precisa coincidir com a contagem de bytes do arquivo.
UTF-16
UTF-16 codifica Unicode usando unidades de dois bytes, com uma ordem de bytes que deve ser conhecida ou identificada por uma marca de ordem de bytes inicial.
Leia uma exportação little-endian sem BOM com encoding="utf-16-le" quando essa for a estrutura documentada.

V

Valor sentinela
Um valor sentinela é um código designado para um significado especial, como desconhecido, que poderia parecer uma medida comum.
Uma pontuação 999 documentada como desconhecida deve ser declarada ausente antes de calcular uma média significativa.
Verificação da gravação
A verificação da gravação confere os resultados armazenados no banco de dados em relação à alteração pretendida, como o aumento esperado na contagem de linhas após um acréscimo.
Após adicionar seis linhas a uma tabela de 20, consulte a contagem e verifique se o total é o esperado: 26.

W

Windows-1252
Windows-1252 é uma codificação antiga de um byte com letras ocidentais e símbolos adicionais que difere de Latin-1 em parte de sua faixa.
O byte do símbolo de euro em Windows-1252 torna-se um caractere de controle quando interpretado como Latin-1.

Sobre esta aula

Por StudeliRelatar um erro

Crie seus próprios Materiais de Estudo

Transforme suas anotações, slides e documentos em Guias de Estudo, Questões de Prática, Flashcards e mais 6 ferramentas.

Começar