目前我有一个这样的熊猫数据框:
ID A1 A2 A3 B1 B2 B3
Ku8QhfS0n_hIOABXuE 6.343 6.304 6.410 6.287 6.403 6.279
fqPEquJRRlSVSfL.8A 6.752 6.681 6.680 6.677 6.525 6.739
ckiehnugOno9d7vf1Q 6.297 6.248 6.524 6.382 6.316 6.453
x57Vw5B5Fbt5JUnQkI 6.268 6.451 6.379 6.371 6.458 6.333
此 DataFrame 与统计信息一起使用,然后需要进行排列测试(编辑:准确地说,是随机排列)。每列的索引需要洗牌(采样)100 次。为了给出大小的概念,行数可以是 50,000 左右。
编辑:排列是沿着行,即洗牌每列的索引。
这里最大的问题是性能之一。我想以快速的方式排列事物。
我想到的一个例子是:
import random
import joblib
def permutation(dataframe):
return dataframe.apply(random.sample, axis=1, k=len(dataframe))
permute = joblib.delayed(permutation)
pool = joblib.Parallel(n_jobs=-2) # all cores minus 1
result = pool(permute(dataframe) for item in range(100))
这里的问题是,通过这样做,测试不稳定:显然排列有效,但它不像没有并行完成的那样“随机”,因此当我使用时结果会失去稳定性后续计算中的置换数据。
所以我唯一的“解决方案”是在执行并行代码之前预先计算所有列的所有索引,这会大大减慢速度。
我的问题是:
- 有没有更有效的方法来进行这种排列?(不一定平行)
- 并行方法(使用多个进程,而不是线程)是否可行?
编辑:为了让事情更清楚,这是在一次洗牌后应该发生的情况,例如 A1 列:
Ku8QhfS0n_hIOABXuE 6.268
fqPEquJRRlSVSfL.8A 6.343
ckiehnugOno9d7vf1Q 6.752
x57Vw5B5Fbt5JUnQk 6.297
(即行值正在移动)。
EDIT2:这是我现在使用的:
def _generate_indices(indices, columns, nperm):
random.seed(1234567890)
num_genes = indices.size
for item in range(nperm):
permuted = pandas.DataFrame(
{column: random.sample(genes, num_genes) for column in columns},
index=range(genes.size)
)
yield permuted
(简而言之,为每列构建一个重采样索引的 DataFrame)
后来(是的,我知道这很丑):
# Data is the original DataFrame
# Indices one of the results of that generator
permuted = dict()
for column in data.columns:
value = data[column]
permuted[column] = value[indices[column].values].values
permuted_table = pandas.DataFrame(permuted, index=data.index)