¿Pandas DataFrame Object Herencia o uso de objetos?

Estoy construyendo una biblioteca para trabajar con datos estructurados muy específicos y estoy construyendo mi infraestructura sobre Pandas. Actualmente estoy escribiendo un montón de diferentes contenedores de datos para diferentes casos de uso, como CTMatrix para Country x Time Data, etc. para alojar los métodos adecuados para todos los datos estructurados de CountryxTime.

Actualmente estoy debatiendo entre

Opción 1: Herencia de objetos

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

u Opción 2: Uso de objetos

 class CTMatrix(object): _data = pd.DataFrame then use getter, setter methods to control access to _data etc. 

Desde la perspectiva de la ingeniería de software, ¿hay una opción obvia aquí?

Mis pensamientos hasta ahora son:

Opción 1:

  1. Puede usar los métodos DataFrame directamente en la Clase CTMatrix (como CTmatrix.sort() ) sin tener que CTmatrix.sort() a través de los métodos en el objeto de _data encapsulados en la Opción # 2
  2. Las actualizaciones y los nuevos métodos en Pandas se heredan, excepto los métodos que se pueden sobrescribir con métodos de clase locales

PERO

  1. Complicaciones con algunos métodos como __init__() y tener que pasar los atributos a la superclase super(MyDF, self).__init__(*args, **kw)

Opcion 2:

  1. Más control sobre la Clase y su comportamiento.
  2. ¿Posiblemente más resistente a las actualizaciones en Pandas?

Pero

  1. Tener que usar un atributo getter () o no oculto para usar el objeto como un dataframe como ( CTMatrix.data.sort() )

¿Hay desventajas adicionales para tomar el enfoque en la Opción # 1?

DataFrame subclases de DataFrame , ya que muchos de los métodos de DataFrame devolverán un nuevo DataFrame y no otra instancia de su objeto CTMatrix .

Hay algunos problemas abiertos en GitHub sobre esto, por ejemplo:

Más en general, esta es una cuestión de composición vs herencia. Yo sería especialmente cuidadoso con el beneficio # 2. Puede parecer genial ahora, pero a menos que esté atento a las actualizaciones de Pandas (y es un objective que se mueve rápido), puede terminar fácilmente con consecuencias inesperadas y su código terminará entrelazado con Pandas.

Debido a problemas similares y la respuesta de Matti John, escribí una clase de _pandas_wrapper para un proyecto mío, porque también quería heredar de Data Frame de pandas.

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

El único propósito de esta clase es dar un aspecto de DataFrame de pandas que sea seguro heredar de.

Si su proyecto tiene licencia LGPL, puede reutilizarlo sin problemas.