# 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

```sql
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:

```sql
SELECT classe_nome, COUNT(*) AS processos
FROM processos
GROUP BY classe_nome
ORDER BY processos DESC
LIMIT 10;
```

Série anual de ajuizamentos:

```sql
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:

```sql
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:

```sql
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:

```sql
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:

```bash
sqlite3 tjsp-aula.db
```

Python:

```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:

```python
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`.
