首页 > 解决方案 > 防止 df.interpolate() 中的负值

问题描述

我在避免插值中的负值时遇到了麻烦。我在 DataFrame 中有以下数据:

current_country = 

idx Country     Region              Rank    Score     GDP capita    Family   Life Expect.    Freedom    Trust Gov.  Generosity  Residual    Year

289 South Sudan Sub-Saharan Africa  143     3.83200     0.393940    0.185190    0.157810    0.196620    0.130150    0.258990    2.509300    2016
449 South Sudan Sub-Saharan Africa  147     3.59100     0.397249    0.601323    0.163486    0.147062    0.116794    0.285671    1.879416    2017
610 South Sudan Sub-Saharan Africa  154     3.25400     0.337000    0.608000    0.177000    0.112000    0.106000    0.224000    1.690000    2018
765 South Sudan Sub-Saharan Africa  156     2.85300     0.306000    0.575000    0.295000    0.010000    0.091000    0.202000    1.374000    2019

我想插入第二年(2019) - 如下所示 - 使用熊猫的 df.interpolate()

new_row =

idx Country     Region              Rank    Score   GDP capita  Family     Life Expect.  Freedom    Trust Gov.  Generosity  Residual    Year

593 South Sudan Sub-Saharan Africa  0       np.nan  np.nan      np.nan     np.nan        np.nan     np.nan      np.nan      np.nan      2015

我在要插值的所有列中创建包含空值的 df(如上),并将该值附加到原始数据帧,然后再进行插值以使用 NaN 填充单元格。

interpol_subset = current_country.append(new_row)
interpol_subset = interpol_subset.interpolate(method = "pchip", order = 2)

这会产生以下df

idx Country     Region              Rank    Score     GDP capita    Family   Life Expect.    Freedom    Trust Gov.  Generosity  Residual    Year

289 South Sudan Sub-Saharan Africa  143     3.83200     0.393940    0.185190    0.157810    0.196620    0.130150    0.258990    2.509300    2016
449 South Sudan Sub-Saharan Africa  147     3.59100     0.397249    0.601323    0.163486    0.147062    0.116794    0.285671    1.879416    2017
610 South Sudan Sub-Saharan Africa  154     3.25400     0.337000    0.608000    0.177000    0.112000    0.106000    0.224000    1.690000    2018
765 South Sudan Sub-Saharan Africa  156     2.85300     0.306000    0.575000    0.295000    0.010000    0.091000    0.202000    1.374000    2019
4   South Sudan Sub-Saharan Africa  0       2.39355     0.313624    0.528646    0.434473   -0.126247    0.072480    0.238480    0.963119    2015

问题:在最后一行,“自由”中的值是负数。有没有办法对 df.interpolate 函数进行参数化,使其不会产生负值?我在文档中找不到任何内容。除了那个负值之外,我对估计很好(尽管它们有点歪斜)

我考虑简单地将负数转换为正数,但“分数”值是所有其他连续特征的总和,我想保持这种状态。我可以在这里做什么?

这是实际代码片段的链接。谢谢阅读。

标签: pythonpandasscipydata-scienceinterpolation

解决方案


我怀疑这是插值的问题。主要原因是您使用的方法。'pchip' 无论如何都会为 'freedom' 返回一个负值。如果我们从您的数据框中获取值:

import numpy as np
import scipy.interpolate

y = np.array([0.196620, 0.147062, 0.112000, 0.010000])
x = np.array([0, 1, 2, 3])
pchip_obj = scipy.interpolate.PchipInterpolator(x, y)
print(pchip_obj(4))

结果是-0.126。我认为如果你想要一个积极的结果,你最好改变你正在使用的方法。


推荐阅读