4

だから私はこれらの2つの投稿に非常に似ていることをしようとしていますが、いくつかの違いがあります. 1つは、csvファイルが必要ないため、csvモジュールがなく、RではなくPythonで実行したい.

Cytoscape の隣接行列を Edgelist (csv ファイル) に変換する

隣接行列をcsvファイルに変換

入力:

AF001         AF002     AF003   AF004  AF005
AF001  1.000000  0.000000e+00  0.000000  0.0000      0
AF002  0.374449  1.000000e+00  0.000000  0.0000      0
AF003  0.000347  1.173926e-05  1.000000  0.0000      0
AF004  0.001030  1.494282e-07  0.174526  1.0000      0
AF005  0.001183  1.216664e-06  0.238497  0.7557      1

出力:

{('AF002', 'AF003'): 1.17392596672424e-05, ('AF004', 'AF005'): 0.75570008659397792, ('AF001', 'AF002'): 0.374449352805868, ('AF001', 'AF003'): 0.00034743953114899502, ('AF002', 'AF005'): 1.2166642639889999e-06, ('AF002', 'AF004'): 1.49428208843456e-07, ('AF003', 'AF004'): 0.17452569907144502, ('AF001', 'AF004'): 0.00103026903356954, ('AF003', 'AF005'): 0.238497202355299, ('AF001', 'AF005'): 0.0011830950375467401}

私は(@jezraelによって丁寧に提供されたコード)DF_sCorrを使用して冗長行列から処理された非冗長相関行列を持っています。np.tril

key=tuple(sorted([row_sample,col_sample])キーがサンプル{ie }のソートされたタプルであり、値がそれらの値である辞書に折りたたみたいと思います。sif_format以下に、sif 形式 (形式の 3 列のテーブル) に類似した辞書を生成する関数の例を書きましたsample_x interaction_value sample_yが、非常に時間がかかります。

この種の表を整理する最善の方法は辞書だと思いました。これを行うには、もっと効率的な方法があるように感じます。おそらくブール値のみを処理していますか?私が使用している実際のデータセットは〜7000x7000です

このタイプの処理を効率的に実行できるnumpypandasscipy、またはを含む関数があるかどうかはわかりません。networkx

import pandas as pd
import numpy as np

A_sCorr = np.array([[0.999999999999999, 0.0, 0.0, 0.0, 0.0], [0.374449352805868, 1.0, 0.0, 0.0, 0.0], [0.00034743953114899502, 1.17392596672424e-05, 1.0, 0.0, 0.0], [0.00103026903356954, 1.49428208843456e-07, 0.17452569907144502, 1.0, 0.0], [0.0011830950375467401, 1.2166642639889999e-06, 0.238497202355299, 0.75570008659397792, 1.0]])
sampleLabels = ['AF001', 'AF002', 'AF003', 'AF004', 'AF005']

DF_sCorr = pd.DataFrame(A_sCorr,columns=sampleLabels, index=sampleLabels)

#AF001         AF002     AF003   AF004  AF005
#AF001  1.000000  0.000000e+00  0.000000  0.0000      0
#AF002  0.374449  1.000000e+00  0.000000  0.0000      0
#AF003  0.000347  1.173926e-05  1.000000  0.0000      0
#AF004  0.001030  1.494282e-07  0.174526  1.0000      0
#AF005  0.001183  1.216664e-06  0.238497  0.7557      1

def sif_format(DF_var):
    D_interaction_corr = {}
    n,m = DF_var.shape 
    for i in range(n):
        row_sample = DF_var.index[i]
        for j in range(m):
            col_sample = DF_var.columns[j]
            if row_sample != col_sample:
                D_interaction_corr[tuple(sorted([row_sample,col_sample]))] = DF_var.iloc[i,j]
            if j==i:
                break
    return(D_interaction_corr)

D_interaction_corr = sif_format(DF_sCorr)  
{('AF002', 'AF003'): 1.17392596672424e-05, ('AF004', 'AF005'): 0.75570008659397792, ('AF001', 'AF002'): 0.374449352805868, ('AF001', 'AF003'): 0.00034743953114899502, ('AF002', 'AF005'): 1.2166642639889999e-06, ('AF002', 'AF004'): 1.49428208843456e-07, ('AF003', 'AF004'): 0.17452569907144502, ('AF001', 'AF004'): 0.00103026903356954, ('AF003', 'AF005'): 0.238497202355299, ('AF001', 'AF005'): 0.0011830950375467401}

DataFrame.to_dict() はこれでは機能しません

DF_sCorr.to_dict()
{'AF002': {'AF002': 1.0, 'AF003': 1.17392596672424e-05, 'AF001': 0.0, 'AF004': 1.49428208843456e-07, 'AF005': 1.2166642639889999e-06}, 'AF003': {'AF002': 0.0, 'AF003': 1.0, 'AF001': 0.0, 'AF004': 0.17452569907144502, 'AF005': 0.238497202355299}, 'AF001': {'AF002': 0.374449352805868, 'AF003': 0.00034743953114899502, 'AF001': 0.999999999999999, 'AF004': 0.00103026903356954, 'AF005': 0.0011830950375467401}, 'AF004': {'AF002': 0.0, 'AF003': 0.0, 'AF001': 0.0, 'AF004': 1.0, 'AF005': 0.75570008659397792}, 'AF005': {'AF002': 0.0, 'AF003': 0.0, 'AF001': 0.0, 'AF004': 0.0, 'AF005': 1.0}}
4

1 に答える 1