Skip to content

bgc_data_processing.comparison.interpolation

Interpolation objects.

Interpolator(base, x_column_name, y_columns_name, kind='linear')

Interpolate slices with common index from a reference dataframe.

Parameters:

Name Type Description Default
base DataFrame

DataFrame to use a base data for the interpolation.

required
x_column_name str

name of the column to use as x for the interpolation.

required
kind str

Type of interpolation, to pass to scipy.interpolate.interp1d. , by default "linear"

'linear'
Source code in src/bgc_data_processing/comparison/interpolation.py
27
28
29
30
31
32
33
34
35
36
37
38
def __init__(
    self,
    base: Storer,
    x_column_name: str,
    y_columns_name: list[str],
    kind: str = "linear",
) -> None:
    self._storer = base
    self._columns_order = base.data.columns
    self._x = base.variables.get(x_column_name).label
    self._ys = [base.variables.get(name).label for name in y_columns_name]
    self.kind = kind

kind = kind instance-attribute

interpolate(row)

Interpolate a self.reference slice with same index as row.

This method is mostly meant to be applied using pd.DataFrame.apply method.

Parameters:

Name Type Description Default
row Series

Row to use for interpolation.

required

Returns:

Type Description
Series

Interpolated series with same depth as row.

Source code in src/bgc_data_processing/comparison/interpolation.py
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
@with_verbose(trigger_threshold=1, message="Interpolating row.")
def interpolate(
    self,
    row: pd.Series,
) -> pd.Series:
    """Interpolate a self.reference slice with same index as row.

    This method is mostly meant to be applied using pd.DataFrame.apply method.

    Parameters
    ----------
    row : pd.Series
        Row to use for interpolation.

    Returns
    -------
    pd.Series
        Interpolated series with same depth as row.
    """
    ref_slice: pd.DataFrame = self._storer.data.loc[row.name, :]
    obs_depth = row[self._x]
    ref_depths = ref_slice[self._x]
    if np.isnan(obs_depth):
        return self._handle_nan_depth(ref_slice, obs_depth, row.name)
    if obs_depth > ref_depths.max():
        return self._handle_outbound_max(ref_slice, obs_depth, row.name)
    if obs_depth < ref_depths.min():
        return self._handle_outbound_min(ref_slice, obs_depth, row.name)
    return self._interpolate(ref_slice, obs_depth, row.name)

interpolate_storer(observations_storer)

Interpolate over all rows a Store's dataframe.

Parameters:

Name Type Description Default
observations_storer Storer

Storer to interpolate on each row.

required

Returns:

Type Description
Storer

Storer with interpolated rows to match observations_storer's x values.

Source code in src/bgc_data_processing/comparison/interpolation.py
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
@with_verbose(
    trigger_threshold=0,
    message="Interpolating Data to match observations' depth values.",
)
def interpolate_storer(
    self,
    observations_storer: Storer,
) -> Storer:
    """Interpolate over all rows a Store's dataframe.

    Parameters
    ----------
    observations_storer : Storer
        Storer to interpolate on each row.

    Returns
    -------
    Storer
        Storer with interpolated rows to match observations_storer's x values.
    """
    obs_data = observations_storer.data
    matching_index = obs_data.loc[self._storer.data.index.unique(), :]
    interpolated_df = matching_index.apply(self.interpolate, axis=1)
    return Storer(
        data=interpolated_df,
        category=self._storer.category,
        providers=self._storer.providers,
        variables=self._storer.variables,
    )