2012-08-16 37 views
5

tôi đang cố gắng để tạo ra một lớp con của một cấu trúc dữ liệu Panda để thay thế, trong mã của tôi, một lớp con của một dict với một lớp con của một Series, tôi không hiểu tại sao mã ví dụ này không hoạt độngcác lớp con của đối tượng gấu trúc hoạt động khác với lớp con của đối tượng khác?

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() 

có lẽ nó không phải là phương pháp tốt nhất để thay đổi cấu hình của một số đối tượng, dù sao tôi thấy hữu ích này trong mã của tôi và hầu hết tất cả tôi muốn hiểu lý do tại sao với dict thay vì loạt nó hoạt động như tôi mong đợi.

Cảm ơn rất nhiều!

Trả lời

10

Current trả lời (Pandas> = 0,13)

Một cấu trúc lại nội bộ trong Pandas 0.13 subclassing đơn giản hóa đáng kể. Gấu trúc Series bây giờ có thể được subclassed giống như bất kỳ đối tượng Python khác:

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

Legacy trả lời (gấu trúc < = 0,12)

Vấn đề là dòng sử dụng __new__ mà là đảm bảo rằng một đối tượng Series được khởi tạo.

Bạn có thể thay đổi lớp học của bạn như sau:

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' 

Tuy nhiên, nó có thể là tốt nhất để làm một có-một thay vì một là-a. Hoặc khỉ vá đối tượng Series. Lý do là bạn sẽ thường xuyên mất lớp con của bạn trong khi sử dụng gấu trúc do bản chất của lưu trữ dữ liệu của nó. Một cái gì đó đơn giản như

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

Sẽ trả về một đối tượng Series thay vì lớp con của bạn. Bên trong, dữ liệu được lưu trữ trong các mảng tiếp giáp và được tối ưu hóa cho tốc độ. Dữ liệu chỉ được đóng hộp với một lớp khi cần thiết và các lớp đó được mã hóa cứng. Thêm vào đó, nó không phải là ngay lập tức rõ ràng nếu một cái gì đó như s.ix[:5] nên trả lại cùng một lớp con. Điều đó sẽ phụ thuộc vào ngữ nghĩa của lớp con của bạn và siêu dữ liệu nào được gắn vào nó.

http://nbviewer.ipython.org/3366583/subclassing%20pandas%20objects.ipynb có một số ghi chú.

+0

Nó hoạt động! Nhưng bạn đúng ... có lẽ nó không phải là lựa chọn tốt nhất để thực hiện một phân lớp! Cảm ơn rất nhiều !!! – Francesco

2

Support() trả về đối tượng Series.

On subclassing của Series và DataFrame also see: 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 
Các vấn đề liên quan