2013-08-14 6 views
6

मान लीजिए कि मेरे पास pandas.DataFramedf है। df के कॉलम अलग-अलग व्यक्तियों का प्रतिनिधित्व करते हैं और इंडेक्स अक्ष समय का प्रतिनिधित्व करता है, इसलिए (i, j) प्रविष्टि समय अवधि के लिए व्यक्तिगत जे का अवलोकन है, और हम मान सकते हैं कि सभी डेटा float संभवतः NaN मानों के साथ टाइप कर सकते हैं।पाइथन पांडस सहसंबंध मैट्रिक्स प्रविष्टियों के लिए सामान्य अवलोकन गणना देखने का तेज़ तरीका

मेरे मामले में, मेरे पास लगभग 14,000 कॉलम और कुछ सौ पंक्तियां हैं।

pandas.corr मुझे 14,000-बाय -14,000 सहसंबंध मैट्रिक्स वापस दे देगा और यह मेरे आवेदन के लिए समय का प्रदर्शन ठीक है।

लेकिन मैं यह भी जानना चाहूंगा कि प्रत्येक व्यक्ति की जोड़ी (j_1, j_2) के लिए, कितने गैर-शून्य अवलोकन सहसंबंध गणना में चला गया, इसलिए मैं खराब डेटा कवरेज से पीड़ित सहसंबंध कक्षों को अलग कर सकता हूं।

not_null_locations = pandas.notnull(df).values.astype(int) 
common_obs = pandas.DataFrame(not_null_locations.T.dot(not_null_locations), 
           columns=df.columns, index=df.columns) 

स्मृति पदचिह्न और इस की गति एक सा समस्याग्रस्त किया जा करने के लिए शुरू:

सबसे अच्छा मैं के साथ आने कर लिया है निम्नलिखित है।

pandas के साथ सामान्य अवलोकनों को प्राप्त करने का कोई तेज़ तरीका है?

+2

आप आंशिक रूप से (उदाहरण के लिए अपने एक कटऑफ जहां की आवश्यकता है कि टिप्पणियों की न्यूनतम संख्या corr के लिए गुजर '' min_periods'' द्वारा इस का समाधान कर सकते हैं, सीधे जवाब नहीं देता, लेकिन आप एक 'काफी अच्छा' दे सकते हैं का जवाब – Jeff

+0

यह एक अच्छा सुझाव है, लेकिन मैं एक ऐसे उत्पादन प्रणाली में काम कर रहा हूं जिसके लिए पांडस संस्करण 0.8.0 की आवश्यकता है, और ऐसा लगता है कि 'min_periods' को एक नए संस्करण में जोड़ा गया था। मैं पुराने संस्करण के बारे में कुछ नहीं कर सकता, मैं हूं डर। – ely

+0

यदि आप linux (जहां बहुत आसान) पर कोड * (और recompile) में * जोड़ सकते हैं ..... यह केवल कुछ पंक्ति परिवर्तन (निश्चित रूप से 'उत्पादन' शायद इसे रोक सकता है ....) – Jeff

उत्तर

3

आप यह कर सकते हैं, लेकिन साइथोनिज़ (अन्यथा बहुत धीमी) की आवश्यकता होगी; तथापि स्मृति पदचिह्न बेहतर होना चाहिए

l = len(df.columns) 
results = np.zeros((l,l)) 
mask = pd.isnull(df) 
for i, ac in enumerate(df): 
    for j, bc in enumerate(df): 
      results[j,i] = (mask[i] & mask[j]).sum() 
results = DataFrame(results,index=df.columns,columns=df.columns) 
3

आप वास्तव में केवल करने के लिए पुनरावृत्ति द्वारा एक छोटे से तेजी से @ जेफ के जवाब कर सकते हैं ((इस नेन टिप्पणियों की संख्या देता है, अपने वैध टिप्पणियों की संख्या, लेकिन आसानी से परिवर्तनीय देता है) लेकिन शामिल नहीं) i + 1 नेस्टेड लूप में, और क्योंकि सहसंबंध सममित है आप एक ही समय में मान असाइन कर सकते हैं। आप नेस्टेड लूप के बाहर mask[i] पहुंच को भी स्थानांतरित कर सकते हैं, जो एक छोटा ऑप्टिमाइज़ेशन है लेकिन बहुत बड़े फ्रेम के लिए कुछ प्रदर्शन लाभ प्राप्त कर सकता है।

l = len(df.columns) 
results = np.zeros((l,l)) 
mask = pd.isnull(df) 
for i in range(l): 
    maski = mask[i] 
    for j in range(i + 1): 
      results[i,j] = results[j,i] = (maski & mask[j]).sum() 
results = DataFrame(results,index=df.columns,columns=df.columns) 
संबंधित मुद्दे