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?
2条答案
按热度按时间ozxc1zmp1#
样条依赖于节点序列,所以我的第一个猜测是这两个函数内部使用不同的默认节点位置。
92dk7w1h2#
Pandas使用
UnivariateSpline
,默认情况下使用“用于选择结数的平滑因子”,请参见pandas代码和scipy文档。为了实现相同的结果,我们需要在函数调用中添加s=0
: