The transpose reader (categorical-axis RFC, Phase 1 PR2): read one row
of a wide TimeSeriesacross — its columns become the categories, that
row's cells the values — for <BarChart categories={…}>. This is "columns on
x": the schema's numeric columns (a pivotByGroup output's per-group columns,
a vol term structure's per-expiry columns, …) laid out at one instant.
The row is picked the ordinary way (options.at, default the head row):
series.last() / .first() / .at(index) / .nearest(time). So "which row"
is just row selection — the live snapshot is the head row; a static report
pins a row by index or time. (Binding the row to a scrubbing time cursor is a
later phase.) Pass options.columns to bound / order the category set; omit it
to take every numeric value column. An empty series (or a row past the ends)
yields []; a missing / non-numeric cell reads as a gap (NaN).
The transpose reader (categorical-axis RFC, Phase 1 PR2): read one row of a wide
TimeSeriesacross — its columns become the categories, that row's cells the values — for<BarChart categories={…}>. This is "columns on x": the schema's numeric columns (apivotByGroupoutput's per-group columns, a vol term structure's per-expiry columns, …) laid out at one instant.The row is picked the ordinary way (
options.at, default the head row):series.last()/.first()/.at(index)/.nearest(time). So "which row" is just row selection — the live snapshot is the head row; a static report pins a row by index or time. (Binding the row to a scrubbing time cursor is a later phase.) Passoptions.columnsto bound / order the category set; omit it to take every numeric value column. An empty series (or a row past the ends) yields[]; a missing / non-numeric cell reads as a gap (NaN).