2015-11-30 8 views
6

मैं बड़े जैविक डेटासेट के साथ काम कर रहा हूं।सभी कॉलमों के बीच जोड़ी के सहसंबंध की गणना

मैं अपनी डेटा तालिका में सभी 2-कॉलम संयोजनों के पीसीसी (पीयर्सन सहसंबंध गुणांक) की गणना करना चाहता हूं और परिणाम को डेटाफ्रेम या सीएसवी फ़ाइल के रूप में सहेजना चाहता हूं।

डेटा तालिका नीचे की तरह है: कॉलम जीन का नाम हैं, और पंक्तियां डेटासेट का कोड हैं। फ्लोट संख्या का मतलब डेटासेट में जीन सक्रिय है।

 GeneA GeneB GeneC ... 
DataA 1.5 2.5 3.5 ... 
DataB 5.5 6.5 7.5 ... 
DataC 8.5 8.5 8.5 ... 
... 

एक उत्पादन के रूप में, मैं नीचे की तरह तालिका (DataFrame या csv फ़ाइल) का निर्माण करना चाहते हैं, क्योंकि scipy.stats.pearsonr समारोह रिटर्न (पीसीसी, पी-मूल्य)। मेरे उदाहरण में, एक्सएक्स और वाईवाई का अर्थ है पियरसनर ([1.5, 5.5, 8.5], [2.5, 6.5, 8.5]) के परिणाम। इसी तरह, जेडजेड और एए का मतलब पियरसनर ([1.5, 5.5, 8.5], [3.5, 7.5, 8.5] का परिणाम है। मुझे अपने परीक्षण में जीनबी_जीने या जीएनसी_जीनबी जैसे अनावश्यक डेटा की आवश्यकता नहीं है।

   PCC P-value 
GeneA_GeneB XX YY 
GeneA_GeneC ZZ AA 
GeneB_GeneC BB CC 
... 

कॉलम नामों या पंक्ति नामों का उपयोग करके कॉलम और पंक्तियों की संख्या कई (100 से अधिक) हैं और उनके नाम जटिल हैं।

विशेषज्ञों के लिए यह एक साधारण समस्या हो सकती है, मुझे नहीं पता कि इस प्रकार की मेज को पाइथन और पांडा पुस्तकालय से कैसे निपटना है। विशेष रूप से नया डेटाफ्रेम बनाना और परिणाम जोड़ना बहुत मुश्किल लगता है।

मेरी खराब व्याख्या के लिए खेद है, लेकिन मुझे उम्मीद है कि कोई मेरी मदद कर सकता है।

+0

इसका उत्तर यहां दिया गया है: [link] (http://stackoverflow.com/questions/3949226/calculating-pearson-correlation-and-significance-in-python) – Glostas

+0

आपकी टिप्पणी के लिए धन्यवाद। मुझे लगता है कि शीर्षक काफी अच्छा नहीं था। मैं क्या जानना चाहता हूं कि पीसीसी की गणना कैसे करें, लेकिन सभी कॉलम जोड़ी के पीसीसी की गणना करना, और परिणामों को एक नए डेटाफ्रेम के रूप में सहेजें। – z991

उत्तर

8
from pandas import * 
import numpy as np 
from libraries.settings import * 
from scipy.stats.stats import pearsonr 
import itertools 

यादृच्छिक नमूना डेटा बनाना:

df = DataFrame(np.random.random((5, 5)), columns=['gene_' + chr(i + ord('a')) for i in range(5)]) 
print(df) 

    gene_a gene_b gene_c gene_d gene_e 
0 0.471257 0.854139 0.781204 0.678567 0.697993 
1 0.292909 0.046159 0.250902 0.064004 0.307537 
2 0.422265 0.646988 0.084983 0.822375 0.713397 
3 0.113963 0.016122 0.227566 0.206324 0.792048 
4 0.357331 0.980479 0.157124 0.560889 0.973161 

correlations = {} 
columns = df.columns.tolist() 

for col_a, col_b in itertools.combinations(columns, 2): 
    correlations[col_a + '__' + col_b] = pearsonr(df.loc[:, col_a], df.loc[:, col_b]) 

result = DataFrame.from_dict(correlations, orient='index') 
result.columns = ['PCC', 'p-value'] 

print(result.sort_index()) 

        PCC p-value 
gene_a__gene_b 0.461357 0.434142 
gene_a__gene_c 0.177936 0.774646 
gene_a__gene_d -0.854884 0.064896 
gene_a__gene_e -0.155440 0.802887 
gene_b__gene_c -0.575056 0.310455 
gene_b__gene_d -0.097054 0.876621 
gene_b__gene_e 0.061175 0.922159 
gene_c__gene_d -0.633302 0.251381 
gene_c__gene_e -0.771120 0.126836 
gene_d__gene_e 0.531805 0.356315 
  • इन संयोजनों के माध्यम से itertools.combination(iterable, r)
  • दोहराएं का उपयोग कर DataFrame स्तंभों की अद्वितीय संयोजन प्राप्त करें और का उपयोग कर जोड़ो में सहसंबंध की गणना scipy.stats.stats.personr
  • से dictionary

करने के लिए dictionary

  • बिल्ड DataFrame परिणाम (पीसीसी और पी-मूल्य टपल) जोड़ें फिर आप भी result.to_csv() बचा सकता है। आपको जोड़ीदार सहसंबंधों के लिए बनाए गए नामों के बजाय MultiIndex (प्रत्येक कॉलम के नाम वाले दो कॉलम) का उपयोग करना सुविधाजनक हो सकता है।

  • +0

    बहुत बहुत धन्यवाद!जैसा कि आप और चेनज़ोंगपू ने सलाह दी है, संयोजन समारोह का उपयोग इस तरह की समस्या के लिए एक अच्छा समाधान प्रतीत होता है। इसके अलावा मैं आपको अपनी तरह के स्पष्टीकरण के लिए फिर से धन्यवाद देना चाहता हूं। यह बहुत उपयोगी था क्योंकि मैं अजगर में नया हूं। – z991

    2

    जोड़े पाने के लिए, यह combinations समस्या है। आप concat सभी पंक्तियों को परिणामस्वरूप dataframe कर सकते हैं।

    from pandas import * 
    from itertools import combinations 
    df = pandas.read_csv('gene.csv') 
    # get the column names as list, which are gene names 
    column_list = df.columns.values.tolist() 
    result = [] 
    for c in combinations(column_list, 2): 
        firstGene, secondGene = c 
        firstGeneData = df[firstGene].tolist() 
        secondGeneData = df[secondGene].tolist() 
        # now to get the PCC, P-value using scipy 
        pcc = ... 
        p-value = ... 
        result.append(pandas.DataFrame([{'PCC': pcc, 'P-value': p-value}], index=str(firstGene)+ '_' + str(secondGene), columns=['PCC', 'P-value']) 
    
    result_df = pandas.concat(result) 
    #result_df.to_csv(...) 
    
    +0

    मुझे 'संयोजन' के बारे में पता नहीं था, लेकिन यह इस तरह की जोड़ी गणना करते समय अच्छा लगता है। साथ ही, मैंने सीखा है कि सूची से डेटाफ्रेम बनाना आसानी से कॉन्सट फ़ंक्शन द्वारा किया जा सकता है। आपका बहुत बहुत धन्यवाद! – z991

    संबंधित मुद्दे