Создать подкласс dataframe с множественным наследованием - PullRequest
0 голосов
/ 25 сентября 2019

Привет! Я бы хотел создать подкласс для фрейма данных pandas, но подкласс этого фрейма также будет наследовать от моего собственного пользовательского класса.Я хочу сделать это, потому что я хотел бы создать несколько подклассов данных, а также другие подклассы (которые не являются фреймами данных), которые будут иметь общие свойства и методы этого базового класса.

Для начала мой базовый класс:

class thing(object):
   def __init__(self, item_location, name):
      self.name = name
      self.file = item_location
      self.directory = os.path.join(*item_location.split(os.path.sep)[0:-1])
   @property
   def name(self):
       return self._name
   @name.setter
   def name(self,val):
       self._name = val

   @property
   def file(self):
       return self._file
   @file.setter
   def file(self,val):
       self._location = val

   @property
   def directory(self):
      return self._directory
   @directory.setter
   def directory(self,val):
      self._directory = val

А теперь один из моих подклассов, который унаследует от панд и прочего

class custom_dataframe(thing,pd.DataFrame):
   def __init__(self, *args, **kwargs):
      super(custom_dataframe,self).__init__(*args,**kwargs)

   @property
   def _constructor(self):
      return custom_dataframe

Я просто пытаюсь сделать пробелфрейм данных, и только дать ему имя расположение файла

custom_dataframe('/foobar/foobar/foobar.html','name')

, и я получаю сообщение об ошибке

(я не могу опубликовать всю трассировку стека как ее на компьютере, которыйне подключен к интернету)

File "<stdin>", line 1, in <module>
File "<path to file with classes>", line x, in __init__
  self.name = name
<a bunch of stuff going through pandas library>
File "<path to pandas generic.py>", line 4372, in __getattr__
  return object.__getattribute__(self,name)
RecursionError: maximum recursion depth exceeded while calling a Python object

Я использую панды 0.23.4

edit:

изменено item_location.split(os.pathsep)[0:-1] на *item_location.split(os.path.sep)[0:-1]

1 Ответ

0 голосов
/ 25 сентября 2019

Вы заявили в разделе комментариев I've read that.Однако вы этого не сделали.Это источник проблемы.Поскольку that описывает шаги по созданию подкласса pandas dataframe, включая способы определения исходных свойств.

Рассмотрите следующую модификацию вашего кода.Ключевая часть - _metadata.Я удалил все свойства из класса thing, потому что они увеличивают количество оригинальных имен атрибутов - все они должны быть добавлены в _metadata.Также я добавил __repr__ метод для исправления другого RecursionError.Наконец, я удалил атрибут directory, поскольку он дает мне TypeError.

import pandas as pd

class thing(object):

    def __init__(self, item_location, name):
        self.name = name
        self.file = item_location

    def __repr__(self):
        return 'dummy_repr'

class custom_dataframe(thing, pd.DataFrame):

    _metadata = ['name', 'file', 'directory']

    def __init__(self, *args, **kwargs):
        super(custom_dataframe, self).__init__(*args, **kwargs)

    @property
    def _constructor(self):
        return custom_dataframe

if __name__ == '__main__':
    cd = custom_dataframe('/foobar/foobar/foobar.html', 'name')

EDIT .Немного улучшенная версия - довольно плохая реализация.

import pandas as pd

class thing:

    _metadata = ['name', 'file']

    def __init__(self, item_location, name):
        self.name = name
        self.file = item_location

class custom_dataframe(thing, pd.DataFrame):

    def __init__(self, *args, **kwargs):
        item_location = kwargs.pop('item_location', None)
        name = kwargs.pop('name', None)
        thing.__init__(self, item_location, name)
        pd.DataFrame.__init__(self, *args, **kwargs)

    @property
    def _constructor(self):
        return custom_dataframe

if __name__ == '__main__':

    cd = custom_dataframe(
        {1: [1, 2, 3], 2: [1, 2, 3]},
        item_location='/foobar/foobar/foobar.html',
        name='name')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...