pandas.Series中的加权插值

时间:2015-11-05 22:13:05

标签: python pandas scipy

让我们考虑一系列价值观:

s = pandas.Series([0, np.nan, np.nan, 1])

和一系列的重量:

w = pandas.Series([np.nan, 1, 0, 1])

经典的线性插值会给我:

>>> s.interpolate()
0    0.000000
1    0.333333
2    0.666667
3    1.000000
dtype: float64

我需要一个考虑w[i] ~ s[i] - s[-1]且应该返回的weighted_interpolate方法:

>>> weighted_interpolate(s, w)
0    0.000000
1    0.500000
2    0.500000
3    1.000000
dtype: float64

我怎样才能做到这一点?我发现了piecewise_polynomial方法,但我没有弄清楚如何使它工作。

1 个答案:

答案 0 :(得分:1)

迈克尔给了我需要的提示。这是一个仅使用ufuncs加权插值的例子(例如numpy函数)。

将pandas导入为pd 导入numpy为np

s = pd.Series([0, np.nan, np.nan, 1, np.nan, np.nan, np.nan, 2])
w = pd.Series([0, 1, 0, 1, 1, 2, 0, 1])
print(s.interpolate())
sb = s.fillna(method='ffill')
se = s.fillna(method='bfill')
cw = w.cumsum()
w2 = pd.Series(None, index=s.index)
w2[~np.isnan(s)] = cw[~np.isnan(s)]
wb = w2.fillna(method='ffill')
we = w2.fillna(method='bfill')
cw = (cw - wb) / (we - wb)
r = sb + cw * (se - sb)
r.update(s)
print(r)

在已知点的图下方,线性插值和加权插值

Example