<a id="skfolio-containers-assetpanelview"></a>

# skfolio.containers.AssetPanelView

<a id="skfolio.containers.AssetPanelView"></a>

### *class* skfolio.containers.AssetPanelView(owner, observation_selector=None, \_local_fields=None)

Observation-sliced view into an `AssetPanel`.

A view stores an observation selector, a reference to its owner and optional
view-local fields. Owner field arrays are sliced lazily on access through `fields`,
`__getitem__` and `get_field`, so building a view never copies owner field data.

When the selector is a slice, all access remains zero-copy and composing nested
views produces another zero-copy slice. When the selector is an integer or boolean
array, NumPy fancy indexing is applied on access and the resulting arrays may be
copies.

New fields can also be added directly to a view. These view-local fields are useful
for derived data that only belongs to one slice (e.g. values computed for a
cross-validation fold). They are stored on the view, do not modify the owner panel,
and must have shape (n_view_observations, n_assets, …).

* **Parameters:**
  **owner** *AssetPanel*
  : Panel that owns the underlying arrays.

  **observation_selector** *slice or ndarray of integers, optional*
  : Selector applied to the owner observation axis. Slices preserve zero-copy
    semantics. Integer arrays follow NumPy fancy-indexing semantics on access.
    The default (`None`) selects all observations.

  **\_local_fields** *dict[str, BaseField], optional*
  : View-local fields. This argument is for internal use. Use `view[name] = value`
    to add local fields.
* **Attributes:**
  [`active_mask`](#skfolio.containers.AssetPanelView.active_mask)
  : Active mask selected by the view.

  [`asset_names`](#skfolio.containers.AssetPanelView.asset_names)
  : Asset labels.

  [`estimation_mask`](#skfolio.containers.AssetPanelView.estimation_mask)
  : Estimation mask selected by the view.

  [`fields`](#skfolio.containers.AssetPanelView.fields)
  : Lazy mapping of field objects with view-sized values.

  [`n_assets`](#skfolio.containers.AssetPanelView.n_assets)
  : Number of assets.

  [`n_observations`](#skfolio.containers.AssetPanelView.n_observations)
  : Number of observations in the view.

  [`ndim`](#skfolio.containers.AssetPanelView.ndim)
  : Number of dimensions used by scikit-learn sample indexing.

  **observation_selector**

  [`observations`](#skfolio.containers.AssetPanelView.observations)
  : Observation labels selected by the view.

  **owner**

  [`shape`](#skfolio.containers.AssetPanelView.shape)
  : Shape tuple used by scikit-learn sample indexing.

### Methods

| [`add_2d_field`](#skfolio.containers.AssetPanelView.add_2d_field)(name, values, \*[, inactive_policy])   | Add or replace a numeric 2D field.                              |
|------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------|
| [`add_3d_field`](#skfolio.containers.AssetPanelView.add_3d_field)(name, values, \*, ...[, ...])          | Add or replace a numeric 3D field.                              |
| [`add_categorical_field`](#skfolio.containers.AssetPanelView.add_categorical_field)(name, values, \*, levels)     | Add or replace a 2D categorical field.                          |
| [`copy`](#skfolio.containers.AssetPanelView.copy)(\*[, deep, copy_owner])                        | Return a copy of the view.                                      |
| [`decode_categorical_field`](#skfolio.containers.AssetPanelView.decode_categorical_field)(name, \*[, ...])           | Decode a categorical field to labels.                           |
| [`get_field`](#skfolio.containers.AssetPanelView.get_field)(name)                                     | Return a local field or an owner field sliced to the view.      |
| [`keys`](#skfolio.containers.AssetPanelView.keys)()                                              | Return field names visible from the view.                       |
| [`sel_3d`](#skfolio.containers.AssetPanelView.sel_3d)(name, \*[, labels, groups])                  | Select entries from the third axis of a 3D field by label.      |
| [`to_dataframe`](#skfolio.containers.AssetPanelView.to_dataframe)(\*[, fields, assets, ...])             | Convert 2D fields to a pandas DataFrame.                        |
| [`to_panel`](#skfolio.containers.AssetPanelView.to_panel)(\*[, fields, deep])                        | Return a new `AssetPanel` for the view's selected observations. |

#### SEE ALSO
[`AssetPanel`](https://skfolio.org/generated/skfolio.containers.AssetPanel.html.md#skfolio.containers.AssetPanel)
: Owning container.

[`AssetPanel.isel`](https://skfolio.org/generated/skfolio.containers.AssetPanel.html.md#skfolio.containers.AssetPanel.isel)
: Returns a view for observation-only selections.

[`AssetPanel.sel`](https://skfolio.org/generated/skfolio.containers.AssetPanel.html.md#skfolio.containers.AssetPanel.sel)
: Label-based equivalent of `AssetPanel.isel`.

<a id="skfolio.containers.AssetPanelView.active_mask"></a>

#### *property* active_mask

Active mask selected by the view.

<a id="skfolio.containers.AssetPanelView.add_2d_field"></a>

#### add_2d_field(name, values, \*, inactive_policy=MISSING)

Add or replace a numeric 2D field.

* **Parameters:**
  **name** *str*
  : Field name.

  **values** *array-like of shape (n_observations, n_assets)*
  : Numeric 2D values.

  **inactive_policy** *InactivePolicy, default=InactivePolicy.MISSING*
  : Validation policy for values outside `active_mask`.
* **Returns:**
  **self** *BaseAssetPanel*
  : The modified container.

<a id="skfolio.containers.AssetPanelView.add_3d_field"></a>

#### add_3d_field(name, values, \*, third_axis_name, third_axis_labels, third_axis_groups=None, inactive_policy=MISSING)

Add or replace a numeric 3D field.

This is a convenience wrapper around assigning a `Field3D`. The first two axes
of `values` must be observations and assets with shape (n_observations, n_assets).
The third axis stores a homogeneous block such as factors.

* **Parameters:**
  **name** *str*
  : Field name.

  **values** *array-like of shape (n_observations, n_assets, n_third_axis)*
  : Numeric 3D values.

  **third_axis_name** *str*
  : Name describing what the third axis represents (e.g. `factor`).

  **third_axis_labels** *array-like of shape (n_third_axis,)*
  : Labels for entries along the third axis such as factor names (e.g. `size`,
    `momentum`).

  **third_axis_groups** *array-like of shape (n_third_axis,), optional*
  : Optional group label for each third-axis entry such as factor families (e.g.
    `style`, `industry`).

  **inactive_policy** *InactivePolicy, default=InactivePolicy.MISSING*
  : Validation policy for values outside `active_mask`.
* **Returns:**
  **self** *BaseAssetPanel*
  : The modified container.

<a id="skfolio.containers.AssetPanelView.add_categorical_field"></a>

#### add_categorical_field(name, values, \*, levels, inactive_policy=MISSING)

Add or replace a 2D categorical field.

This is a convenience wrapper around assigning a `FieldCategorical`. The field
values must be integer codes with shape (n_observations, n_assets). Code -1 is
reserved for missing values. Code 0 selects `levels[0]`, code 1 selects
`levels[1]` and so on.

* **Parameters:**
  **name** *str*
  : Field name.

  **values** *array-like of integers, shape (n_observations, n_assets)*
  : Integer category codes.

  **levels** *array-like of shape (n_levels,)*
  : Category labels selected by codes 0, 1 and so on.

  **inactive_policy** *InactivePolicy, default=InactivePolicy.MISSING*
  : Validation policy for codes outside `active_mask`.
* **Returns:**
  **self** *BaseAssetPanel*
  : The modified container.

<a id="skfolio.containers.AssetPanelView.asset_names"></a>

#### *property* asset_names

Asset labels.

<a id="skfolio.containers.AssetPanelView.copy"></a>

#### copy(\*, deep=False, copy_owner=True)

Return a copy of the view.

* **Parameters:**
  **deep** *bool, default=False*
  : If `True`, copy local field arrays and the observation selector when
    it is an ndarray.

  **copy_owner** *bool, default=True*
  : If `True`, copy the owner panel. If `False`, the copied view points
    to the same owner.
* **Returns:**
  **view** *AssetPanelView*
  : Copied view.

<a id="skfolio.containers.AssetPanelView.decode_categorical_field"></a>

#### decode_categorical_field(name, \*, missing_label='MISSING')

Decode a categorical field to labels.

* **Parameters:**
  **name** *str*
  : Name of a `FieldCategorical` field.

  **missing_label** *str, default=”MISSING”*
  : Label assigned to missing or out-of-bound codes.
* **Returns:**
  **decoded** *ndarray*
  : Decoded labels with shape (n_observations, n_assets).

<a id="skfolio.containers.AssetPanelView.estimation_mask"></a>

#### *property* estimation_mask

Estimation mask selected by the view.

<a id="skfolio.containers.AssetPanelView.fields"></a>

#### *property* fields

Lazy mapping of field objects with view-sized values.

Field objects are constructed on access and reuse the owner array sliced by
`observation_selector`. Iterating through this mapping does not materialize
sliced arrays for fields that are not accessed.

<a id="skfolio.containers.AssetPanelView.get_field"></a>

#### get_field(name)

Return a local field or an owner field sliced to the view.

* **Parameters:**
  **name** *str*
  : Field name.
* **Returns:**
  **field** *BaseField*
  : Field object with first two axes matching the view.

<a id="skfolio.containers.AssetPanelView.keys"></a>

#### keys()

Return field names visible from the view.

* **Returns:**
  **names** *list of str*
  : Union of view-local field names and owner field names. Local fields shadow
    owner fields with the same name. Owner field order is preserved and
    local-only fields are appended in insertion order.

<a id="skfolio.containers.AssetPanelView.n_assets"></a>

#### *property* n_assets

Number of assets.

<a id="skfolio.containers.AssetPanelView.n_observations"></a>

#### *property* n_observations

Number of observations in the view.

<a id="skfolio.containers.AssetPanelView.ndim"></a>

#### *property* ndim

Number of dimensions used by scikit-learn sample indexing.

<a id="skfolio.containers.AssetPanelView.observations"></a>

#### *property* observations

Observation labels selected by the view.

<a id="skfolio.containers.AssetPanelView.sel_3d"></a>

#### sel_3d(name, \*, labels=None, groups=None)

Select entries from the third axis of a 3D field by label.

Exactly one of `labels` or `groups` must be provided. Selecting a single label
returns a 2D array with shape (n_observations, n_assets). Selecting multiple
labels or any group returns a 3D array whose first two axes are unchanged.

* **Parameters:**
  **name** *str*
  : Name of a `Field3D`.

  **labels** *scalar, iterable, or None, optional*
  : Third-axis labels to select.

  **groups** *scalar, iterable, or None, optional*
  : Third-axis group labels to select. The field must define `third_axis_groups`.
* **Returns:**
  **values** *ndarray*
  : Selected values. A scalar `labels` selection returns 2D values. All other
    selections return 3D values.

<a id="skfolio.containers.AssetPanelView.shape"></a>

#### *property* shape

Shape tuple used by scikit-learn sample indexing.

<a id="skfolio.containers.AssetPanelView.to_dataframe"></a>

#### to_dataframe(\*, fields=None, assets=None, output_format='long', decode_categoricals=True)

Convert 2D fields to a pandas DataFrame.

* **Parameters:**
  **fields** *str, iterable of str, or None, optional*
  : Field names to include. If a single string is passed, the result is a simple
    field DataFrame with observations as index and assets as columns. If `None`,
    all 2D fields are included.

  **assets** *str, iterable of str, or None, optional*
  : Asset labels to include. If `None`, all assets are included.

  **output_format** *{“long”, “wide”}, default=”long”*
  : Output format used when `fields` is not a single string. In long format,
    rows are indexed by `(observation, asset)` and filtered by `active_mask`.
    In wide format, columns are indexed by `(field, asset)`.

  **decode_categoricals** *bool, default=True*
  : If `True`, categorical codes are decoded to labels.
* **Returns:**
  **df** *pandas.DataFrame*
  : DataFrame representation of the selected 2D fields.

<a id="skfolio.containers.AssetPanelView.to_panel"></a>

#### to_panel(\*, fields=None, deep=True)

Return a new `AssetPanel` for the view’s selected observations.

* **Parameters:**
  **fields** *str, iterable of str, or None, optional*
  : Field names to include. If `None`, all visible fields are included.

  **deep** *bool, default=True*
  : If `True`, copy field arrays and label arrays. If `False`, field arrays and
    labels may share memory with the view source. Masks are always copied so the
    returned panel owns independent lockable mask arrays.
* **Returns:**
  **panel** *AssetPanel*
  : Panel containing only the view’s observations and selected fields.

