पदावनत low_memory विकल्प
low_memory
विकल्प ठीक से पदावनत नहीं है, लेकिन यह, होना चाहिए, क्योंकि यह वास्तव में कुछ अलग नहीं है [ स्रोत ]
इस low_memory
चेतावनी को प्राप्त करने का कारण यह है क्योंकि प्रत्येक कॉलम के लिए dtypes का अनुमान लगाना बहुत स्मृति की मांग है। पंडों ने यह निर्धारित करने की कोशिश की कि प्रत्येक कॉलम में डेटा का विश्लेषण करके क्या सेट किया जाए।
प्रतिरूप अनुमान (बहुत बुरा)
पांड केवल यह निर्धारित कर सकते हैं कि पूरी फ़ाइल पढ़ने के बाद एक कॉलम में क्या होना चाहिए। इसका मतलब यह है कि पूरी फ़ाइल पढ़ने से पहले वास्तव में कुछ भी पार्स नहीं किया जा सकता है जब तक कि अंतिम मूल्य को पढ़ने पर आपको उस कॉलम के dtype को बदलने का जोखिम न हो।
एक फ़ाइल के उदाहरण पर विचार करें, जिसमें user_id नामक एक कॉलम है। इसमें 10 मिलियन पंक्तियाँ होती हैं जहाँ user_id हमेशा संख्याएँ होती हैं। चूंकि पांडा यह नहीं जान सकते हैं कि यह केवल संख्या है, यह संभवतः इसे मूल तार के रूप में रखेगा जब तक कि यह पूरी फाइल को नहीं पढ़ ले।
निर्दिष्ट dtypes (हमेशा किया जाना चाहिए)
जोड़ने
dtype={'user_id': int}
करने के लिए pd.read_csv()
कॉल पांडा पता कर देगा जब यह फ़ाइल को पढ़ने शुरू होता है, कि यह केवल पूर्णांकों है।
यह भी ध्यान देने योग्य है कि यदि फ़ाइल में अंतिम पंक्ति कॉलम "foobar"
में लिखी गई user_id
होगी, तो उपरोक्त dtype निर्दिष्ट होने पर लोडिंग क्रैश हो जाएगी।
टूटे हुए डेटा का उदाहरण जो dtypes परिभाषित होने पर टूट जाता है
import pandas as pd
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
csvdata = """user_id,username
1,Alice
3,Bob
foobar,Caesar"""
sio = StringIO(csvdata)
pd.read_csv(sio, dtype={"user_id": int, "username": "string"})
ValueError: invalid literal for long() with base 10: 'foobar'
dtypes आम तौर पर एक ख़ास बात है, उनके बारे में यहाँ और अधिक पढ़ें:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html
क्या dtypes मौजूद है?
हमारे पास अफीम dtypes तक पहुंच है: फ्लोट, इंट, बूल, टाइमडेल्ट 64 [एनएस] और डेटाटाइम 64 [एनएस]। ध्यान दें कि संख्यात्मक तिथि / समय dtypes समय क्षेत्र के बारे में जानते नहीं हैं ।
पंडों ने खुद के साथ dtypes के इस सेट का विस्तार किया:
'datetime64 [ns,]' जो टाइम ज़ोन जागरूक टाइमस्टैम्प है।
'श्रेणी' जो अनिवार्य रूप से एक एनम है (बचत करने के लिए पूर्णांक कुंजी द्वारा दर्शाए गए तार
'अवधि []' एक समयसीमा के साथ भ्रमित नहीं होने के लिए, इन वस्तुओं को वास्तव में विशिष्ट समय अवधि के लिए लंगर डाला जाता है
'स्पार्स', 'स्पार्स [int]', 'स्पार्स [फ्लोट]' विरल डेटा के लिए है या 'डेटा जिसमें इसमें बहुत सारे छेद हैं' NaN को बचाने के बजाय या कोई भी डेटाफ़्रेम में ऑब्जेक्ट्स को छोड़ता नहीं है, अंतरिक्ष की बचत करता है ।
'अंतराल' स्वयं का एक विषय है लेकिन इसका मुख्य उपयोग अनुक्रमण के लिए है। यहाँ और देखें
'Int8', 'Int16', 'Int32', 'Int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64' ये सभी पांडा विशिष्ट पूर्णांक हैं, जो सुप्त संस्करण के विपरीत, अशक्त हैं।
'स्ट्रिंग' स्ट्रिंग डेटा के साथ काम करने के लिए एक विशिष्ट dtype है और .str
श्रृंखला पर विशेषता तक पहुंच प्रदान करता है ।
'बूलियन' सुन्न 'बूल' की तरह है, लेकिन यह लापता डेटा का भी समर्थन करता है।
पूरा संदर्भ यहां पढ़ें:
पंडों dtype संदर्भ
गोच, कैविएट, नोट्स
सेटिंग dtype=object
उपरोक्त चेतावनी को चुप करा देगी, लेकिन यह अधिक मेमोरी कुशल नहीं बनाएगी, केवल यदि कुछ भी हो तो प्रक्रिया को कुशल बनाएं।
सेटिंग dtype=unicode
कुछ नहीं करेंगे, numpy के बाद से, एक unicode
के रूप में प्रस्तुत किया जाता है object
।
कन्वर्टर्स का उपयोग
@ स्पर सही 'foobar'
रूप में निर्दिष्ट कॉलम में मुठभेड़ करते समय उड़ने वाले पांडा से बचने के लिए कन्वर्टर्स के उपयोग को सही ढंग से इंगित करता है int
। मैं यह जोड़ना चाहूंगा कि कन्वर्टर्स वास्तव में भारी और पांडा में उपयोग करने के लिए अक्षम हैं और उन्हें अंतिम उपाय के रूप में उपयोग किया जाना चाहिए। ऐसा इसलिए है क्योंकि read_csv प्रक्रिया एक एकल प्रक्रिया है।
CSV फ़ाइलों को लाइन द्वारा लाइन में संसाधित किया जा सकता है और इस तरह से कई कन्वर्टर्स द्वारा समानांतर रूप से अधिक कुशलता से संसाधित किया जा सकता है फ़ाइल को खंडों में काटकर और कई प्रक्रियाओं को चलाकर, कुछ ऐसा जो पांडा का समर्थन नहीं करता है। लेकिन यह एक अलग कहानी है।