code: def operation(self, other, function, **kwargs):
          
          result = TimeSeries(**kwargs)
          if isinstance(other, TimeSeries):
              for time, value in self:
                  result[time] = function(value, other[time])
              for time, value in other:
                  result[time] = function(self[time], value)
          else:
              for time, value in self:
                  result[time] = function(value, other)
          return result
docs: Calculate "elementwise" operation either between this TimeSeries
          and another one, i.e.
  
          operation(t) = function(self(t), other(t))
  
          or between this timeseries and a constant:
  
          operation(t) = function(self(t), other)
  
          If it's another time series, the measurement times in the
          resulting TimeSeries will be the union of the sets of
          measurement times of the input time series. If it's a
          constant, the measurement times will not change.