scipy Pandassline插值错误?

lhcgjxsq  于 2023-02-04  发布在  其他
关注(0)|答案(2)|浏览(133)

Pandas(版本1.3.5)和SciPy(版本1.7.3)给予了不同的样条插值结果,根据我的理解,Pandas是错误的:

df = pd.DataFrame(data = {'values': [10, 12, 15, None, None, None, None, 10, 5, 1, None, 0, 1, 3],})
df['interpolated_pandas'] = df['values'].interpolate(method='spline', axis=0, order=3)
df[['interpolated_pandas', 'values']].plot.line();

得到:

还有

idx = ~df['values'].isna()
f = interpolate.interp1d(df[idx].index, df.loc[idx,'values'], kind=3) # kind: an integer specifying the order of the spline interpolator to use
df['interpolated_scipy'] = f(df.index)
df[['interpolated_scipy', 'values']].plot.line();

得到:

是我的代码有问题还是我的理解有问题?或者这是Pandas中的一个真正的bug?

ozxc1zmp

ozxc1zmp1#

样条依赖于节点序列,所以我的第一个猜测是这两个函数内部使用不同的默认节点位置。

92dk7w1h

92dk7w1h2#

Pandas使用UnivariateSpline,默认情况下使用“用于选择结数的平滑因子”,请参见pandas代码和scipy文档。为了实现相同的结果,我们需要在函数调用中添加s=0

df['interpolated_pandas'] = df['values'].interpolate(method='spline', axis=0, order=3) # default with smoothing factor
df['interpolated_pandas_s0'] = df['values'].interpolate(method='spline', axis=0, order=3, s=0) # without smoothing factor and same as `interp1d`

相关问题