#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. Я не смог найти способ обойти это.
Что я пробовал:
MyType
подклассnumbers.Real
— все вычисления верны, но тип неверенMyType
подклассfloat
— все вычисления верны, но тип неверенMyType
подклассExtensionDtype
— похоже, ничего не делал, насколько я мог судить
Комментарии:
1.
cyberpandas
Библиотека реализовала нечто подобное для IP-адресов github.com/ContinuumIO/cyberpandas/blob/master/cyberpandas /…2. @jakub Да, я просмотрел их библиотеку. Они используют
ExtensionDtypes
, но их IP-адрес не является числовым типом, поэтому они никогда не пытаются протестировать какой-либо из статистических методов, насколько я могу судить. Ни один из готовых методов PandaExtensionDtypes
также не является числовым.