2013-08-14 23 views
6

adlı df adı verilen varsayalım. df sütunları farklı kişileri temsil eder ve indeks ekseni zamanı temsil eder, bu nedenle (i, j) girişi, zaman periyodu için bireysel j gözlemidir ve tüm verilerin NaN değerleriyle muhtemelen float tipi olduğunu varsayabiliriz.Python Pandalar korelasyon matrisi girdileri için ortak gözlem sayılarını görmenin hızlı yolu

Benim durumumda, yaklaşık 14.000 sütun ve birkaç yüz satırım var.

pandas.corr 14,000 - 14000 arasındaki korelasyon matrisini bana geri verecek ve zaman performansı benim uygulamam için iyi.

Ayrıca bilmek istiyorum, her bir çift için (j_1, j_2), kaç tane null olmayan gözlem korelasyon hesaplamasına girdi, bu yüzden zayıf veri kapsamından muzdarip olan korelasyon hücrelerini izole edebilirim. Bunun

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) 

bellek ayak izi ve hız biraz sorunlu olmaya başlar:

Ben ile gelip başardık iyi

şudur.

pandas ile ortak gözlemlere ulaşmanın daha hızlı bir yolu var mı?

+2

; doğrudan cevap vermez ama size bir 'yeterince iyi' verebilir – Jeff

+0

cevap Bu harika bir öneri, ancak Pandas sürüm 0.8.0 gerektiren bir üretim sisteminde çalışıyorum ve 'min_periods' daha yeni bir sürümde eklenmiş gibi görünüyor. – ely

+0

Eğer * linux (oldukça kolay) ..... sadece bir çift satır değişikliği (eğer 'üretim' belki de bunu engelleyebilir ....) eğer kodu (ve yeniden derlemek) ekleyebilirsiniz * – Jeff

cevap

3

Bunu yapabilirsiniz, ancak stelonize etmek gerekir (aksi halde çok daha yavaş); Ancak bellek ayak izi iyi olmalıdır Aslında sadece kadar tekrarlayarak biraz daha hızlı Jeff'in cevap @ yapabilirsiniz

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

((bu nan gözlem sayısını verir, senin geçerli gözlem sayısını, ancak kolayca çevrilebilen verir) iç içe döngü içinde i + 1 dahil değildir ve korelasyon simetrik olduğundan aynı anda değerler atayabilirsiniz. mask[i] erişimini, iç içe geçmiş döngünün dışına taşıyabilirsiniz; bu, küçük bir optimizasyondur, ancak çok büyük kareler için bazı performans artışları sağlayabilir.

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) 
kısmen (örn onun size gözlemler en az sayıda gerektirir bir kesim Düzeltici için `` min_periods`` geçirerek bu çözebilir