Правильный способ расширить класс Python - PullRequest
0 голосов
/ 29 июня 2018

Я хочу расширить DataFrame Panda, создавая объект, в котором все оригинальные атрибуты / методы DataFrame находятся в такте, и в то же время делаю доступными несколько новых атрибутов / методов. Мне также нужна возможность конвертировать (или копировать) объекты, которые уже являются DataFrames, в мой новый класс. То, что у меня есть, похоже, работает, но я чувствую, что мог нарушить какое-то фундаментальное соглашение. Это правильный способ сделать это, или я вообще должен это делать?

import pandas as pd

class DataFrame(pd.DataFrame):
    def __init__(self, df):
        df.__class__ = DataFrame # effectively 'cast' Pandas DataFrame as my own

идея состоит в том, что я мог бы затем инициализировать его непосредственно из Pandas DataFrame, например ::10000

df = DataFrame(pd.read_csv(path))

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Если вы просто хотите добавить методы к DataFrame просто обезьяньему патчу, прежде чем запускать что-либо еще, как показано ниже.

>>> import pandas                                
>>> def foo(self, x):                            
...     return x                                 
...                                              
>>> foo                                          
<function foo at 0x00000000009FCC80>             
>>> pandas.DataFrame.foo = foo                   
>>> bar = pandas.DataFrame()                     
>>> bar                                          
Empty DataFrame                                  
Columns: []                                      
Index: []                                        
>>> bar.foo(5)                                   
5                                                
>>>
0 голосов
/ 29 июня 2018

Я бы, наверное, сделал бы это так, если бы мне пришлось:

import pandas as pd

class CustomDataFrame(pd.DataFrame):
    @classmethod
    def convert_dataframe(cls, df):
        df.__class__ = cls
        return df

    def foo(self):
        return "Works"


df = pd.DataFrame([1,2,3])
print(df)
#print(df.foo())    # Will throw, since .foo() is not defined on pd.DataFrame

cdf = CustomDataFrame.convert_dataframe(df)
print(cdf)
print(cdf.foo())    # "Works"

Примечание. Это навсегда изменит передаваемый вами объект df на convert_dataframe:

print(type(df))     # <class '__main__.CustomDataFrame'>
print(type(cdf))    # <class '__main__.CustomDataFrame'>

Если вы не хотите этого, вы можете скопировать фрейм данных внутри метода класса.

0 голосов
/ 29 июня 2018
if __name__ == '__main__':
    app = DataFrame()
    app()

событие

super(DataFrame,self).__init__()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...