为什么 DataFrame.Interpolate with Spline 会产生意外的波浪

why does dataframe.interpolate with spline create unexpected wave

提问人:jerron 提问时间:11/3/2023 更新时间:11/10/2023 访问量:33

问:

我正在尝试使用 dataframe.interpolate 来填充缺失的数据。这是我的测试:

from itertools import product
df=pd.DataFrame.from_dict({
    1.5      :[np.nan    ,91.219     ,np.nan     ,np.nan     ,102.102    ,np.nan     ,np.nan     ], 
    2.0      :[np.nan    ,np.nan     ,np.nan     ,np.nan     ,103.711    ,np.nan     ,103.031    ], 
    2.5      :[np.nan    ,98.25      ,np.nan     ,100.406    ,104.695    ,np.nan     ,104.938    ], 
    3.0      :[np.nan    ,101.578    ,np.nan     ,102.969    ,104.875    ,np.nan     ,105.242    ], 
    3.5      :[np.nan    ,103.859    ,87.93      ,104.531    ,104.906    ,np.nan     ,105.32     ], 
    4.0      :[np.nan    ,105.156    ,94.469     ,105.656    ,105.844    ,89.68      ,106.523    ], 
    4.5      :[94.266    ,106.039    ,96.82      ,106.75     ,103.156    ,93.703     ,107.938    ], 
    5.0      :[97.336    ,107.953    ,98.602     ,107.906    ,104.25     ,96.547     ,109.703    ], 
    5.5      :[99.664    ,110.438    ,100.203    ,108.906    ,100.375    ,98.844     ,110.188    ], 
    6.0      :[101.344   ,112.703    ,101.492    ,108.688    ,102.906    ,100.68     ,110.5      ], 
    6.5      :[102.313   ,112.078    ,102.266    ,108.813    ,104.5      ,101.875    ,104    ], 
    7.0      :[102.656   ,114.469    ,102.242    ,108.813    ,np.nan     ,102.625    ,109    ], 
    7.5      :[103.25    ,np.nan     ,102.594    ,108.813    ,np.nan     ,103.234    ,109    ], 
    }, orient='index')
df.plot(title='original')
for int_method,int_order in list(product(['spline'],range(1,4)))+[
    (x,3) for x in ['nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'barycentric', 'polynomial',
              'krogh', 'piecewise_polynomial', 'pchip', 'akima', 'cubicspline','from_derivatives','linear',
              ]
]:
    spl=df.interpolate(limit_direction='both',method=int_method,order=int_order)
    spl.plot(title=f'{int_method},{int_order}')

似乎只有样条才能给我提供我需要的解释。但是,我发现它似乎增加了一些意想不到的波动:

unexpected fluctuation from spline

有人可以帮助我了解发生了什么,甚至提供一些关于如何改进的建议(我知道“改进”在这里是一个模糊的短语。我自己找不到明确的定义)? 谢谢!

Python 插值缺失 数据 样条外

评论


答:

0赞 jerron 11/10/2023 #1

这是因为熊猫。DataFrame.interpolate 在内部调用 scipy.interpolate,scipy.interpolate 会在进行插值之前对 X(在图中它们在 Y 轴上)进行排序。显然,这不是我们在这里想要的,它混合了左侧和右侧的势头。