docs: def timeseries(self):
          """
          Feed-in time series of generator
  
          It returns the actual time series used in power flow analysis. If
          :attr:`_timeseries` is not :obj:`None`, it is returned. Otherwise,
          :meth:`timeseries` looks for generation and curtailment time series
          of the according type of technology (and weather cell) in
          :class:`~.grid.network.TimeSeries`.
  
          Returns
          -------
          :pandas:`pandas.DataFrame<dataframe>`
              DataFrame containing active power in kW in column 'p' and
              reactive power in kVA in column 'q'.
  
          """
          if self._timeseries is None:
  
              # get time series for active power depending on if they are
              # differentiated by weather cell ID or not
              if isinstance(self.grid.network.timeseries.generation_fluctuating.
                                    columns, pd.MultiIndex):
                  if self.weather_cell_id:
                      try:
                          timeseries = self.grid.network.timeseries.\
                              generation_fluctuating[
                              self.type, self.weather_cell_id].to_frame('p')
                      except KeyError:
                          logger.exception("No time series for type {} and "
                                           "weather cell ID {} given.".format(
                              self.type, self.weather_cell_id))
                          raise
                  else:
                      logger.exception("No weather cell ID provided for "
                                       "fluctuating generator {}.".format(
                          repr(self)))
                      raise KeyError
              else:
                  try:
                      timeseries = self.grid.network.timeseries.\
                          generation_fluctuating[self.type].to_frame('p')
                  except KeyError:
                      logger.exception("No time series for type {} "
                                       "given.".format(self.type))
                      raise
  
              timeseries = timeseries * self.nominal_capacity
  
              # subtract curtailment
              if self.curtailment is not None:
                  timeseries = timeseries.join(
                      self.curtailment.to_frame('curtailment'), how='left')
                  timeseries.p = timeseries.p - timeseries.curtailment.fillna(0)
  
              if self.timeseries_reactive is not None:
                  timeseries['q'] = self.timeseries_reactive
              else:
                  timeseries['q'] = timeseries['p'] * self.q_sign * tan(acos(
                      self.power_factor))
  
              return timeseries
          else:
              return self._timeseries.loc[
                     self.grid.network.timeseries.timeindex, :]