微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

熊猫插值不会给出单调的结果 编辑

如何解决熊猫插值不会给出单调的结果 编辑

我有以下数据,我想使用样条将插值方法应用于最后 4 个数字(我知道这是外推):

import numpy as np

x = [
    18.792571,19.170139,19.370556,19.393820,19.239932,18.908891,18.400699,17.892507,17.384314,16.876122,16.367930,15.859737,np.nan,np.nan
]

我正在运行 Pandas interpolate 并且发生了一件非常奇怪的事情,如代码

import pandas as pd

pd.Series(x).interpolate(
    method="spline",order=1
)

返回

0     18.792571
1     19.170139
2     19.370556
3     19.393820
4     19.239932
5     18.908891
6     18.400699
7     17.892507
8     17.384314
9     16.876122
10    16.367930
11    15.859737
12    16.103099
13    15.790022
14    15.476945
15    15.163868
dtype: float64

因此,虽然数据的趋势显然是负面的,因为很早的指数,插值产生了向上的跳跃。使用 scipy 运行相同的计算时

import scipy.interpolate as inp
train_x = [_ for _ in x if _ > 0]
s = inp.InterpolatedUnivariateSpline(range(len(train_x)),train_x,k=1)
ynew = s(range(len(x)))
ynew[12:]

我明白

array([15.351544,14.843351,14.335158,13.826965])

在这种情况下,插值没有向上变化,所以结果对我来说很有意义。

我的问题是:

  • 为什么 pandas 和 scipy 结果不同?
  • 如何让 pandas interpolate 给出我使用 scipy 获得的结果?
  • 为什么熊猫会发生这种向上的变化?

提前致谢!


编辑

使用 scipy interp1d 我有同样的问题:

s = inp.interp1d(range(len(train_x)),kind=1,fill_value='extrapolate')
ynew = s(range(len(x)))
ynew[12:]

给予

array([15.351544,13.826965])

解决方法

也许不是答案,只是一些评论:

  1. Pandas 使用 scipy.interpolate.interp1d 而不是 InterpolatedUnivariateSpline。我相信这些在实现上略有不同。

  2. 我会使用 scipy.interpolate.interp1d 来查看 pandas 和 scipy 是否匹配。

  3. 插值用于填充数据。你所拥有的更符合外推。尽管可以使用这些方法完成外推。我预计结果可能会导致诸如向上变化之类的特殊性。

,

实际上,pandas 使用 UnivariateSpline,因此,为了获得与 pandas 相同的结果,我们可以使用 scipy 运行以下命令:

import scipy.interpolate as inp
train_x = [_ for _ in x if _ > 0]
s = inp.UnivariateSpline(x=range(len(train_x)),y=train_x,k=1)
ynew = s(range(len(x)))
ynew[12:]

给出

array([16.10309945,15.79002222,15.47694498,15.16386774])

使插值减少的方法,在这种情况下,是通过 s = 0:

pd.Series(x).interpolate(
    method="spline",order=1,s=0
)

返回:

0     18.792571
1     19.170139
2     19.370556
3     19.393820
4     19.239932
5     18.908891
6     18.400699
7     17.892507
8     17.384314
9     16.876122
10    16.367930
11    15.859737
12    15.351544
13    14.843351
14    14.335158
15    13.826965
dtype: float64

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。