Aşağıdaki pandas veri çerçevesine sahibim Top15
:
Kişi başına düşen alıntılanabilir belge sayısını tahmin eden bir sütun oluşturuyorum:
Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']
Kişi başına düşen atıfta bulunulan belge sayısı ile kişi başına düşen enerji arzı arasındaki korelasyonu bilmek istiyorum. Bu yüzden .corr()
yöntemini (Pearson's korelasyonu) kullanıyorum:
data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')
Tek bir sayı döndürmek istiyorum, ancak sonuç
Gerçek veriler olmadan soruyu yanıtlamak zor ama sanırım böyle bir şey arıyorsunuz:
Top15['Citable docs per Capita'].corr(Top15['Energy Supply per Capita'])
İki sütununuz arasındaki korelasyonu hesaplar 'Kişi Başına Yararlanılabilir Dokümanlar'
ve 'Kişi Başına Enerji Arzı'
.
Bir örnek vermek gerekirse:
import pandas as pd
df = pd.DataFrame({'A': range(4), 'B': [2*i for i in range(4)]})
A B
0 0 0
1 1 2
2 2 4
3 3 6
O zaman
df['A'].corr(df['B'])
beklendiği gibi 1
verir.
Şimdi, bir değeri değiştirirseniz, örn.
df.loc[2, 'B'] = 4.5
A B
0 0 0.0
1 1 2.0
2 2 4.5
3 3 6.0
komut
df['A'].corr(df['B'])
geri döner
0.99586
Bu da beklendiği gibi hala 1'e yakın.
Doğrudan veri çerçevenize .corr' uygularsanız, [sütunlarınız arasındaki tüm çift yönlü korelasyonları döndürür](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.corr.html); bu nedenle matrisinizin köşegeninde
1'ler' gözlemlersiniz (her sütun kendisiyle mükemmel bir şekilde ilişkilidir).
df.corr()
bu nedenle dönecektir
A B
A 1.000000 0.995862
B 0.995862 1.000000
Gösterdiğiniz grafikte, korelasyon matrisinin yalnızca sol üst köşesi temsil ediliyor (sanırım).
Çözümünüzde NaN
elde ettiğiniz durumlar olabilir - bir örnek için bu gönderiyi kontrol edin.
Belirli bir eşiğin üzerindeki/altındaki girişleri filtrelemek istiyorsanız, bu soruyu işaretleyebilirsiniz. Korelasyon katsayılarının bir ısı haritasını çizmek istiyorsanız, bu yanıtı kontrol edebilir ve daha sonra üst üste binen eksen etiketleri ile ilgili sorunla karşılaşırsanız aşağıdaki gönderiyi kontrol edebilirsiniz.
Ben de aynı sorunla karşılaştım.
Görünüşe göre Kişi Başına Yazılabilir Belgeler
bir floattı ve python varsayılan olarak bunu bir şekilde atlıyordu. Veri çerçevemin diğer tüm sütunları numpy biçimlerindeydi, bu yüzden sütunu np.float64
e dönüştürerek çözdüm.
Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])
Bunun tam olarak kendi hesapladığınız sütun olduğunu unutmayın
Tüm sütun çiftleri arasındaki korelasyonları istiyorsanız, şöyle bir şey yapabilirsiniz:
import pandas as pd
import numpy as np
def get_corrs(df):
col_correlations = df.corr()
col_correlations.loc[:, :] = np.tril(col_correlations, k=-1)
cor_pairs = col_correlations.stack()
return cor_pairs.to_dict()
my_corrs = get_corrs(df)
# and the following line to retrieve the single correlation
print(my_corrs[('Citable docs per Capita','Energy Supply per Capita')])