現在、次のような pandas DataFrame があります。
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 になります。
編集: 順列は行に沿っています。つまり、各列のインデックスをシャッフルします。
ここでの最大の問題は、パフォーマンスの 1 つです。物事をすばやく並べ替えたい。
私が考えていた例は次のとおりです。
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))
ここでの問題は、これを行うとテストが安定しないことです。明らかに順列は機能しますが、並列で実行しない場合ほど「ランダム」ではないため、使用すると結果の安定性が失われますフォローアップ計算で並べ替えられたデータ。
したがって、私の唯一の「解決策」は、並列コードを実行する前にすべての列のすべてのインデックスを事前に計算することでした。これにより、処理が大幅に遅くなります。
私の質問は次のとおりです。
- この順列を行うためのより効率的な方法はありますか? (平行とは限りません)
- 並列アプローチ (スレッドではなく複数のプロセスを使用) は実現可能ですか?
編集:物事をより明確にするために、たとえば1回のシャッフル後に列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)