Как я могу заставить средний метод Panda работать с пользовательскими типами

#python #pandas #dataframe

#питон #панды #фрейм данных #python #pandas

Вопрос:

Я пытаюсь создать «числовой» класс (назовем его MyType ), для которого полностью работает Panda mean .

Мой текущий подход реализован MyType как подкласс numbers.Rational .

 class MyType(numbers.Rational):
   ...
  

Это позволило statistics модулю Python работать без каких-либо проблем.

 from statistics import mean
result = mean([MyType(1), MyType(2)])
assert isinstance(result, MyType) #passes
  

К сожалению, аналогичный код в Pandas возвращает значение с плавающей точкой вместо экземпляра MyType .

 result = pd.Series([MyType(1),MyType(2)]).mean()
assert isinstance(result, MyType) #fails
assert isinstance(result, float) #passes
  

При пошаговом просмотре внутреннего кода Panda появляется, что MyType преобразуется в значение с плавающей точкой в nanmean методе nanops модуля (источника) с помощью _ensure_numeric метода в строке 563. Я не смог найти способ обойти это.

Что я пробовал:

  1. MyType подкласс numbers.Real — все вычисления верны, но тип неверен
  2. MyType подкласс float — все вычисления верны, но тип неверен
  3. MyType подкласс ExtensionDtype — похоже, ничего не делал, насколько я мог судить

Комментарии:

1. cyberpandas Библиотека реализовала нечто подобное для IP-адресов github.com/ContinuumIO/cyberpandas/blob/master/cyberpandas /…

2. @jakub Да, я просмотрел их библиотеку. Они используют ExtensionDtypes , но их IP-адрес не является числовым типом, поэтому они никогда не пытаются протестировать какой-либо из статистических методов, насколько я могу судить. Ни один из готовых методов Panda ExtensionDtypes также не является числовым.