2016-12-18 11 views
11

के साथ दशमलव संख्या/डेटा का उपयोग करके सहसंबंध की जांच कैसे करूं आपके समय के लिए धन्यवाद।मैं पाइथन 3

मैं कुछ कोड लिख रहा हूं जो डेटा के कई सेटों के बीच सहसंबंध की जांच कर रहा है। यह बहुत अच्छा काम करता है जब मैं मूल डेटा का उपयोग कर रहा हूं (जिसे मैं ईमानदारी से उस प्रारूप में किस प्रारूप में अनिश्चित करता हूं), लेकिन जब मैं दशमलव मॉड्यूल का उपयोग करके कुछ समीकरणों के माध्यम से डेटा चलाता हूं, तो डेटा सेट परीक्षण के दौरान दिखाई नहीं देगा सहसंबंध के लिए।

मुझे वास्तव में बेवकूफ और नया लॉल लगता है, मुझे यकीन है कि यह एक बहुत ही आसान फिक्स है।

यहां एक छोटा सा कार्यक्रम है जिसे मैंने लिखा है कि मेरा क्या मतलब है।

from decimal import Decimal 
import numpy as np 
import pandas as pd 

a = [Decimal(2.3), Decimal(1.5), Decimal(5.7), Decimal(4.6), Decimal(5.5), Decimal(1.5)] 
b = [Decimal(2.1), Decimal(1.2), Decimal(5.3), Decimal(4.4), Decimal(5.3), Decimal(1.7)] 

h = [2.3,1.5,5.7,4.6,5.5,1.5] 
j = [2.1,1.2,5.3,4.4,5.3,1.7] 

corr_data1 = pd.DataFrame({'A': a, 'B': b}) 

corr_data2 = corr_data1.corr() 
print(corr_data2) 

corr_data3 = pd.DataFrame({'H': h, 'J': j}) 

corr_data4 = corr_data3.corr() 
print(corr_data4) 

दोनों सूचियों एक & बी के लिए डेटा के साथ ही एच & एफ वास्तव में, एक ही हैं एक & बी दशमलव जा रहा से स्वरूपित संख्याओं का फर्क सिर्फ इतना है, जहां के रूप में एच & एफ नहीं हैं के साथ।

जब कार्यक्रम चलाया जाता है, एक & बी रिटर्न:

Empty DataFrame 
Columns: [] 
Index: [] 

और एच & जम्मू रिटर्न:

  H   J 
H 1.000000 0.995657 
J 0.995657 1.000000 

मैं कैसे कर सकता हूँ यह तो मैं डेटा मैं करने के बाद उपयोग कर सकते हैं यह मेरे समीकरणों के माध्यम से भाग गया?

बेवकूफ सवाल के लिए खेद है और आपके समय के लिए धन्यवाद। मुझे आशा है कि आप सभी अच्छी तरह से, छुट्टियों की छुट्टियां हैं!

+1

असल में सब पहले से बाहर उपयोगकर्ताओं द्वारा पूछे जाने वाले प्रश्न जिनसे मैंने समीक्षा की है कि आपके पास सबसे अधिक उदाहरण कोड के साथ सबसे अच्छे लिखित लोगों में से एक है। एक अच्छी तरह से कामकाजी सवाल के लिए प्रॉप्स। –

+0

मुझे नहीं लगता कि numpy या pandas इस तरह के दशमलव प्रकार का समर्थन करता है। पांडो आपके सरणी को वस्तुओं की एक सरणी के रूप में पेश कर रहा है। यदि आप पांडा को उन नंबरों के रूप में इलाज करना चाहते हैं, तो मुझे लगता है कि आपको फ्लोट में कनवर्ट करने की आवश्यकता होगी। – BrenBarn

+0

आपकी 'दशमलव' ऑब्जेक्ट्स की सूची 'ऑब्जेक्ट' प्रकार 'डेटाफ्रेम' या 'numpy' सरणी' में बदल दी जाएगी। 'Corr_data1.dtypes'। कुछ गणित संचालन ऑब्जेक्ट सरणी पर काम करते हैं, लेकिन यह हिट और मिस है। 'कोर' उन यादों में से एक है। 'corr.data1._get_numeric_data() 'खाली आता है। – hpaulj

उत्तर

4

पांडा डेटा को संख्यात्मक मानों के रूप में नहीं पहचानता है। यहां बताया गया है कि अपने डेटा को फ्लोट में कैसे परिवर्तित करें।

corr_data1.astype(float).corr() 

#   A   B 
# A 1.000000 0.995657 
# B 0.995657 1.000000 

यह भी काम करना चाहिए लेकिन यह वास्तव में नहीं करता है।

pd.to_numeric(corr_data1['A'], errors='coerce') 

# 0 NaN 
# 1 NaN 
# 2 NaN 
# 3 NaN 
# 4 NaN 
# 5 NaN 
3

पांडों के पास दशमलव प्रकार के लिए कोई विशेष समर्थन नहीं है, इसलिए यह "ऑब्जेक्ट" प्रकार के रूप में व्यवहार करता है। इसका अर्थ है कि .corr जैसे विधियां जो केवल संख्यात्मक कॉलम पर काम करती हैं, दशमलव-मूल्यवान कॉलम को संख्यात्मक मानने पर विचार नहीं करेंगे। कई numpy और scipy फ़ंक्शंस भी दशमलव पर ठीक से काम नहीं करेंगे, क्योंकि दशमलव वस्तुओं को गणितीय परिचालन में सामान्य फ्लोट के साथ जोड़ा नहीं जा सकता है। (यह scipy.stats.pearsonr तरह लग रहा है काम नहीं करता है, लेकिन scipy.stats.spearmanr करता है।)

numpy/पांडा में सबसे संख्यात्मक संचालन के लिए, आप तैरता के लिए अपने डेटा बदलने की आवश्यकता होगी।

1

अन्य ललित जवाब के अलावा हुए बताया कि कैसे आप सहसंबंध के लिए चल बिन्दु मूल्यों की आवश्यकता होगी, Decimal मूल्यों में प्रवेश के लिए अपनी रणनीति बुरी तरह से टूट गया है।

a = [Decimal(2.3), Decimal(1.5), Decimal(5.7), Decimal(4.6), 
    Decimal(5.5), Decimal(1.5)] 

पैदावार:

[Decimal('2.29999999999999982236431605997495353221893310546875'), 
Decimal('1.5'), 
Decimal('5.70000000000000017763568394002504646778106689453125'), 
Decimal('4.5999999999999996447286321199499070644378662109375'), 
Decimal('5.5'), 
Decimal('1.5')] 

दुख की बात है कौन सा है, क्योंकि आप सब कि मुसीबत के पास गया सटीक दशमलव अभ्यावेदन दर्ज करने के लिए, अभी तक अजगर उन्हें float शाब्दिक रूप में ले लिया है, और बाइनरी की बदसूरत अस्पष्टता लगाया Decimal() कन्स्ट्रक्टर के सुरक्षित बंदरगाह तक पहुंचने से पहले उन पर फ़्लोटिंग पॉइंट। 1.5 जैसे कुछ भाग्यशाली मूल्यों के लिए, कोई समस्या नहीं है। float उन्हें स्पॉट-ऑन का प्रतिनिधित्व करता है। 2.3 जैसे अन्य लोगों के लिए, बुराई तेजी से उतरती है।

बजाय विचार करें:

a = [Decimal('2.3'), Decimal('1.5'), Decimal('5.7'), Decimal('4.6'), 
    Decimal('5.5'), Decimal('1.5')] 

या के बाद से है कि बोझल है:

a = [Decimal(x) for x in '2.3,1.5,5.7,4.6,5.5,1.5'.split(',')] 

या तो आप देता है साफ, सटीक दशमलव आप की तलाश:

[Decimal('2.3'), 
Decimal('1.5'), 
Decimal('5.7'), 
Decimal('4.6'), 
Decimal('5.5'), 
Decimal('1.5')]