pandas adding a interpolator function conditionally as a new column

Viewed 36

I created a series of 5 scipy cubic spline (interpolator type) objects as follows:

from scipy.interpolate import CubicSpline
def spline3(df, col1, col2):
    x, y = df[col1].values, df[col2].values
    cs = CubicSpline(x, y, bc_type='natural')
    return cs
# indexed series of spline obj
splines = avg_df.groupby('group').apply(spline3, 'tenor', 'mid')

resulting in:

    splines
    Out[129]: 
    group
    A     <scipy.interpolate._cubic.CubicSpline object a...
    B    <scipy.interpolate._cubic.CubicSpline object a...
    C    <scipy.interpolate._cubic.CubicSpline object a...
    D    <scipy.interpolate._cubic.CubicSpline object a...
    E    <scipy.interpolate._cubic.CubicSpline object a...
    dtype: object

I.e., they will produce different interpolation for the same input x as could be seen below. How to apply it to say this minimal data set as a new column:

toy = pd.DataFrame({
    'group': ['A', 'A', 'E'],
    'months': [11.04, 11.89, 7.51]
    })

toy
Out[132]: 
  group  months
0     A   11.04
1     A   11.89
2     E    7.51

something like toy['interpolated'] = splines[toy['MMD'](toy['months'] as below works:

splines['A'](7)
Out[135]: array(0.90897722)

splines['E'](7)
Out[136]: array(1.74683114)

was thinking of apply\ pipe or np.select but it just escapes me this late on Friday.

1 Answers

I think you can use .apply with lambda row: func(row) where func(row) takes on the form splines[row['group']](row['month']):

toy['spline_x'] = toy.apply(lambda row: splines[row['group']](row['month'), axis=1)
Related