【发布时间】:2016-10-22 12:00:00
【问题描述】:
简单来说,如何在 Python 中对大型 Pandas 数据帧(可能有 2,000,000 行)应用分位数归一化?
PS。我知道有一个名为 rpy2 的包可以在子进程中运行 R,在 R 中使用分位数归一化。但事实是,当我使用如下数据集时,R 无法计算正确的结果:
5.690386092696389541e-05,2.051450375415418849e-05,1.963190184049079707e-05,1.258362869906251862e-04,1.503352476021528139e-04,6.881341586355676286e-06
8.535579139044583634e-05,5.128625938538547123e-06,1.635991820040899643e-05,6.291814349531259308e-05,3.006704952043056075e-05,6.881341586355676286e-06
5.690386092696389541e-05,2.051450375415418849e-05,1.963190184049079707e-05,1.258362869906251862e-04,1.503352476021528139e-04,6.881341586355676286e-06
2.845193046348194770e-05,1.538587781561563968e-05,2.944785276073619561e-05,4.194542899687506431e-05,6.013409904086112150e-05,1.032201237953351358e-05
编辑:
我想要什么:
鉴于上面显示的数据,如何按照https://en.wikipedia.org/wiki/Quantile_normalization 中的步骤应用分位数归一化。
我在 Python 中找到一段代码,声明它可以计算分位数归一化:
import rpy2.robjects as robjects
import numpy as np
from rpy2.robjects.packages import importr
preprocessCore = importr('preprocessCore')
matrix = [ [1,2,3,4,5], [1,3,5,7,9], [2,4,6,8,10] ]
v = robjects.FloatVector([ element for col in matrix for element in col ])
m = robjects.r['matrix'](v, ncol = len(matrix), byrow=False)
Rnormalized_matrix = preprocessCore.normalize_quantiles(m)
normalized_matrix = np.array( Rnormalized_matrix)
代码在代码中使用的示例数据可以正常工作,但是当我使用上面给出的数据对其进行测试时,结果出错了。
由于ryp2提供了在python子进程中运行R的接口,我直接在R中再次测试,结果还是错误。结果我认为原因是R中的方法是错误的。
【问题讨论】:
-
我删除了“R”标签,因为您 (1) 没有使用 R 并且 (2) 不想在答案中使用 R。但是,如果您说“R 无法计算正确的结果”,听起来您要么在贬低 R(为了什么目的?),要么希望有人更正您未发布的代码。无论哪种方式,也许我误解了你想要什么:分位数归一化需要一个源和目标分布,我不确定你在这里提供什么。你能澄清一下吗?
-
@r2evans 感谢您的评论,我已经编辑了问题。仅供参考,我用谷歌搜索的代码将 R 作为 Python 的子进程运行。直接运行R后发现结果不对。此外,我不确定您所说的“目标分布”是什么意思。根据 Wiki,分位数归一化的计算不涉及该术语。希望我说清楚的问题是对我提供的数据应用分位数归一化。
-
你说得对,我的“目标”这个词不太好。 wiki 引用了“使两个发行版相同”,所以我想知道您的两个发行版是什么。现在您提供了额外的代码(和数据,定义为
matrix),我很困惑您的实际数据是量化规范的。 (也许是一个愚蠢的问题,但是与您实际需要的相比,矩阵是否有可能被转置?) -
@r2evans 对于我造成的混乱,我深表歉意。仅供参考,实际数据是(2119055,124)矩阵。我上面给出的数据是它用于测试的一小部分。是的,我确实考虑了转置的问题。如您所见,在示例代码中,矩阵为 (3,5),但归一化结果为 (5,3),因此我总结要使用此代码,我需要先转置矩阵。更清楚地说,我的数据是 (4,6),使用代码我将转置数据,即 (6,4) 分配给变量
matrix,然后继续。
标签: python deep-learning data-science