У меня реализован класс Serie
для представления серии данных и их тега. Когда я добавляю Serie
объекты, а также числа, я получаю ожидаемый результат. Однако, когда я объединяю одни и те же элементы в списке, я получаю следующее сообщение об ошибке:
TypeError: неподдерживаемые типы операндов для +: 'int' и 'Serie'
Пример кода игрушки
В качестве примера кода игрушки, чтобы понять проблему, которую мы можем использовать:
import pandas as pd
import numpy as np
class Serie(object):
def __str__(self):
s = "> SERIE " + str(self.tag) + ": \n"
s += str(self.data)
return s
def __init__(self, tag=None, data=pd.DataFrame()):
"""
Creates object Serie
@type tag: str
@param tag: Tag for the Serie
"""
self.tag = tag
self.data = data
def __add__(self, other):
if isinstance(other, int) or isinstance(other, float):
tag = str(other) + "+" + self.tag
serie = Serie(tag)
serie.data = self.data + other
else:
try:
tag = self.tag + "+" + other.tag
except:
print ("ERROR: You can't add to somehing that is not a Serie or a number." )
return None
serie = Serie(tag)
serie.data = self.data + other.data
return serie
s1 = Serie("fibonacci",pd.Series([1,1,2,3,5,8]))
s2 = Serie("2power",pd.Series(np.linspace(1,6,6)**2))
s3 = 10
sumSerie = s1+s2+s3
print sumSerie
Это печатает результат как ожидалось:
>>>
> SERIE 10+fibonacci+2power:
0 12.0
1 15.0
2 21.0
3 29.0
4 40.0
5 54.0
dtype: float64
Ошибка при использовании суммы объектов в списке
Однако, когда я запускаю следующие строки:
l = [s1,s2,s3]
sum(l)
Я получаю сообщение об ошибке:
сумма (л)
Ошибка типа: неподдерживаемые типы операндов для +: 'int' и 'Serie'
И то же сообщение об ошибке отображается при запуске:
l2 = [s1,s2]
sum(l2)
Но в списке l2
нет переменной int
.
Вопросы
Почему отображается это сообщение об ошибке? Это сбивает с толку, так как я смог суммировать объекты за пределами списка.
Есть ли что-то, что я могу сделать, чтобы добиться выполнения суммы объектов в списке?
EDIT
Как предлагается в комментариях, я добавил __radd__
, чтобы корректно перегрузить метод add. Поэтому я добавил следующие строки в класс Serie
:
def __radd__(self,other):
return self.__add__(other)
Тогда сумма работает. Но не так, как ожидалось.
Если я запускаю следующий код:
>>> print sum(l)
Я получаю этот вывод:
> SERIE 10+0+fibonacci+2power:
0 12.0
1 15.0
2 21.0
3 29.0
4 40.0
5 54.0
dtype: float64
Что, безусловно, не то, что я ожидал. В теге есть +0
extra. Как это может быть? Однако, если я использую опцию, которую я указал в своем ответе print np.array(l).sum()
, результат будет правильным.
РЕДАКТИРОВАТЬ 2
После корректной перегрузки метода сложения мне предложили использовать метод ниже для выполнения суммы, как ожидалось:
reduce(lambda a, b: a+b, l)
Этот подход работал, чтобы иметь возможность использовать функцию sum
для списка и получить правильный результат.
Как указано pault в комментариях к sum
метод "start default on 0", как подробно описано в документации функции sum . Вот почему дополнительный тег +0
был добавлен в тег ранее.
В заключение, я считаю, что я бы предпочел использовать опцию, используя вместо этого функцию numpy.sum
:
np.array(l).sum()