我有一个像这样的数据文件:
a a a b b b
______________________________________
0 1 2 2 1 1 1
1 2 4 2 1 2 5
2 3 6 2 3 2 2
3 4 8 2 1 2 2
4 5 10 2 3 5 5
5 6 12 2 1 2 2
. . . . . . .
. . . . . . .
. . . . . . .
8000 1 5 5 5 5 5 它附带了6列(a和b各表示3个副本,因此它们具有相同的名称)和8001行。我希望计算a和b列中每一行的pvalue、折叠更改和fdr调整后的pvalue。
pvalues = pd.DataFrame()
fcvalues = pd.DataFrame()
qvalues = pd.DataFrame()
pvalue = [stats.ttest_ind(a = data['a'].iloc[i],b = data['b'].iloc[i])[1] for i in np.arange(data.shape[0])]
pvalues['a vs b'] = -np.log10(pvalue)
fold_change_values['a vs b'] = [np.mean((np.array(data['a'].iloc[i]) - np.array(data['b'].iloc[i])))
for i in np.arange(int_data.shape[0])]
qvalues['a vs b'] = fdrcorrection(pvalue)这段代码的问题是需要21秒才能执行。你们有什么建议让这个更快更有效率吗?我刚开始编写代码,所以没有太多的经验可以提高代码的效率。提前感谢!
发布于 2022-05-15 18:24:15
如果我理解正确的话,你可以这样把它矢量化:
pvalues = pd.DataFrame()
fcvalues = pd.DataFrame()
qvalues = pd.DataFrame()
a_data = data['a'].to_numpy()
b_data = data['b'].to_numpy()
# T test for each row pair.
pvalue = stats.ttest_ind(a=a_data, b=b_data, axis=1)[1]
pvalues['a vs b'] = -np.log10(pvalue)
fold_change_values = pd.DataFrame()
# Mean difference for each row.
fold_change_values['a vs b'] = np.mean(a_data - b_data, axis=1)
qvalues['a vs b'] = fdrcorrection(pvalue)这应该要快得多,因为它消除了列表理解中的.iloc索引和for循环。
https://stackoverflow.com/questions/72250453
复制相似问题