Modelo de datos: series de tiempo de torre EC (propuesta)¶
Estado: propuesta, pendiente de validar con el equipo de backend — no implementada todavía.
Contexto¶
El modelo actual del catálogo GEI (backend/app/models/co2.py, backend/app/models/torre.py) tiene dos piezas relacionadas con torres, pero ninguna cubre datos de flujo en serie de tiempo:
TorreEc/ConfiguracionSensorGas— metadatos fijos de instalación (alturas, frecuencia de adquisición, separaciones del sensor). No son mediciones.MuestraGEI/SubmuestraGEI— mediciones manuales por cámara: una sesión (MuestraGEI, un tubo conectado a un analizador en una unidad de muestreo) con ~4 tomas (SubmuestraGEI), cada una con momento inicio/final y condición de luz día/noche/noche simulada.
Al revisar un archivo real de salida de Eddypro de la torre Guatavita ST2 (169 columnas, una fila cada 30 minutos — ver Datos de torres EC: de Eddypro a ReddyProc) se encontró que MuestraGEI/SubmuestraGEI no tiene dónde guardar los flujos (co2_flux, ch4_flux, h2o_flux, H, LE), sus flags de calidad, la turbulencia (u*) ni el footprint — son datos de otra naturaleza (serie continua semihoraria, sin "tomas" ni condición de luz discreta). Detalle completo del mapeo columna por columna en la tarea [[datos-modelado-carga-torres]].
Decisión ya tomada: se sube a la plataforma la salida de Eddypro como dato primario y obligatorio por torre; la salida de ReddyProc (gap-filling + partición NEE/Reco/GPP) se trata como un dato derivado y opcional, porque no todas las torres necesariamente la van a tener corrida de forma comparable. Justificación completa en la sección "Integración en Colflux" de Datos de torres EC: de Eddypro a ReddyProc.
Entidades propuestas¶
Tres entidades nuevas, inspiradas en el patrón sesión/toma de MuestraGEI/SubmuestraGEI, pero adaptadas: aquí no hay tomas repetidas, sino dos niveles de procesamiento (Eddypro y ReddyProc) del mismo instante semihorario.
erDiagram
TorreEc ||--o{ MuestraTorre : tiene
MuestraTorre ||--|| SubmuestraEddy : "obligatoria"
MuestraTorre ||--o| SubmuestraReddy : "opcional"
MuestraTorre¶
Ancla de identidad del registro semihorario: torre + instante de tiempo.
| Campo | Tipo | Notas |
|---|---|---|
torre |
FK → TorreEc |
on_delete=CASCADE |
fecha |
DateField | |
hora |
TimeField |
unique_together = [("torre", "fecha", "hora")].
SubmuestraEddy¶
Obligatoria (1:1 con MuestraTorre): los datos de salida de Eddypro para ese instante.
| Grupo | Campos |
|---|---|
| Flujos + calidad | co2_flux/qc_co2_flux/rand_err_co2_flux, igual para ch4_flux, h2o_flux, h_flux (calor sensible), le_flux (calor latente), tau |
| Turbulencia | ustar, tke, monin_obukhov_length, bowen_ratio |
| Footprint | footprint_x_peak, footprint_x_70, footprint_x_90 |
| Aire / viento | air_temperature, air_pressure, relative_humidity, vpd, air_density, wind_speed, wind_dir |
| Resto | datos_extra (JSONField, opcional) — varianzas/covarianzas, spikes, diagnósticos propios de LI-7200/LI-7700, sin modelar columna por columna todavía |
SubmuestraReddy¶
Opcional (0:1 con MuestraTorre) — puede no existir si la torre no tiene ReddyProc corrido.
| Campo | Notas |
|---|---|
nee_f |
NEE con gap-filling |
nee_fqc |
flag de calidad del gap-filling |
reco |
respiración del ecosistema |
gpp_f |
productividad primaria bruta |
ustar_used |
umbral de u* usado en el filtrado |
datos_extra |
JSONField, opcional, resto de columnas |
Por qué esta forma¶
- 3 entidades, no 1 ni 4. Una sola tabla con todo mezclaría dos obligatoriedades distintas (Eddypro siempre, ReddyProc a veces) y dejaría columnas
nullsistemáticamente según el tipo. Cuatro entidades (un parMuestra/Submuestraindependiente por cada software) obligaría a ligarSubmuestraReddya una fila específica de procesamiento de Eddypro, lo cual es más rígido de lo necesario: lo que importa es que ambas describan el mismo instante de la torre, no qué corrida específica de Eddypro se usó. SubmuestraReddyopcional, no un segundo registro independiente. Refleja directamente la regla de negocio: si existe ReddyProc para un instante, necesariamente existe Eddypro para ese mismo instante (ReddyProc es postprocesamiento de Eddypro, nunca un dato independiente).datos_extracomo JSONField. Evita tener que modelar las ~169 columnas de Eddypro una por una desde el inicio; los campos explícitos son los que ya se identificaron como necesarios para consulta/reportes (flujos, calidad, turbulencia, footprint, meteorología básica). Se puede ir promoviendo campos dedatos_extraa columnas propias si se vuelven necesarios para filtrar/agregar.MuestraGEI/SubmuestraGEIno se tocan. Siguen siendo exclusivamente para mediciones manuales por cámara; no se reutilizan para torres porque la semántica de "toma" día/noche no aplica a una serie continua.
Pendiente¶
- Validar esta propuesta con el equipo de backend antes de implementarla.
- Completar la sección de ReddyProc en Datos de torres EC: de Eddypro a ReddyProc cuando se tenga el archivo real de ReddyProc (
Guatavita_2_ReddyProc_2023_2024_output (1).csv, aún no descargado enfiles/archivos-torres/), para confirmar queSubmuestraReddycubre sus columnas reales. - Definir a qué categoría del catálogo (
app/catalogo/generator.py) pertenecerían estas entidades — probablemente una nueva o una extensión de "Torre EC y Flujos".
Referencias¶
- [[datos-modelado-carga-torres]] — tarea donde se originó esta propuesta, con el mapeo columna por columna.
- Datos de torres EC: de Eddypro a ReddyProc — qué es cada archivo y por qué se sube Eddypro.
backend/app/models/torre.pybackend/app/models/co2.py