2012-08-16 32 views
5

मैं एक Series का एक उपवर्ग के साथ अपने कोड में स्थानापन्न करने, एक dict का एक उपवर्ग एक पांडा डेटा संरचना का एक उपवर्ग बनाने के लिए कोशिश कर रहा हूँ, मुझे समझ नहीं आता क्यों इस उदाहरण कोड काम नहीं करतापांडा के ऑब्जेक्ट के सबक्लास अन्य ऑब्जेक्ट के उप-वर्ग से भिन्न रूप से काम करते हैं?

from pandas import Series  

class Support(Series): 
    def supportMethod1(self): 
     print 'I am support method 1'  
    def supportMethod2(self): 
     print 'I am support method 2' 

class Compute(object): 
    supp=None   
    def test(self): 
     self.supp() 

class Config(object): 
    supp=None   
    @classmethod 
    def initializeConfig(cls): 
     cls.supp=Support() 
    @classmethod 
    def setConfig1(cls): 
     Compute.supp=cls.supp.supportMethod1 
    @classmethod 
    def setConfig2(cls): 
     Compute.supp=cls.supp.supportMethod2    

Config.initializeConfig() 

Config.setConfig1()  
c1=Compute() 
c1.test() 

Config.setConfig2()  
c1.test() 

शायद यह कुछ वस्तुओं के विन्यास को बदलने के लिए सबसे अच्छा तरीका नहीं है, वैसे भी मैं अपने कोड में यह उपयोगी मिल गया है और सभी के अधिकांश मैं समझने के लिए क्यों dict बजाय श्रृंखला के साथ यह काम करता है चाहता हूँ जैसा कि मैं उम्मीद करता हूँ।

बहुत बहुत धन्यवाद!

उत्तर

10

वर्तमान उत्तर (पांडा> = 0,13)

पांडा 0.13 में

एक आंतरिक refactor काफी सरल उपवर्गीकरण। पांडा Series अब किसी अन्य अजगर वस्तु की तरह subclassed जा सकता है:

class MySeries(pd.Series): 
    def my_method(self): 
     return "my_method" 

विरासत उत्तर (पांडा < = 0,12)

समस्या यह है कि सीरीज __new__ जो यह सुनिश्चित किया जाता है कि एक श्रृंखला वस्तु instantiated है का उपयोग करता है।

तुम इतनी तरह अपने वर्ग को संशोधित कर सकते हैं:

class Support(pd.Series): 
    def __new__(cls, *args, **kwargs): 
     arr = Series.__new__(cls, *args, **kwargs) 
     return arr.view(Support) 

    def supportMethod1(self): 
     print 'I am support method 1'  
    def supportMethod2(self): 
     print 'I am support method 2' 

हालांकि, यह शायद एक है-एक एक के बजाय है-एक ऐसा करने के लिए सबसे अच्छा है। या बंदर श्रृंखला वस्तु को पैच करें। इसका कारण यह है कि आप डेटा भंडारण की प्रकृति के कारण पांडा का उपयोग करते समय अक्सर अपने उप-वर्ग को खो देंगे।

s.ix[:5] 
s.cumsum() 

आपके सबक्लास के बजाय एक श्रृंखला ऑब्जेक्ट लौटाएगा। आंतरिक रूप से, डेटा संगत सरणी में संग्रहीत किया जाता है और गति के लिए अनुकूलित किया जाता है। जब आवश्यक हो तो डेटा केवल कक्षा के साथ बॉक्स किया जाता है और उन वर्गों को हार्डकोड किया जाता है। इसके अलावा, यह तुरंत स्पष्ट नहीं है अगर s.ix[:5] जैसे कुछ को समान उप-वर्ग वापस करना चाहिए। यह आपके उप-वर्ग के अर्थशास्त्र पर निर्भर करेगा और इसके साथ मेटाडेटा क्या जुड़ा हुआ है।

http://nbviewer.ipython.org/3366583/subclassing%20pandas%20objects.ipynb में कुछ नोट्स हैं।

+0

यह काम करता है! लेकिन आप सही हैं ... शायद यह सबक्लास लागू करने का सबसे अच्छा विकल्प नहीं था! बहुत बहुत धन्यवाद !!! – Francesco

2

Support()Series ऑब्जेक्ट देता है।

सीरीज और DataFrame की उपवर्गीकरण पर यह भी देखें: https://github.com/pydata/pandas/issues/60

In [16]: class MyDict(dict): 
    ....:  pass 
    ....: 

In [17]: md = MyDict() 

In [18]: type(md) 
Out[18]: __main__.MyDict 

In [21]: class MySeries(Series): 
    ....:  pass 
    ....: 

In [22]: ms = MySeries() 

In [23]: type(ms) 
Out[23]: pandas.core.series.Series