2017-09-20 2 views
1

Ich möchte neue Methoden und Attribute zu Pandas Series und DataFrames hinzufügen. Hier ist sehr einfaches Beispiel: Ich möchte eine Methode, die die Anzahl der Zeit zählt der Unterschied zwischen einer Reihe und der vorherige ist nicht 1.Python pandas: Unterklasse-Serie und Datenrahmen

Hier ist, was ich hatte bisher von Unter classing die Pandas Objekte:

import pandas as pd 

class Serie(pd.Series): 

    def gaps(self): 
     return (self.diff().fillna(1) != 1).sum() 

class DataSet(pd.DataFrame): 

    _constructor_sliced = Serie 

Aber basierend auf this answer scheint es, dass ich diese stattdessen tun:

def gaps(self): 
    return (self.diff().fillna(1) != 1).sum() 

pd.Series.gaps = gaps 

es scheint ebenso gut zu funktionieren!

In[1]: df = pd.DataFrame({'A':[1,2,4], 'B':[3,2,1]}) 
In[2]: df.A.gaps() 
Out[2]: 1 

Jetzt die Frage: Was ist die beste Praxis für solche Situationen? Die zweite Option scheint viel einfacher zu sein als das Unterklassifizieren, aber ich vermisse etwas ... Gibt es Vorbehalte, dies zu tun? Oder vielleicht gibt es andere Möglichkeiten, die ich vermisst habe.

Antwort

0

Eine sehr einfache Lösung wäre sein nur eine Funktion wie Ihre gaps Funktion zu verwenden, aber „selbst“ zu „serie“ Umbenennen:

def gaps(serie): 
    return (serie.diff().fillna(1) != 1).sum() 

Es Bedenken hält sauber getrennt (Code vs Pandas Code).

Es ist lesbarer: Sie müssen nicht viele Dinge verstehen, um zu verstehen, wie es funktioniert. Es ist einfach.

Es ist weniger überraschend: Ein Entwickler in Ihrem Team könnte einige Zeit damit verbringen, nach der gap() Dokumentation in der Dokumentation der Pandas Serie zu suchen und sie nicht zu finden, nur um ein paar Stunden später zu entdecken, dass jemand (Sie) Affe es geflickt hat .

Es ist auch die kürzeste Lösung.

Es vermeidet die Verwendung "privater" Mitglieder wie _constructor_sliced, deren Name sich in der Zukunft ändern und Ihre Implementierung brechen kann.

Es vermeidet zukünftige Konflikte: Was ist mit der nächsten Veröffentlichung von Pandas eine Lücke Methode in der Serie Objekt? Es wird nicht direkt kaputt gehen, aber ich werde einen Entwickler in dein Team beißen, der das "jetzt wohlbekannte .gap()" benutzen will, ohne zu wissen, dass du es "geändert hast" und dass es harte Zeiten gibt, warum es nicht funktioniert arbeite nach der Dokumentation.