Skip to content

Dos paneles contaban menos de lo que hay - #1012

Merged
github-actions[bot] merged 1 commit into
developfrom
fix/dos-paneles-cuentan-menos-de-lo-que-hay
Oct 13, 2026
Merged

github-actions[bot] merged 1 commit into
developfrom
fix/dos-paneles-cuentan-menos-de-lo-que-hay

Conversation

@frapercan

Copy link
Copy Markdown
Owner

Los dos salen en la misma captura de las estadisticas publicas y los dos reportan
menos de lo que el registro sostiene.

1. El top 20 de organismos partia cada taxon en dos

Agrupaba por (organism, taxonomy_id), y las dos rutas de carga escriben el
nombre distinto: la de Swiss-Prot pone Homo sapiens y la del TSV
Homo sapiens (Human).

Medido sobre el corpus vivo:

taxones con mas de un nombre 726
de los 6 primeros del ranking, cuantos partidos 6
taxon 9606, real 41.823 canonicas
taxon 9606, como salia 21.387 y 20.436

Asi que no es que una barra estuviera mal: el orden estaba mal de arriba
abajo, porque comparaba mitades contra enteros.

Ahora agrupa por taxonomy_id. El nombre se elige con min() para que sea
determinista y no el que el plan emita; el taxon es la identidad y el nombre una
etiqueta. Se excluyen las filas sin taxon, que son las 28.868 entradas borradas
de UniProtKB: no llevan ni taxon ni organismo, el filtro de organism ya las
quitaba, y conviene decirlo tambien de la clave nueva para que no colapsen en una
barra sin nombre.

2. La cobertura por PLM media la espina y no el corpus

Decia 576.450 al 100,0%. Es aritmetica honesta sobre la poblacion
equivocada:

proteinas en el corpus 792.535
canonicas 746.014
canonicas con embedding 746.014
lo que decia la tarjeta 576.450

Todas las canonicas estan embebidas, asi que la tarjeta escondia 169.564 y
afirmaba algo mas debil de lo que los datos sostienen.

El reviewed=True en los dos lados lo puse yo en #1002, para cortar un 121,5%
medido. Pero la causa de aquello era un numerador desalineado, no la espina:
alinear los dos lados en is_canonical a secas arregla el porcentaje sin encoger
lo que se reporta. Canonicas y no la tabla entera porque una isoforma comparte
secuencia con su padre y contaria como cobertura separada de lo mismo.

De paso, y en la direccion contraria a la trampa habitual: 684.048 filas de
embedding cubren 792.535 proteinas
, porque las accesiones que comparten
secuencia comparten su embedding.

El test de la cobertura era mio y estaba mal de dos formas

Afirmaba que .filter(Protein.reviewed.is_(True)) aparecia dos veces en el
texto fuente
. Habia que editarlo cada vez que cambiara la poblacion, y no decia
nada sobre lo unico que importa, que es que los dos lados coincidan.

Ahora extrae el conjunto de columnas que filtra cada lado y los compara, mas un
segundo test que fija cual es la poblacion. Un cambio de poblacion futuro rompe
el segundo y deja el primero en pie, que es como deberia haber estado.

Comprobado

Seis tests nuevos y 28 en el fichero, todos en verde. Cuatro mutaciones
verificadas una a una: volver a agrupar por nombre, el nombre sin agregar, sin
excluir el taxon nulo, y volver a estrechar a Swiss-Prot.

ruff, mypy y el presupuesto de smells en verde.

Lo que NO era un fallo

En la misma captura, el panel "GO annotations: source x version x aspect x
evidence" sale vacio. Lo comprobe por la misma ruta que usa el navegador: responde
200 en 18 ms con 35 KB. Era el esqueleto del useLazyLoad cazado en vuelo al
hacer scroll, no un fallo, asi que no toco nada ahi.

1. EL TOP 20 DE ORGANISMOS PARTIA CADA TAXON EN DOS. Agrupaba por
(organism, taxonomy_id), y las dos rutas de carga escriben el nombre
distinto: la de Swiss-Prot pone "Homo sapiens" y la del TSV
"Homo sapiens (Human)". Medido sobre el corpus vivo: 726 taxones llevan
mas de un nombre, y los SEIS primeros del ranking lo hacian, asi que el
orden estaba mal de arriba abajo. El 9606 son 41.823 proteinas canonicas y
salia como 21.387 y 20.436, compitiendo consigo mismo.

Ahora agrupa por taxonomy_id y el nombre se elige con min() para que sea
determinista y no el que emita el plan. Se excluyen las filas sin taxon,
que son las 28.868 entradas borradas de UniProtKB y no llevan ni taxon ni
organismo; el filtro de organism ya las quitaba, pero conviene decirlo
tambien de la clave de agrupacion nueva.

2. LA COBERTURA POR PLM MEDIA LA ESPINA Y NO EL CORPUS. Decia 576.450 al
100,0%. Es aritmetica honesta sobre la poblacion equivocada: hay 746.014
proteinas canonicas y TODAS tienen embedding, asi que la tarjeta escondia
169.564 y afirmaba algo mas debil de lo que los datos sostienen.

El reviewed=True de los dos lados lo puse yo en #1002 para cortar un 121,5%
medido, pero la causa de aquello era un numerador desalineado, no la
espina. Alinear los dos lados en is_canonical a secas arregla el
porcentaje sin encoger lo que se reporta. Canonicas y no la tabla entera
porque una isoforma comparte secuencia con su padre.

De paso, el recuento de filas NO es el de proteinas, y esta vez al reves:
684.048 filas de embedding cubren 792.535 proteinas, porque las accesiones
que comparten secuencia comparten su embedding.

EL TEST DE LA COBERTURA ERA MIO Y ESTABA MAL DE DOS FORMAS. Afirmaba que
una cadena concreta aparecia dos veces en el fuente, asi que habia que
editarlo cada vez que cambiara la poblacion y no decia nada sobre que los
dos lados coincidieran, que es lo unico que importa. Ahora compara los
conjuntos de filtros de numerador y denominador.

Cuatro tests nuevos del ranking y dos de la cobertura. Las cuatro
mutaciones comprobadas: agrupar por nombre otra vez, el nombre sin
agregar, sin excluir el taxon nulo, y volver a estrechar a Swiss-Prot.
@github-actions
github-actions Bot enabled auto-merge (squash) October 13, 2026 12:29
@codecov

codecov Bot commented Oct 13, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 88.04%. Comparing base (d8bc801) to head (90b16fd).
⚠️ Report is 111 commits behind head on develop.

Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff             @@
##           develop    #1012      +/-   ##
===========================================
+ Coverage    87.85%   88.04%   +0.19%     
===========================================
  Files          306      330      +24     
  Lines        23414    25662    +2248     
===========================================
+ Hits         20570    22594    +2024     
- Misses        2844     3068     +224     
Files with missing lines Coverage Δ
protea/api/routers/proteins_stats.py 96.50% <ø> (-0.45%) ⬇️

... and 41 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions
github-actions Bot merged commit 2810b16 into develop Oct 13, 2026
20 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant