2017-09-06 19 views
0

我需要計算生物實體共同出現的PMI分數,例如, Gene A - Gene BGene C - Disease A。已從Pubtator中提取了共現。我使用Python 3.用於從計數:數據幀或矩陣計算PMI的策略

對於一組文檔,我已經通過共現類別提取了所有實體的各個計數freq(x)freq(y),例如, Gene-GeneGene-Disease,並且我有實體對freq(x,y)的同現計數。所有計數均存儲在Dict中。

什麼是從原始計數計算逐點互信息(PMI)分數的最佳方法:

  • 創建兩個數據幀(一個用於個人計數和一個共生計數)
  • 創建兩個矩陣? (同上)
  • 另一種方法?

考慮到一組數據有3列:entity, category, count,而另一組有4列:entity_a, category, entity_b, count其中類別表示同現類別。我需要用於個體實體計數的類別,因爲如果我使用它們的總計數,它會扭曲給定同現類型的結果。

我試過數據框的方法,但不知道如何創建一個新的PMI列,計算結果使用兩個不同的數據框架(DFs),因此我想也許矩陣方法可能會更好?如果是這樣,爲什麼?數據的

實例時轉化成的DF:

df1.head():

ent rel count 177 5197 Gene_Gene 2 176 56744 Gene_Gene 2 175 12766 Gene_Gene 2 174 3091 Gene_Gene 2 173 3162 Gene_Gene 2

df2.head():

ent_a rel ent_b count 247 5197 Gene_Gene 56744 1 246 12766 Gene_Gene 5197 1 245 12766 Gene_Gene 56744 1 244 3091 Gene_Gene 3162 1 243 3091 Gene_Gene 54583 1

的PMI式:

enter image description here

回答

0

我發現爲我工作的策略包括使用DataFrames(DFs)和numpy數組。

在第一步中,DF可用於查找並填充df2以及共同出現實體的各自單獨計數。然後,在第二步中,使用numpy數組來高效地計算每個同現事件的(近似)PMI得分。

步驟1:查找個人計數

  • 第一分裂共現實體和每個添加到新的柱例如:

    df_ab['ent_a'] = df_ab.ent_ab.apply(lambda x: x.split('-')[0])

  • 然後調用一個查找函數獲得個人數量,例如:

    df_ab['ent_a_count'] = df_ab.ent_a.apply(get_ent, args=(df_a, 'ent_a',))

    那裏查找函數如下:

    def get_ent(ent_df_ab, df_a, colname_df_ab): row_df_a = df_a[df_a[colname_df_ab] == ent_df_ab] i = row_df_a.iloc[0]['count'] return i

df2現在看起來是這樣

``` 
     ent_ab count_ab  type ent_a ent_b ent_a_count ent_b_count 
0 5197-56744   2 Gene_Gene 5197 56744   2   2 
1 12766-5197   1 Gene_Gene 12766 5197   2   1 
2 12766-56744   1 Gene_Gene 12766 56744   2   2 
3 3091-3162   4 Gene_Gene 3091 3162   6   1 
4 3091-54583   2 Gene_Gene 3091 54583   6   1 
``` 

步驟2:矢量化PMI演算通貨膨脹

  • numpy的基於陣列的,用於計算分數

    def compute_pmi(df): count_ab = np.array(df[['count_ab']]) ent_a_count = np.array(df[['ent_a_count']]) ent_b_count = np.array(df[['ent_b_count']]) pmi = np.round(count_ab/(ent_a_count * ent_b_count), 3) df['pmi'] = pmi return df

功能