2010-01-26 12 views
11

मेरे पास 100,000 x 40 पंक्तियों कॉलम के बारे में 100 सीएसवी फाइलें हैं। मैं इसके बारे में कुछ सांख्यिकीय विश्लेषण करना चाहता हूं, कुछ नमूना डेटा खींच सकता हूं, साजिश के सामान्य रुझानों को बदल सकता हूं, भिन्नता और आर-स्क्वायर विश्लेषण कर सकता हूं, और कुछ स्पेक्ट्रा आरेखों को साजिश कर सकता हूं। अभी के लिए, मैं विश्लेषण के लिए numpy पर विचार कर रहा हूँ।पायथन: सीएसवी फाइलों पर विश्लेषण 100,000 लाइनें x 40 कॉलम

मैं सोच रहा था कि ऐसी बड़ी फ़ाइलों के साथ मुझे किन मुद्दों की अपेक्षा करनी चाहिए? मैंने पहले से ही गलत डेटा की जांच की है। सांख्यिकीय विश्लेषण करने पर आपकी सिफारिशें क्या हैं? क्या यह बेहतर होगा अगर मैं सिर्फ फाइलों को विभाजित करता हूं और पूरी चीज एक्सेल में करता हूं?

+5

वे बहुत बड़ी फाइलें नहीं हैं। तुम क्यों पूछ रहे हो? क्या आपने वास्तव में यह देखने के लिए सरल पठन करने की कोशिश की है कि पाइथन कितनी तेजी से होगा? –

+4

जब तक आप पाइथन से शादी नहीं कर लेते हैं, तो आप एक समर्पित आंकड़े भाषा जैसे आर - देखें http://www.r-project.org का उपयोग कर बेहतर हो सकते हैं। –

+2

आमतौर पर टेबल और पंक्तियों के बारे में बात करते समय समानार्थी शब्द होते हैं। मुझे लगता है कि आपका मतलब 40 कॉलम है? –

उत्तर

12

मुझे पता चला है कि पाइथन + सीएसवी शायद कुछ प्रकार की सांख्यिकीय प्रक्रिया करने का सबसे तेज़ और सरल तरीका है।

हम अजीब डेटा त्रुटियों के लिए सुधार और सही करने की उचित मात्रा में हैं, इसलिए पाइथन हमारी सहायता करता है।

पायथन की कार्यात्मक प्रोग्रामिंग सुविधाओं की उपलब्धता यह विशेष रूप से सरल बनाती है। आप इस तरह के उपकरणों के साथ नमूना कर सकते हैं।

def someStatFunction(source): 
    for row in source: 
     ...some processing... 

def someFilterFunction(source): 
    for row in source: 
     if someFunction(row): 
      yield row 

# All rows 
with open("someFile", "rb") as source: 
    rdr = csv.reader(source) 
    someStatFunction(rdr) 

# Filtered by someFilterFunction applied to each row 
with open("someFile", "rb") as source: 
    rdr = csv.reader(source) 
    someStatFunction(someFilterFunction(rdr)) 

मुझे वास्तव में सरल कार्यों से अधिक जटिल कार्यों को लिखने में सक्षम होना पसंद है।

+0

जब डेटा को मालिश और फ़िल्टर करने की आवश्यकता होती है, जैसे @ एसएलॉट कहते हैं, यह पाइथन में ऐसा करने में सक्षम होना बहुत अच्छा है। यदि आप डेटा को सीधे आर फ़ंक्शन पर फ़ीड कर सकते हैं, तो अविश्वसनीय पैकेज मदद करेंगे। लेकिन अगर आपको पहले इसके साथ झुकाव करना है, तो पाइथन दा बम है। – telliott99

+0

आप loadtxt का भी उपयोग कर सकते हैं और स्वचालित रूप से numpy float arrays में कनवर्ट कर सकते हैं। – Navi

1

अजगर डाटा प्रोसेसिंग इस तरह के लिए बहुत अच्छा है, खासकर अगर अपने नमूनों "पंक्तियाँ" कर रहे हैं और आप इस तरह के प्रत्येक पंक्ति स्वतंत्र रूप से संसाधित कर सकते हैं:

row1 
row2 
row3 
etc. 

वास्तव में अपने कार्यक्रम बहुत छोटे स्मृति पदचिह्न हो सकता है, जनरेटर और जनरेटर अभिव्यक्तियों के लिए धन्यवाद, जिसके बारे में आप यहां पढ़ सकते हैं: http://www.dabeaz.com/generators/ (यह बुनियादी चीजें नहीं है लेकिन जेनरेटर के कुछ दिमागी-घुमावदार अनुप्रयोग हैं)।

एसएलॉट के उत्तर के संबंध में, शायद आप पंक्तियों के अनुक्रम पर फ़िल्टर() को लागू करना चाहते हैं - यदि आप इसे लंबे समय तक अनुक्रमित करते हैं तो यह आपके कंप्यूटर को विस्फोट कर सकता है (कोशिश करें: filter(None, itertools.count()) - आपके सभी डेटा को सहेजने के बाद :-))। यह कुछ इस तरह से filter को बदलने के लिए काफी बेहतर है:

def filter_generator(func, sequence): 
     for item in sequence: 
      if (func is None and item) or func(item): 
       yield item 

या कम:

filtered_sequence = (item for item in sequence if (func is None and item) or func(item)) 

यह आगे पाश से पहले हालत निकालने द्वारा अनुकूलित किया जा सकता है, लेकिन यह पाठक के लिए एक excersise है: -)

+1

... या बस itertools.ifilter का उपयोग करें :) –

+0

बूम, और मैं डूब रहा हूँ! आइए दिखाएं कि मैंने समझाया है कि ifilter कैसे काम करता है ;-) –

+0

धन्यवाद। मेरा जवाब तय किया। –

1

मुझे पाइथन और सीएसवी फ़ाइल पढ़ने और पीढ़ी का उपयोग करके बहुत सफलता मिली है। एक मामूली कोर 2 डुओ लैपटॉप का उपयोग करके मैं उसी डेटा के करीब स्टोर करने में सक्षम हूं और इसे कुछ मिनटों में स्मृति में संसाधित करता हूं। ऐसा करने में मेरी मुख्य सलाह है कि आप अपनी नौकरियों को विभाजित करें ताकि आप अलग-अलग चरणों में चीजें कर सकें क्योंकि एक बार में आपकी सभी नौकरियों को बैच करना दर्द हो सकता है जब आप केवल एक फीचर निष्पादित करना चाहते हैं। एक अच्छी लड़ाई लय के साथ आओ जो आपको जितना संभव हो सके अपने संसाधनों का लाभ लेने की अनुमति देता है।

एक्सेल डेटा के छोटे बैचों के लिए अच्छा है, लेकिन एक्सेल के लिए सामान्य रूप से आरक्षित ग्राफ और चार्ट करने के लिए matplotlib देखें।

1

सामान्य रूप से, आकार के बारे में ज्यादा चिंता न करें। यदि आपकी फाइल 2-3 के कारक से बड़ी हो जाती है, तो आप 32-बिट सिस्टम पर स्मृति से बाहर चलना शुरू कर सकते हैं। मुझे लगता है कि तालिका के प्रत्येक फ़ील्ड 100 बाइट्स है, यानी।, प्रत्येक पंक्ति 4000 बाइट्स है, आप स्मृति में डेटा को स्टोर करने के लिए लगभग 400 एमबी रैम का उपयोग करेंगे और यदि आप प्रोसेसिंग के लिए जितना अधिक जोड़ते हैं, तो आप अभी भी 800 या तो एमबी का उपयोग करेंगे। ये गणना लिफाफा और बेहद उदारता से बहुत पीछे हैं (यदि आप अपने डेटा में बहुत लंबे तार या भारी पूर्णांक हैं, तो आप केवल इस स्मृति का उपयोग करेंगे, क्योंकि मानक डेटाटाइप के लिए आप जितनी अधिकतम उपयोग करेंगे, वह 8 बाइट्स है फ्लोट या एक लंबा)।

यदि आप मेमोरी से बाहर निकलना शुरू करते हैं, तो 64-बिट जाने का तरीका हो सकता है। लेकिन इसके अलावा, पाइथन बड़ी मात्रा में डेटा को एपलबॉम्ब के साथ संभाल लेगा, खासकर जब numpy/scipy के साथ संयुक्त हो। नम्पी सरणी का उपयोग करना मूल सूचियों का उपयोग करने से लगभग हमेशा तेज होगा। Matplotlib सबसे साजिश की जरूरतों का ख्याल रखेगा और निश्चित रूप से आपके द्वारा वर्णित सरल भूखंडों को संभाल सकता है।

अंत में, यदि आपको ऐसा कुछ मिलता है जो पाइथन नहीं कर सकता है, लेकिन इसमें पहले से ही एक कोडबेस लिखा गया है, तो RPy पर एक नज़र डालें।

1

बड़े डेटासेट के लिए आपको ROOT में रुचि हो सकती है। इसका विश्लेषण डेटा के पेटबाइट्स का विश्लेषण और बहुत प्रभावी ढंग से स्टोर करने के लिए किया जा सकता है। यह कुछ बुनियादी और moreadvanced सांख्यिकी उपकरण के साथ भी आता है।

जबकि इसे सी ++ के साथ उपयोग करने के लिए लिखा गया है, वहां भी बहुत पूर्ण पायथन बाइंडिंग हैं। वे कच्चे डेटा तक सीधे पहुंच प्राप्त करना बेहद आसान नहीं बनाते हैं (उदाहरण के लिए उन्हें आर या numpy में उपयोग करने के लिए) - लेकिन यह निश्चित रूप से संभव है (मैं इसे हर समय करता हूं)।

संबंधित मुद्दे