2014-07-01 8 views
8

Ich baue eine Bibliothek für die Arbeit mit sehr spezifischen strukturierten Daten und baue meine Infrastruktur auf Pandas. Momentan schreibe ich eine Reihe von verschiedenen Datencontainern für verschiedene Anwendungsfälle, wie CTMatrix für Land x Zeitdaten usw., um Methoden zu integrieren, die für alle strukturierten Daten von CountryxTime geeignet sind.Pandas DataFrame Objektvererbung oder Objektverwendung?

ich zur Zeit debattiert zwischen

Option 1: Objektvererbung

class CTMatrix(pd.DataFrame): 
    methods etc. here 

oder Option 2: Objekt

class CTMatrix(object): 
    _data = pd.DataFrame 

    then use getter, setter methods to control access to _data etc. 

Von einem Software-Engineering-Perspektive verwenden wird ein offensichtliche Wahl hier?

Meine Gedanken sind so weit:

Option 1:

  1. Datenrahmen Methoden direkt auf der CTMatrix Klasse (wie CTmatrix.sort()), ohne sie über Methoden auf dem eingekapselten _data Objekt verwenden kann, um Unterstützung in Option # 2
  2. Updates und neue Methoden in Pandas werden vererbt, außer für Methoden, die mit lokalen Klassenmethoden überschrieben werden können

BUT

  1. Komplikationen bei einigen Methoden wie __init__() ist und die Attribute verzichten auf die übergeordnete Klasse super(MyDF, self).__init__(*args, **kw)

Option 2:

  1. mehr Kontrolle über das Klasse und ihr Verhalten
  2. Vielleicht widerstandsfähiger gegen Updates in Pandas?

Aber

  1. Mit einem Getter() oder nicht verborgen Attribut verwenden, um das Objekt wie ein Datenrahmen wie (CTMatrix.data.sort())

zu verwenden Gibt es zusätzliche Nachteile für die Aufnahme der Ansatz in Option # 1?

+0

Wahrscheinlich besser geeignet für http://codereview.stackexchange.com/ – EdChum

Antwort

5

ich Subklassifizieren vermeiden würde DataFrame, weil viele der DataFrame Methoden eine neue DataFrame und nicht eine andere Instanz Ihres CTMatrix Objekt zurück.

Es gibt ein paar offene Probleme auf GitHub um dieses z.:

Generell ist dies eine Frage der Zusammensetzung vs Vererbung. Ich würde besonders auf Vorteil # 2 achten. Es mag jetzt großartig erscheinen, aber solange du nicht die Updates für Pandas im Auge behältst (und es ist ein sich schnell bewegendes Ziel), kannst du leicht mit unerwarteten Konsequenzen enden und dein Code wird schließlich mit Pandas verflochten.

0

Wegen ähnlicher Probleme und Matti Johns Antwort schrieb ich eine _pandas_wrapper Klasse für ein Projekt von mir, weil ich auch von Pandas Dataframe erben wollte.

https://github.com/mcocdawc/chemcoord/blob/bdfc186f54926ef356d0b4830959c51bb92d5583/src/chemcoord/_generic_classes/_pandas_wrapper.py

Der einzige Zweck dieser Klasse ist eine Pandas Dataframe Doppelgänger zu geben, die sicher von erben.

Wenn Ihr Projekt LGPL lizenziert ist, können Sie es problemlos wiederverwenden.

+0

Der Link ist tot, nicht die Mühe zu klicken. –

+0

Entschuldigung für die Unannehmlichkeiten. Es zeigt jetzt auf einen bestimmten Snapshot anstelle der Verzweigung. – mcocdawc