2016-01-20 8 views
6

मैं एक पांडा dataframe भीतर पंक्तियों के सभी जोड़ो में संयोजन पर एक समारोह (सहसंबंध) को चलाने के लिए कोशिश कर रहा हूँ:,अजगर पांडा समारोह पंक्तियों के सभी जोड़ो में संयोजन के लिए लागू किया

stats = dict() 
for l in itertools.combinations(dat.index.tolist(),2): 
    stats[l] = pearsonr(dat.loc[l[0],:], dat.loc[l[1],:]) # stores (r, p) 
बेशक

यह काफी धीमी है और मैं सोच रहा हूं कि apply() या अन्यथा कुछ के उपयोग के माध्यम से बराबर कैसे करना है।

नोट: मुझे लगता है मैं सीधे pandas corr() समारोह के साथ dataframe के सहसंबंध पा सकते हैं पता है, लेकिन यह जुड़े पी-मूल्य (जो मैं छानने उद्देश्यों के लिए की जरूरत है)

+1

आप के स्रोत में देखें, तो [ 'pearsonr'] (https://github.com/scipy/scipy/blob/v0.16.1/scipy/stats/stats.py#L2514) आप पाएंगे यदि आपके पास सहसंबंध गुणांक है तो पी-वैल्यू की गणना करने के लिए कोड की केवल कुछ पंक्तियां होती हैं। 'फ़ंक्शन' बनाना बहुत कठिन नहीं होना चाहिए जिसका उपयोग आप '.apply (function)' के साथ कर सकते हैं। – Primer

+0

अपने शीर्षक को कुछ और विशिष्ट में बदलने पर विचार करें :) –

उत्तर

2

वापस नहीं करता है यह आपको कुछ मिलना चाहिए जल्दी करो।

def Pearson(r, n=len(dat)): 
    r = max(min(r, 1.0), -1.0) 
    df = n - 2 
    if abs(r) == 1.0: 
     prob = 0.0 
    else: 
     t_squared = r**2 * (df/((1.0 - r) * (1.0 + r))) 
     prob = betai(0.5*df, 0.5, df/(df+t_squared)) 

    return (r,prob) 

उपयोग applymap जो dat.corr पर तत्व के लिहाज से संचालन करता है: एक समारोह Pearson, प्राइमर की कड़ी में डॉक्स से संशोधित परिभाषित करें। आप Pearson के सहसंबंध गुणांक r गुजर रहे हैं:

np.random.seed(10) 
dat = pd.DataFrame(np.random.randn(5, 5)) 
dat[0] = np.arange(5) # seed two correlated cols 
dat[1] = np.arange(5) # ^^^ 

dat.corr().applymap(Pearson) 

    0 1 2 3 4 
0 (1.0, 0.0) (1.0, 0.0) (0.713010395675, 0.176397305541) (0.971681374885, 0.00569624513678) (0.0188249871501, 0.97603269768) 
1 (1.0, 0.0) (1.0, 0.0) (0.713010395675, 0.176397305541) (0.971681374885, 0.00569624513678) (0.0188249871501, 0.97603269768) 
2 (0.713010395675, 0.176397305541) (0.713010395675, 0.176397305541) (1.0, 0.0) (0.549623945218, 0.337230071385) (-0.280514871109, 0.647578381153) 
3 (0.971681374885, 0.00569624513678) (0.971681374885, 0.00569624513678) (0.549623945218, 0.337230071385) (1.0, 0.0) (0.176622737448, 0.77629170593) 
4 (0.0188249871501, 0.97603269768) (0.0188249871501, 0.97603269768) (-0.280514871109, 0.647578381153) (0.176622737448, 0.77629170593)  (1.0, 0.0) 

आप इस विधि के साथ speedup जब dat बड़ी है दिख रहा है, लेकिन यह अभी भी तत्व के लिहाज से संचालन की वजह से बहुत धीमी है।

np.random.seed(10) 
dat = pd.DataFrame(np.random.randn(100, 100)) 

%%timeit 
dat.corr().applymap(Pearson) 

10 loops, best of 3: 118 ms per loop 

%%timeit 
stats = dict() 

for l in combinations(dat.index.tolist(),2): 
    stats[l] = pearsonr(dat.loc[l[0],:], dat.loc[l[1],:]) 

1 loops, best of 3: 1.56 s per loop 
संबंधित मुद्दे