A one-dimensional, dtype-aware column with a name. Series is the
per-column unit behind DataFrame, exposing the structural, nullability,
transform, cast, and statistics surface that the
frame and io layers build on.
Its backend is an internal representation — Arrow-style storage with an
explicit validity bitmap, or an all-valid unboxed numeric fast path — decided
by a column's content rather than by its caller: the row rebuilds and the
expression engine's computed columns converge a null-free numeric result onto
the fast path (try_column_to_numeric), the nullable constructors and
cast produce a Builtin column whatever they started from, and the
backend-preserving windows leave a column on whichever
backend they found it. The supported API neither
observes nor selects it: the few methods that do (storage /
storage_kind / is_canonical) are engine seams, absent from the generated
interface and carrying no compatibility promise, so a caller outside this
module has no supported way to tell which one a column is on — and no way at
all to choose it, since nothing here moves a column onto a backend its
content does not call for.
The engine machinery the verbs build on is the row-rebuild machine (an
index vector, a window, a
mask, or a column merge turned into a new Series) and the storage-backend
machine (converge / preserve / read / assert).
Both are engine seams serving frame and the kernel layer, not
Series API.
The fields are priv, so the struct is opaque outside this package: reach a
column through the value-level accessors (name() / dtype() / len() /
get() / to_scalars() / …) and build one through the named constructors,
so the underlying column always keeps its data-and-validity invariants.