TJSP DataJud: recorte anonimizado para aula de jurimetria
Base de metadados processuais do Tribunal de Justiça de São Paulo, extraída do DataJud (CNJ). Serve para estudar distribuição, classes, assuntos, órgãos julgadores e movimentação processual.
Dois arquivos:
| Arquivo | Linhas | Tamanho | Uso |
|---|---|---|---|
tjsp-aula.db |
50.000 | cerca de 520 MB | exercícios em aula, cabe num notebook |
tjsp-anon.db |
343.273 | cerca de 3,6 GB | pesquisa completa |
Os dois têm o mesmo schema e o mesmo conteúdo por linha, mudando só o recorte.
Aviso sobre os números de processo
Os números de processo são fictícios, gerados para preservar o formato e evitar qualquer ligação com o processo real. O mesmo processo sempre recebe o mesmo número fictício, então as séries continuam consistentes.
O número fictício mantém 20 dígitos e o formato CNJ
NNNNNNN-DD.AAAA.J.TR.OOOO. A sequência de 7 dígitos vem de um hash com sal. O
DV, o ano, o segmento, o tribunal e a origem são os do original, para não
distorcer cortes por ano e por vara. O DV original foi preservado porque os
registros antigos do TJSP não seguem o módulo 97 do CNJ.
Não use o número para consultar o processo no site do tribunal. Ele não existe.
O que não está na base
Este recorte não tem nome de parte, CPF, CNPJ, OAB nem advogado. O DataJud publica apenas metadados: classe, assunto, órgão julgador e movimentos. Também não há texto de decisão nem PDF.
Schema
CREATE TABLE processos (
numero_processo TEXT NOT NULL, -- número fictício, 20 dígitos
tribunal TEXT NOT NULL, -- sempre TJSP
classe_codigo INTEGER, -- código CNJ da classe
classe_nome TEXT, -- nome da classe
grau TEXT, -- 1º grau, 2º grau, etc.
data_ajuizamento TEXT, -- ISO 8601
ultima_atualizacao TEXT, -- ISO 8601
orgao_nome TEXT, -- vara ou órgão julgador
raw_json TEXT NOT NULL -- documento original do DataJud
);
O raw_json traz o documento completo: classe, assuntos, orgaoJulgador,
movimentos (com complementosTabelados), nivelSigilo, sistema e formato.
Consultas de exemplo
Distribuição por classe, as dez maiores:
SELECT classe_nome, COUNT(*) AS processos
FROM processos
GROUP BY classe_nome
ORDER BY processos DESC
LIMIT 10;
Série anual de ajuizamentos:
SELECT substr(data_ajuizamento, 1, 4) AS ano, COUNT(*) AS processos
FROM processos
WHERE data_ajuizamento <> ''
GROUP BY ano
ORDER BY ano;
Assuntos mais frequentes, lendo o JSON:
SELECT json_extract(assunto.value, '$.nome') AS assunto, COUNT(*) AS total
FROM processos, json_each(processos.raw_json, '$.assuntos') AS assunto
GROUP BY assunto
ORDER BY total DESC
LIMIT 15;
Tempo até o primeiro movimento de sentença:
SELECT COUNT(*) AS processos_com_sentenca
FROM processos
WHERE EXISTS (
SELECT 1 FROM json_each(processos.raw_json, '$.movimentos') AS m
WHERE json_extract(m.value, '$.nome') LIKE '%Sentença%'
);
Movimentos mais comuns:
SELECT json_extract(m.value, '$.nome') AS movimento, COUNT(*) AS total
FROM processos, json_each(processos.raw_json, '$.movimentos') AS m
GROUP BY movimento
ORDER BY total DESC
LIMIT 20;
Como abrir
SQLite puro:
sqlite3 tjsp-aula.db
Python:
import sqlite3
con = sqlite3.connect("tjsp-aula.db")
for linha in con.execute("SELECT classe_nome, COUNT(*) FROM processos GROUP BY 1 ORDER BY 2 DESC LIMIT 5"):
print(linha)
DuckDB, útil para varrer o JSON:
import duckdb
duckdb.sql("SELECT COUNT(*) FROM sqlite_scan('tjsp-aula.db', 'processos')")
Origem e método
Fonte: API pública do DataJud, api-publica.datajud.cnj.jus.br, índice do TJSP.
Coleta por shards, com cursor persistido em checkpoint. O recorte foi gerado
pelo script anonimiza_tjsp.py.
Cada linha anonimizada foi conferida: nenhum dos 326.545 números originais
distintos aparece na base publicada, nem na coluna, nem dentro do raw_json.