pandas 0.23 - 34. Extending Pandas

पंडों का विस्तार




pandas

पंडों का विस्तार

जबकि पांडा तरीकों, कंटेनरों और डेटा प्रकारों का एक समृद्ध सेट प्रदान करते हैं, आपकी आवश्यकताओं को पूरी तरह से संतुष्ट नहीं किया जा सकता है। पंडों ने पंडों के विस्तार के लिए कुछ विकल्प प्रदान किए।

कस्टम एक्सेसर्स रजिस्टर करना

लाइब्रेरी डेकोरेटर pandas.api.extensions.register_dataframe_accessor() , pandas.api.extensions.register_series_accessor() , और pandas.api.extensions.register_index_accessor() , अतिरिक्त "नामस्थान" जोड़ने के लिए उपयोग कर सकते हैं। ये सभी एक समान सम्मेलन का पालन करते हैं: आप एक वर्ग को सजाते हैं, जो जोड़ने के लिए विशेषता का नाम प्रदान करते हैं। कक्षा के __init__ विधि से वस्तु को सजाया जाता है। उदाहरण के लिए:

@pd.api.extensions.register_dataframe_accessor("geo")
class GeoAccessor(object):
    def __init__(self, pandas_obj):
        self._obj = pandas_obj

    @property
    def center(self):
        # return the geographic center point of this DataFrame
        lat = self._obj.latitude
        lon = self._obj.longitude
        return (float(lon.mean()), float(lat.mean()))

    def plot(self):
        # plot this array's data on a map, e.g., using Cartopy
        pass

अब उपयोगकर्ता geo नाम स्थान का उपयोग करके आपके तरीकों तक पहुँच सकते हैं:

>>> ds = pd.DataFrame({'longitude': np.linspace(0, 10),
...                    'latitude': np.linspace(0, 20)})
>>> ds.geo.center
(5.0, 10.0)
>>> ds.geo.plot()
# plots data on a map

यह पंडों की वस्तुओं को बिना उपशमन किए विस्तारित करने का एक सुविधाजनक तरीका हो सकता है। यदि आप एक कस्टम एक्सेसर लिखते हैं, तो हमारे पांडा इकोसिस्टम पेज में इसे जोड़ने के लिए एक पुल अनुरोध करें।

एक्सटेंशन के प्रकार

संस्करण में नया 0.23.0।

चेतावनी

pandas.api.extension.ExtensionDtype और pandas.api.extension.ExtensionArray API नए और प्रयोगात्मक हैं। वे चेतावनी के बिना संस्करणों के बीच बदल सकते हैं।

पंडों ने डेटा प्रकारों और सरणियों को लागू करने के लिए एक इंटरफ़ेस को परिभाषित किया है जो कि NumPy के प्रकार प्रणाली का विस्तार करते हैं । पंडों ने ही कुछ प्रकारों के लिए विस्तार प्रणाली का उपयोग किया है जो कि NumPy (श्रेणीबद्ध, अवधि, अंतराल, सीज़ोन के साथ डेटाटाइम) में निर्मित नहीं हैं।

पुस्तकालय एक कस्टम सरणी और डेटा प्रकार को परिभाषित कर सकते हैं। जब पांडा इन वस्तुओं का सामना करते हैं, तो उन्हें ठीक से संभाला जाएगा (अर्थात वस्तुओं के एक खंड में परिवर्तित नहीं)। pandas.isna() जैसे कई तरीके विस्तार प्रकार के कार्यान्वयन के लिए भेज देंगे।

यदि आप एक पुस्तकालय का निर्माण कर रहे हैं जो इंटरफ़ेस को लागू करता है, तो कृपया इसे एक्सटेंशन डेटा प्रकारों पर प्रचारित करें

इंटरफ़ेस दो वर्गों के होते हैं।

ExtensionDtype

एक pandas.api.extension.ExtensionDtype एक numpy.dtype ऑब्जेक्ट के समान है। यह डेटा प्रकार का वर्णन करता है। कार्यान्वयन कुछ विशिष्ट वस्तुओं जैसे नाम के लिए जिम्मेदार हैं।

एक विशेष रूप से महत्वपूर्ण वस्तु type संपत्ति है। यह वह वर्ग होना चाहिए जो आपके डेटा के लिए अदिश प्रकार है। उदाहरण के लिए, यदि आप IP पता डेटा के लिए एक एक्सटेंशन सरणी लिख रहे थे, तो यह ipaddress.IPv4Address हो सकता है।

इंटरफ़ेस परिभाषा के लिए एक्सटेंशन dtype स्रोत देखें।

ExtensionArray

यह वर्ग सभी प्रकार की कार्यक्षमता प्रदान करता है। ExtensionArrays 1 आयाम तक सीमित हैं। एक ExtensionArray एक ExtensionDtype से dtype विशेषता के माध्यम से जुड़ा हुआ है।

पंडों ने इस पर कोई प्रतिबंध नहीं लगाया है कि कैसे एक एक्सटेंशन सरणी अपने __new__ या __init__ के माध्यम से बनाई गई है, और आप अपने डेटा को कैसे संग्रहीत करते हैं, इस पर कोई प्रतिबंध नहीं लगाता है। हमें इसकी आवश्यकता है कि आपका सरणी एक NumPy सरणी में परिवर्तनीय हो, भले ही यह अपेक्षाकृत महंगा हो (जैसा कि यह Categorical )।

वे कोई भी, एक या कई NumPy सरणियों द्वारा समर्थित हो सकते हैं। उदाहरण के लिए, pandas.Categorical दो एरे द्वारा समर्थित एक्सटेंशन सरणी है, एक कोड के लिए और एक श्रेणियों के लिए। IPv6 पतों की एक सरणी दो क्षेत्रों के साथ एक NumPy संरचित सरणी द्वारा समर्थित हो सकती है, एक निचले 64 बिट्स के लिए और एक ऊपरी 64 बिट्स के लिए। या वे कुछ अन्य भंडारण प्रकारों द्वारा समर्थित हो सकते हैं, जैसे पायथन सूची।

इंटरफ़ेस परिभाषा के लिए एक्सटेंशन सरणी स्रोत देखें। डॉकस्ट्रिंग्स और टिप्पणियों में इंटरफ़ेस को ठीक से लागू करने के लिए मार्गदर्शन होता है।

हम यह सुनिश्चित करने के लिए एक परीक्षण सूट प्रदान करते हैं कि आपके एक्सटेंशन सरणियों ने अपेक्षित व्यवहार को संतुष्ट किया है। परीक्षण सूट का उपयोग करने के लिए, आपको कई पाइस्टेस्ट जुड़नार प्रदान करने होंगे और आधार परीक्षण वर्ग से प्राप्त करना होगा। आवश्यक जुड़नार https://github.com/pandas-dev/pandas/blob/master/pandas/tests/extension/conftest.py में पाए जाते हैं।

परीक्षण का उपयोग करने के लिए, इसे उप-वर्ग करें:

from pandas.tests.extension import base

class TestConstructors(base.BaseConstructorsTests):
    pass

उपलब्ध सभी परीक्षणों की सूची के लिए https://github.com/pandas-dev/pandas/blob/master/pandas/tests/extension/base/__init__.py देखें।

उपसंस्कृति पांडा डेटा संरचनाएं

चेतावनी

pandas डेटा संरचनाओं को उप-करने पर विचार करने से पहले कुछ आसान विकल्प हैं।

  1. pipe साथ एक्स्टेंसिबल विधि चेन
  2. रचना का उपयोग करें। here देखें
  3. पहुँच दर्ज करके
  4. विस्तार प्रकार द्वारा विस्तार

यह खंड बताता है कि अधिक विशिष्ट आवश्यकताओं को पूरा करने के लिए pandas डेटा संरचनाओं को कैसे उपवर्गित किया जाए। दो बिंदु हैं जिन पर ध्यान देने की आवश्यकता है:

  1. निर्माता गुणों को ओवरराइड करें।
  2. मूल गुणों को परिभाषित करें

ध्यान दें

आप geopandas परियोजना में एक अच्छा उदाहरण पा सकते हैं।

ओवरराइड कंस्ट्रक्टर गुण

प्रत्येक डेटा संरचना में एक ऑपरेशन के परिणामस्वरूप एक नया डेटा संरचना वापस करने के लिए कई निर्माता गुण होते हैं । इन गुणों को ओवरराइड करके, आप pandas डेटा जोड़तोड़ के माध्यम से उपवर्गों को बनाए रख सकते हैं।

परिभाषित करने के लिए 3 निर्माण गुण हैं:

  • _constructor : जब हेरफेर परिणाम मूल के रूप में एक ही dimesions है उपयोग किया जाता है।
  • _constructor_sliced : जब हेरफेर परिणाम में मूल के रूप में एक कम आयाम (जैसे) होते हैं, जैसे कि DataFrame सिंगल कॉलम स्लाइसिंग।
  • _constructor_expanddim : जब हेरफेर के परिणाम में मूल रूप में एक उच्च आयाम होता है, जैसे कि Series.to_frame() और DataFrame.to_panel()

निम्न तालिका से पता चलता है कि pandas डेटा संरचनाएं डिफ़ॉल्ट रूप से निर्माण गुणों को कैसे परिभाषित करती हैं।

संपत्ति गुण Series DataFrame
_constructor Series DataFrame
_constructor_sliced NotImplementedError Series
_constructor_expanddim DataFrame Panel

नीचे दिए गए उदाहरण से पता चलता है कि SubclassedSeries और SubclassedDataFrame को परिभाषित कैसे करें निर्माणकर्ता संपत्तियों की ओवरराइडिंग।

class SubclassedSeries(Series):

    @property
    def _constructor(self):
        return SubclassedSeries

    @property
    def _constructor_expanddim(self):
        return SubclassedDataFrame

class SubclassedDataFrame(DataFrame):

    @property
    def _constructor(self):
        return SubclassedDataFrame

    @property
    def _constructor_sliced(self):
        return SubclassedSeries
>>> s = SubclassedSeries([1, 2, 3])
>>> type(s)
<class '__main__.SubclassedSeries'>

>>> to_framed = s.to_frame()
>>> type(to_framed)
<class '__main__.SubclassedDataFrame'>

>>> df = SubclassedDataFrame({'A', [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
>>> df
   A  B  C
0  1  4  7
1  2  5  8
2  3  6  9

>>> type(df)
<class '__main__.SubclassedDataFrame'>

>>> sliced1 = df[['A', 'B']]
>>> sliced1
   A  B
0  1  4
1  2  5
2  3  6
>>> type(sliced1)
<class '__main__.SubclassedDataFrame'>

>>> sliced2 = df['A']
>>> sliced2
0    1
1    2
2    3
Name: A, dtype: int64
>>> type(sliced2)
<class '__main__.SubclassedSeries'>

मूल गुणों को परिभाषित करें

मूल डेटा संरचनाओं में अतिरिक्त गुण होने देने के लिए, आपको pandas यह बताना चाहिए कि क्या गुण जोड़े गए हैं। pandas __getattribute__ ओवरराइड करने वाले डेटा नामों के लिए अज्ञात गुणों का मानचित्रण किया है। मूल गुणों को परिभाषित करना 2 तरीकों में से एक में किया जा सकता है:

  1. अस्थायी गुणों के लिए _internal_names और _internal_names_set परिभाषित करें _internal_names हेरफेर परिणामों के लिए पारित नहीं किया जाएगा।
  2. सामान्य गुणों के लिए _metadata परिभाषित करें जो हेरफेर परिणामों को पारित किया जाएगा।

नीचे दो मूल गुणों को परिभाषित करने के लिए एक उदाहरण है, एक आंतरिक संपत्ति के रूप में "internal_cache" और एक सामान्य संपत्ति के रूप में "add_property"

class SubclassedDataFrame2(DataFrame):

    # temporary properties
    _internal_names = pd.DataFrame._internal_names + ['internal_cache']
    _internal_names_set = set(_internal_names)

    # normal properties
    _metadata = ['added_property']

    @property
    def _constructor(self):
        return SubclassedDataFrame2
>>> df = SubclassedDataFrame2({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
>>> df
   A  B  C
0  1  4  7
1  2  5  8
2  3  6  9

>>> df.internal_cache = 'cached'
>>> df.added_property = 'property'

>>> df.internal_cache
cached
>>> df.added_property
property

# properties defined in _internal_names is reset after manipulation
>>> df[['A', 'B']].internal_cache
AttributeError: 'SubclassedDataFrame2' object has no attribute 'internal_cache'

# properties defined in _metadata are retained
>>> df[['A', 'B']].added_property
property