【发布时间】:2019-12-18 07:12:51
【问题描述】:
我有一个由成分数据组成的数据集。 每列代表混合物整体中某个组分的百分比(十进制值)。 每行总和为 1。
如果混合物中的一种成分发生变化,其余成分必须相应变化以满足总和约束。
我正在使用这些数据执行多元线性回归,它需要进行一些转换,以使回归系数有意义且可解释。数据集包含零值,这是我尝试实施的特定类型转换的问题。
在我可以执行此转换之前,建议的操作是用一个小数字替换所有零值,并调整剩余的组件以使总和约束仍然得到满足。
您可以在下面的 dummy df 中看到有连续多个零值的情况。
data = {'X1': [0.21, 0.08, 0.57, 0.03],
'X2': [0.27, 0.56, 0.0, 0.02],
'X3': [0.0, 0.14, 0.0, 0.45],
'X4': [0.13, 0.02, 0.26, 0.37],
'X5': [0.39, 0.2, 0.17, 0.13]}
df = pd.DataFrame(data)
print(df)
我们只考虑一行,所以这样做的公式如下:
设原始值为r_i。对于 delta_i 的组件 r_i 的更改,我们得到新值 x_i。
所以,x_i = r_i + delta_i
为了保持其余成分之间的相对比例,
设r_j为剩余分量的原始值,
那么第 j 个分量 x_j 的新值是,
x_j = r_j - ((r_j / (1 - r_i) * delta_i) and i != j
我正在努力为这个问题编写一个适当的循环,它将在数据集中搜索零值,然后在索引和列中添加一个小数字 包含零值,然后继续使用我上面描述的公式调整整行。
编辑:
很抱歉数学公式的表述不好。
对于虚拟 df 中的第一行,公式的应用很简单,因为该行中只有一个零:
重要的是其余组件之间的相对比例保持不变,您可以看到这里我将零值更新为一个小数字。
对于虚拟 df 中的第三行,事情变得有点复杂。我通过添加一个小数来更新第一个 (X2) 零值。第二个 (X3) 零值保持为零,因为公式正在乘以零。 所以我进行了第二次更新,使得 X2 和 X3 现在是小的非零值,这显示在下表的第三行。
对于行上存在多个零的情况,保持其余组件之间的相对比例也是相同的情况。
我想不出第一个问题的循环,更不用说第二个了! 另外,不用担心在相对比例表中除以一个小数会产生很大的数字,我稍后会处理。
【问题讨论】:
-
基于上述数据框的实际结果示例可以使这变得更好。您可以在 Excel 中做一个前后对比,截屏,然后添加到您的帖子中。
-
啊哈!编辑后,这使我的答案过时了。暂时删除并编辑。我想我现在明白你的意思了。
-
您想通过降低幅度来保持元素分布吗?
-
已编辑,现在显示的结果与您的示例相同。
标签: python pandas loops numpy math