Skip to content

Repository files navigation

TACO — Tabela Brasileira de Composição de Alimentos

CI Licença: MIT DOI

Dados normalizados e API REST da Tabela Brasileira de Composição de Alimentos (TACO, 4ª edição, NEPA/UNICAMP), acompanhados de fontes complementares (Guia Alimentar para a População Brasileira e Tabela de Medidas Referidas da POF/IBGE).

O repositório oferece:

  • Pipelines reproduzíveis (scripts/process_taco.py e scripts/process_pof.py) que convertem as planilhas originais da TACO e da POF em CSVs limpos e normalizados;
  • CSVs prontos para uso em data/processed/: composição centesimal, ácidos graxos, aminoácidos e medidas caseiras em gramas;
  • API REST (FastAPI) para consulta, comparação e soma de nutrientes.

Estrutura do projeto

taco/
├── api/                  # API REST (FastAPI)
├── data/
│   ├── raw/              # Fontes originais, imutáveis (TACO .xls, POF .xls)
│   └── processed/         # CSVs canônicos gerados pelos pipelines (taco/, pof/)
├── docs/                 # Dicionário de dados
├── references/           # Documentos originais (PDFs) e guia de normalização
├── scripts/              # Pipelines de processamento (TACO e POF)
└── tests/                # Testes da API

Arquitetura

flowchart LR
  subgraph Originais[Fontes originais - imutáveis]
    direction TB
    TACO_XLS["TACO .xls<br/>3 abas nutricionais"]
    POF_XLS["POF .xls<br/>medidas caseiras"]
    REFERENCIAS["references/<br/>fontes e decisões de normalização"]
  end

  subgraph Pipelines[Transformação reproduzível]
    direction TB
    PTACO["scripts/process_taco.py<br/>pandas + xlrd"]
    PPOF["scripts/process_pof.py<br/>pandas + xlrd"]
    REGRAS["regras de domínio<br/>categorias, Tr e NaN"]
  end

  subgraph Canonicos[Dados canônicos versionados]
    direction TB
    COMPOSICAO["taco_composicao.csv<br/>composição, minerais e vitaminas"]
    GORDURAS["taco_acidos_graxos.csv<br/>perfil de ácidos graxos"]
    AMINO["taco_aminoacidos.csv<br/>perfil de aminoácidos"]
    MEDIDAS["pof_medidas_caseiras.csv<br/>medidas em gramas"]
  end

  subgraph Aplicacao[Camada de aplicação]
    direction TB
    MAIN["api/main.py<br/>FastAPI + contrato público"]
    DATAFRAMES["DataFrames em memória<br/>carregados no import"]
    ROTAS["rotas REST<br/>busca, composição, comparação e soma"]
    MAIN --> DATAFRAMES --> ROTAS
  end

  subgraph Publicacoes[Publicações e consumidores]
    direction TB
    ESTATICA["scripts/build_static_api.py<br/>JSON estático"]
    CDN["GitHub Pages / CDN<br/>sem servidor"]
    SQLITE["scripts/build_sqlite.py<br/>taco.sqlite não versionado"]
    CLIENTE_API["cliente HTTP<br/>Swagger ou aplicação"]
    CLIENTE_CDN["cliente HTTP<br/>curl ou aplicação"]
    CLIENTE_SQL["cliente SQL<br/>SQLite"]
  end

  TACO_XLS --> PTACO
  POF_XLS --> PPOF
  REFERENCIAS -.-> REGRAS
  REGRAS -.-> PTACO
  REGRAS -.-> PPOF
  PTACO --> COMPOSICAO
  PTACO --> GORDURAS
  PTACO --> AMINO
  PPOF --> MEDIDAS
  COMPOSICAO --> MAIN
  GORDURAS --> MAIN
  AMINO --> MAIN
  MEDIDAS --> MAIN
  ROTAS --> CLIENTE_API
  MAIN --> ESTATICA --> CDN --> CLIENTE_CDN
  COMPOSICAO --> SQLITE
  GORDURAS --> SQLITE
  AMINO --> SQLITE
  MEDIDAS --> SQLITE --> CLIENTE_SQL
Loading

Fluxos principais

flowchart TD
  subgraph TACO[Pipeline TACO]
    direction TB
    T1["ler as 3 abas da planilha"]
    T2["processar composição primeiro"]
    T3["forward-fill dos separadores<br/>para obter categorias"]
    T4["filtrar linhas de dados<br/>e normalizar nomes"]
    T5["converter Tr para 1e-5<br/>e preservar ausentes como NaN"]
    T6["gerar composição, ácidos graxos<br/>e aminoácidos"]
    T1 --> T2 --> T3 --> T4 --> T5 --> T6
    T2 -.->|join da categoria| T6
  end

  subgraph POF[Pipeline POF independente]
    direction TB
    P1["ler tabelamedidas_bd.xls"]
    P2["normalizar medidas caseiras"]
    P3["converter quantidades para gramas"]
    P4["gerar pof_medidas_caseiras.csv"]
    P1 --> P2 --> P3 --> P4
  end

  T6 --> CSV_TACO["CSVs TACO<br/>versionados e reproduzíveis"]
  P4 --> CSV_POF["CSV POF<br/>versionado e reproduzível"]
  CSV_TACO --> TESTES["pytest<br/>confere a saída byte a byte"]
  CSV_POF --> TESTES
  TESTES --> CI["CI<br/>ruff check + pytest"]

  CSV_TACO --> LOAD["api.main<br/>carrega DataFrames no import"]
  CSV_POF --> LOAD
  LOAD --> CONTRATO["mapeia colunas pt-BR<br/>para campos públicos em inglês"]
  CONTRATO --> REST["API REST dinâmica"]
  CONTRATO --> BUILD_JSON["build_static_api.py<br/>reutiliza funções da API"]
  BUILD_JSON --> JSON["JSON estático<br/>GitHub Pages"]

  CSV_TACO --> BUILD_SQL["build_sqlite.py"]
  CSV_POF --> BUILD_SQL
  BUILD_SQL --> SQLITE["taco.sqlite<br/>4 tabelas + índices + metadados"]
Loading

Ciclo de uma consulta

sequenceDiagram
  autonumber
  participant C as Cliente
  participant F as FastAPI
  participant D as DataFrames
  participant V as Validação e normalização
  participant R as Resposta JSON

  Note over F,D: No startup/import, api.main lê os CSVs processados
  C->>F: GET /foods?search=arroz&limit=3
  F->>D: filtra alimentos e pagina resultados
  D->>V: normaliza busca sem acentos
  V-->>D: critérios normalizados
  D-->>F: registros encontrados
  F->>R: traduz colunas para o contrato público
  R-->>C: 200 OK + lista de alimentos

  C->>F: GET /foods/{id}
  F->>D: consulta composição por id
  D-->>F: composição, categoria e preparo
  F->>R: arredonda valores em 5 casas decimais
  R-->>C: 200 OK + composição completa

  C->>F: POST /foods/sum
  F->>D: carrega itens e gramas
  D->>D: pondera cada item por grams / 100
  D-->>F: totais e missing_values
  F-->>C: 200 OK + nutrientes somados
Loading

Início rápido

Requer Python 3.10+.

git clone https://github.com/brolesi/taco.git
cd taco

python -m venv .venv
# Windows: .venv\Scripts\activate  |  Linux/macOS: source .venv/bin/activate
pip install -r requirements.txt

Consultar sem instalar nada

Toda a TACO também é publicada como JSON estático em https://brolesi.github.io/taco/ — mesmo conteúdo da API, servido por CDN, sem servidor, sem chave e sem limite de requisições:

curl https://brolesi.github.io/taco/foods/561.json
curl https://brolesi.github.io/taco/coverage.json

Subir a API

uvicorn api.main:app --reload

No Windows, o atalho run.bat faz o mesmo. A documentação interativa (Swagger) fica em http://127.0.0.1:8000/docs.

Regenerar os CSVs processados

Os CSVs já estão versionados; execute os pipelines apenas se quiser reproduzi-los a partir das planilhas originais. A suíte de testes confere que a saída bate byte a byte com os arquivos commitados:

python scripts/process_taco.py
python scripts/process_pof.py

API

Todos os valores nutricionais referem-se a 100 g de parte comestível. Os nomes de campo da API estão mapeados no dicionário de dados.

Método Rota Descrição
GET / Metadados da API
GET /health Verificação de saúde
GET /coverage Quantos alimentos têm dado para cada nutriente
GET /categories Categorias e contagem de alimentos
GET /categories/{nome} Alimentos de uma categoria
GET /preparations Formas de preparo e contagem de alimentos
GET /measures?search=&measure= Peso em gramas de medidas caseiras (POF)
GET /measures/types Tipos de medida caseira e sua frequência
GET /foods?search=&base_name=&preparation=&skip=&limit= Lista/busca paginada de alimentos (busca ignora acentos)
GET /foods/{id} Composição completa de um alimento
GET /foods/{id}/variants O mesmo alimento em outras formas de preparo
GET /foods/{id}/fatty-acids Perfil de ácidos graxos
GET /foods/{id}/amino-acids Perfil de aminoácidos
POST /foods/compare Compara a composição de 2+ alimentos
POST /foods/sum Soma nutrientes ponderados por gramas (missing_values lista nutrientes sem dado)

Exemplo:

curl "http://127.0.0.1:8000/foods?search=arroz&limit=3"
curl "http://127.0.0.1:8000/foods?base_name=feijao&preparation=cozido"
curl "http://127.0.0.1:8000/measures?search=arroz&measure=colher%20de%20sopa"
curl -X POST "http://127.0.0.1:8000/foods/sum" \
  -H "Content-Type: application/json" \
  -d '{"items": [{"id": 1, "grams": 150}, {"id": 2, "grams": 80}]}'

Dados

Arquivo Conteúdo Registros
data/processed/taco/taco_composicao.csv Composição centesimal, minerais e vitaminas 597
data/processed/taco/taco_acidos_graxos.csv Perfil de ácidos graxos 423
data/processed/taco/taco_aminoacidos.csv Perfil de aminoácidos 26
data/processed/pof/pof_medidas_caseiras.csv Medidas caseiras em gramas (POF/IBGE) 11.801

Cada release traz também um taco.sqlite anexado, com as quatro tabelas em um arquivo só — para consultar em SQL sem instalar Python nem subir a API:

SELECT descricao, ferro_mg FROM taco_composicao
WHERE preparo = 'cozido' ORDER BY ferro_mg DESC LIMIT 5;

Detalhes de colunas, unidades e valores especiais (Tr, NA) no dicionário de dados. A cobertura por nutriente diz o que a TACO deixou de medir. As decisões de normalização estão documentadas em references/guia_normalizacao_taco.md.

As medidas caseiras da POF vivem em uma tabela independente: o código de alimento do IBGE não corresponde ao id da TACO, e o repositório não inventa essa ponte — veja a nota no dicionário de dados.

Desenvolvimento

pip install -r requirements-dev.txt
ruff check .   # lint
pytest         # testes

O CI (GitHub Actions) executa lint e testes em cada push/PR para main. Veja CONTRIBUTING.md para o fluxo completo e CHANGELOG.md para o histórico de mudanças.

Fontes de dados

TACO — Tabela Brasileira de Composição de Alimentos

Banco de dados desenvolvido pelo Núcleo de Estudos e Pesquisas em Alimentação (NEPA) da UNICAMP, com informações sobre a composição nutricional de centenas de alimentos consumidos no Brasil, amostrados em distintas regiões do país. É amplamente utilizada por nutricionistas, pesquisadores, profissionais da saúde e pela indústria alimentícia.

Guia Alimentar para a População Brasileira

Documento oficial do Ministério da Saúde (2ª edição, 2014) que orienta práticas alimentares saudáveis, classificando os alimentos em quatro categorias segundo o grau de processamento: in natura ou minimamente processados, ingredientes culinários, processados e ultraprocessados.

POF — Pesquisa de Orçamentos Familiares (IBGE)

Pesquisa domiciliar do IBGE sobre estruturas de consumo, gastos, rendimentos e condições de vida das famílias brasileiras. Este repositório inclui a Tabela de Medidas Referidas (POF 2008–2009), que associa medidas caseiras ("colher de sopa", "copo", "fatia") a quantidades em gramas ou mililitros.

Como citar

Cada release recebe um DOI do Zenodo. O DOI abaixo é o conceitual: ele resolve sempre para a versão mais recente. Para citar uma versão específica, use o DOI dela na página do Zenodo. Os metadados também estão em CITATION.cff (botão "Cite this repository" no GitHub).

@misc{brolesi2026taco,
  author       = {Brolesi, F. F.},
  title        = {{TACO} - Tabela Brasileira de Composição de Alimentos: Repositório para acesso facilitado aos dados da {TACO} ({NEPA/UNICAMP}) e {POF} ({IBGE})},
  year         = {2026},
  publisher    = {Zenodo},
  doi          = {10.5281/zenodo.22145839},
  url          = {https://doi.org/10.5281/zenodo.22145839}
}

Importante: este repositório reorganiza dados públicos. Para trabalhos acadêmicos, cite também as fontes primárias:

  • NEPA/UNICAMP. Tabela Brasileira de Composição de Alimentos (TACO). 4ª ed. Campinas, 2011.
  • IBGE. Pesquisa de Orçamentos Familiares 2008-2009: Tabela de Medidas Referidas para os Alimentos Consumidos no Brasil. Rio de Janeiro, 2011.
  • BRASIL. Ministério da Saúde. Guia Alimentar para a População Brasileira. 2ª ed. Brasília, 2014.

Licença

O código deste repositório está licenciado sob a licença MIT. Os dados pertencem às respectivas fontes (NEPA/UNICAMP, IBGE e Ministério da Saúde) e são redistribuídos aqui por serem de acesso público; consulte as fontes primárias para os termos de uso originais.

About

Tabela Nutricional de Composição de Alimentos no Brasil

Topics

Resources

Contributing

Security policy

Stars

25 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages