python - 防止 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 函数进行参数化,使其不会产生负值?我在文档中找不到任何内容。除了那个负值之外,我对估计很好(尽管它们有点歪斜)
我考虑简单地将负数转换为正数,但“分数”值是所有其他连续特征的总和,我想保持这种状态。我可以在这里做什么?
这是实际代码片段的链接。谢谢阅读。
解决方案
我怀疑这是插值的问题。主要原因是您使用的方法。'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。我认为如果你想要一个积极的结果,你最好改变你正在使用的方法。
推荐阅读
- mysql - 将日期从 CSV 文件存储到 SQL 的最佳方法
- python - “只能将str(不是“list”)连接到str”,同时向二进制数添加零
- java - 有没有比这更有效的方法来引用带有字符串的 int 数组
- node.js - 使用合并从 2 个表中返回第一个非空值
- neo4j - 如何在 neo4j 中搜索没有父节点的节点?
- android - 如何在 Android 中选择自定义 TextView?
- android - 如何使用 https 方案在 customtabs 上使用意图过滤器?
- sql-server - SQL Server:从合并 UPSERT 计数将多行合并为一行
- javascript - 是否可以加快 Selenium 中的 move_to_element() 或其他替代方案?
- javascript - 如何使数字成为函数?