RFC: Derived Columns
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 28/100
Línea de trabajo
Comienza revisando la maquinaria existente de validación y serialización de Schema y, después, sigue el decorator propuesto @dy.derived y los puntos de entrada Schema.with_derived(). Resuelve las preguntas abiertas sobre las dependencias circulares y encadenadas y sobre la serialización antes de la implementación. Se considera terminado cuando las columnas derivadas siguen el comportamiento indicado para las entradas, la sobrescritura y LazyFrame, y los destinos no válidos se rechazan en el momento de definir la clase.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Problem
Schemas often include columns that are deterministic functions of other columns. Today, users must compute these outside of dataframely before validation:
df = df.with_columns(
age=(pl.date.today() - pl.col("birth_date")).dt.total_days() // 365
)
validated = PersonSchema.validate(df)
This scatters transformation logic across the codebase and breaks the "schema as source of truth" model.
Proposed API
1. @dy.derived() decorator
Define derived columns alongside rules, using the same pattern:
class PersonSchema(dy.Schema):
birth_date = dy.Date(nullable=False)
first_name = dy.String(nullable=False)
last_name = dy.String(nullable=False)
# Derived columns
age = dy.Int64(nullable=False)
full_name = dy.String(nullable=False)
@dy.derived("age")
def derive_age(cls) -> pl.Expr:
return (pl.date.today() - cls.birth_date.col).dt.total_days() // 365.25
@dy.derived("full_name")
def derive_full_name(cls) -> pl.Expr:
return cls.first_name.col + pl.lit(" ") + cls.last_name.col
2. Schema.with_derived() method
Explicitly apply derivations to a dataframe:
# Input only needs source columns
df = pl.DataFrame({
"birth_date": [date(1990, 5, 15), date(2000, 1, 1)],
"first_name": ["Alice", "Bob"],
"last_name": ["Smith", "Jones"],
})
# Add derived columns
df_with_derived = PersonSchema.with_derived(df)
# Now has: birth_date, first_name, last_name, age, full_name
# Then validate as usual
validated = PersonSchema.validate(df_with_derived)
Expected Behavior
- Derived columns are optional in input.
with_derived()adds them if missing, overwrites if present. - Lazy frames are preserved.
with_derived()returns aLazyFrameif given aLazyFrame. - Invalid targets error at class definition time.
@dy.derived("x")raises ifxis not a column in the schema.
Open Questions
-
Circular dependencies? Should we detect/error on
aderived frombderived froma? If so, this requires topological sorting of derivations—is this doable? -
Chained derivations? Should derived columns be allowed to depend on other derived columns? e.g.,
agederived frombirth_date, thenis_adultderived fromage. This would require ordering derivations correctly (topological sort). -
Serialization? Should derived column expressions be included in
Schema.serialize()? Unclear how this interacts with the existing serialization machinery.
- Lenguaje dominante
- Python
- Estrellas
- 618
- Forks
- 21
- Merge medio
- 14 h 34 min
- PR fusionados (30 d)
- 7
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de Quantco/dataframely
-
Expose validation errors Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Quantco/dataframely#402 · 3 comentarios ·
-
Adding `sorted` in `dy.Column` Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 62/100
Quantco/dataframely#357 · 1 reacción ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
Quantco/dataframely#309 · 4 comentarios · 2 reacciones ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 45/100
Quantco/dataframely#295 · 3 comentarios · 1 reacción ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 45/100
Quantco/dataframely#273 · 5 comentarios · 1 reacción ·
Todos los issues de Quantco/dataframely
Issues similares
-
agent-ready documentation needs-triage
Dificultad 1/5 1-3 horas Aptitud para principiantes 88/100
-
documentation
Dificultad 1/5 Menos de una hora Aptitud para principiantes 91/100
-
workflow-status page template still says reusable workflows are "triggered only by workflow_call:" Abierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 92/100
-
Add https://search.jeremyh.xyz/ Abiertoinstance instance add
Dificultad 1/5 Menos de una hora Aptitud para principiantes 72/100
searxng/searx-instances#939 · 1 comentario ·
-
area-deployment area-integrations triage:bot-seen
Dificultad 2/5 Medio día Aptitud para principiantes 86/100